查找图像中的零像素,而不计算非零值像素

时间:2018-01-25 01:25:11

标签: python numpy image-processing

我有一个非常大的图像,其中包含零像素的大区域和数据为零的像素区域。我想标记不在数据区域内的所有零像素(see image)。通常使用np.where(data == 0)可以工作,但这显然包括带数据的区域。我尝试过使用一种方法,我列出每个零像素并找到那些具有非零邻居但需要很长时间的方法。数据非常大,如果可能的话,我想找到一种快速的方法。我正在寻找的输出只是一个简单的掩码数组。

2 个答案:

答案 0 :(得分:1)

您可以使用scipy.ndimage.morphology.binary_dilation标记所有非零像素及其所有邻居:

>>> import numpy as np
>>> from scipy.ndimage import morphology
>>> 
>>> a = (np.random.random((10, 10)) < np.clip(np.exp(np.arange(-5, 5)), None, 0.8)).view(np.uint8)
>>> a
array([[1, 0, 0, 0, 1, 1, 1, 0, 1, 1],
       [0, 0, 0, 0, 0, 1, 0, 0, 1, 1],
       [0, 0, 0, 0, 0, 1, 1, 0, 1, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 0, 1],
       [0, 0, 0, 0, 1, 1, 0, 1, 1, 1],
       [0, 0, 0, 1, 0, 0, 0, 1, 1, 1],
       [0, 0, 0, 1, 0, 0, 0, 1, 0, 1],
       [0, 0, 0, 1, 0, 1, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0, 1, 1, 1, 0],
       [0, 0, 0, 0, 1, 1, 1, 0, 1, 1]], dtype=uint8)
>>> 
>>> mask = morphology.binary_dilation(a)
>>> mask.view(np.uint8)
array([[1, 1, 0, 1, 1, 1, 1, 1, 1, 1],
       [1, 0, 0, 0, 1, 1, 1, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 1]], dtype=uint8)

默认的“结构元素”(控制什么被认为是邻居)有四个邻居,但你也可以指定8或一些任意掩码。

答案 1 :(得分:0)

也许尝试使用3x3 square tophat内核对图像进行卷积。我使用scipy的ndimage卷积滤镜:

https://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.ndimage.filters.convolve.html

使用顶帽,已激活邻居的卷积图像中的任何像素都将为非零。任何没有活动邻居的像素都将为零。

您还可以尝试使用不同的内核以及对过滤器集的按位操作来确定最终的掩码。