计算图像中遮罩的像素方差

时间:2020-09-18 11:11:46

标签: python numpy image-processing

我试图统计分析眼睛图像。我的椭圆形覆盖了整个眼睛区域。

这是我的原始图片:

enter image description here

这是以椭圆形式生成的蒙版:

enter image description here

我发现这个link暗示了协方差的计算,但是我无法真正掌握如何使用numpy的ma模块,而且它的方差也不大。 https://www.nbshare.io/notebook/160784578/How-To-Handle-nan-In-Numpy/

这是我正在尝试的当前代码:

img = 'path'
img = Image.fromarray(img)
img_PIL = img

    h_1 = 13
    k_1 = 23.5
    a_1 = 3
    b_1 = 5
    
   def _in_ellipse_sub_mask(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_mask = np.vectorize(_in_ellipse_iris)
    img = np.asarray(img)
    
    mask_ = _in_ellipse_sub_mask(*np.indices(img.shape), h_1,k_1,a_1,b_1)
    
    plt.imshow(mask_ )
    plt.show()

mask_var = np.nanvar(np.where(sub_mask_, img, np.nan), dtype=np.float64, out=None, ddof=1)

输出:

0.04677148697358601

我原本以为会超过100个,但是我想这不是计算蒙版方差的正确方法,因为蒙版可以使用布尔值,所以不会给我合适的结果

1 个答案:

答案 0 :(得分:1)

您的img是一个矩阵,其值在0到1之间(表示灰度级)。您希望该值为0-255。这就是为什么期望方差大于100的原因。因此,将img的值乘以nanvar()之前的255,或者仅将结果乘以255 ^ 2(缩放属性)。请注意,nanvar()在执行计算之前将矩阵展平为矢量,这是从矩阵中获取标量的方法。

对于ma子模块,掩码数组包含两部分:datamaskdata是实际的数据数组,mask是与data相同维的布尔矩阵,在您要忽略(屏蔽)的位置为1,在您关心的位置为0(未屏蔽的值)。 ma数学函数将忽略掩码值。