首页 > 解决方案 > 使用 numpy 掩码相互减去图像省略号

问题描述

我正在尝试通过使用椭圆形掩码并取掩码内值的平均值来计算特定区域内的面积。像这样:

在此处输入图像描述

这是最初的眼睛图像:

在此处输入图像描述

我想做的是分别计算巩膜和虹膜的面积。我想要做的方式是通过生成蒙版,一个仅用于虹膜,第二个用于整个眼睛,第三个从整个眼部蒙版中减去虹膜蒙版以获得巩膜蒙版,其中第一个蒙版只是虹膜区域,第二个区域是整个眼睛,第三个区域是减法,这正是我想做的。通过减法分别得到巩膜的面积。

问题是我的掩码函数返回布尔值,这是我试图做的:

from PIL import Image 
  
img = Image.open(r'imgpath')  
  
 
h_1 = 16
k_1 = 31
a_1 = 7
b_1 = 17

#elipse function
def _in_ellipse(x, y, h, k, a, b):
    z = ((x-h)**2)/a**2 + ((y-k)**2)/b**2
    if z < 1:
        return True
    else:
        return False
    
in_ellipse = np.vectorize(_in_ellipse)
img = np.asarray(img)
mask = in_ellipse(*np.indices(img.shape), h_1,k_1,a_1,b_1)

#Visualize the mask size
plt.imshow(mask)
plt.show()


#See if its inside the boundaries
plt.imshow(np.where(mask, img, np.nan))
plt.show()

mask_mean = np.nanmean((np.where(mask, img, np.nan)))

我想做的是在计算平均值之前,我想单独获取巩膜的平均值,尝试是通过两个区域的减法,但是椭圆函数没有按预期返回像素值,它返回布尔值:

面具:

array([[False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       ...,
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False]])

标签: pythonnumpyimage-processing

解决方案


据我了解,要生成sclera_maskfromeye_maskiris_mask,它们都是布尔类型,您的减法思想转化为对两个掩码进行逻辑的、逐元素的 XOR 操作:

sclera_mask = np.logical_xor(eye_mask, iris_mask)

更多关于这个的文档:numpy.logical_xor


推荐阅读