【问题标题】:Given a numpy array image, how can I remove colored pixels (R,G,B) != (0,0,0) that are surrounded by black pixels (R,G,B) = (0,0,0)?给定一个 numpy 数组图像,如何删除被黑色像素 (R,G,B) = (0,0,0) 包围的彩色像素 (R,G,B) != (0,0,0)?
【发布时间】:2018-01-10 13:49:00
【问题描述】:

我编写了一个方法,它拍摄一个人的相机图像,确定构成该人的像素,并将所有其他像素设置为 (0,0,0)。这张新图像显示了被黑色像素包围的人。

这些图像的形状为 (500,500,3),其中前 2 个维度构成图像的宽度和高度,3 代表通道 (R,G,B)。

接下来我想做的是消除噪音。有几个像素被错误地归类为属于该人。换句话说,这些是被黑色像素包围的像素。

如何去除这些有颜色但被黑色像素 (0,0,0) 包围的“孤立像素”?

【问题讨论】:

    标签: image opencv numpy computer-vision


    【解决方案1】:

    如果您想要没有 for 循环的解决方案,您可以使用具有 3 x 3 内核的卷积。

    内核应该类似于

    1 1 1
    1 0 1
    1 1 1
    

    或者您可以使用形态图像处理,“关闭”操作应该可以工作。也可能是“侵蚀”。

    Morphological Image Processing

    【讨论】:

      【解决方案2】:

      正如 Joe 建议的那样,我也会使用卷积,但使用不同的内核 np.ones((3,3))

      1 1 1
      1 1 1 
      1 1 1
      

      首先将数组转换为形状为 500X500 的布尔数组

      如:bool_arr = np.sum(arr, axis = -1)!=0,黑色像素将为False,所有其他像素将为True。 (有关更快的替代版本,请参阅 cmets)

      import scipy.signal
      conv_arr = scipy.signal.convolve2d(bool_arr, np.ones((3,3)), 'same')
      wrong_pixels = conv_arr == 1 # only one of the 9 pixels is colored
      pixels[wrong_pixels] = [0,0,0] # color all the wrong ones black
      

      【讨论】:

      • 使用bool_arr = np.sum(arr, axis = -1)==0,所有黑色像素都将是True。如果您想要该功能(并且更高效),请尝试bool_arr = np.logical_not(np.logical_or.accumulate(arr, axis = -1))
      • 谢谢,你确实是对的。不过我会保留我的版本,因为我认为它更容易阅读/理解并且怀疑性能是一个如此大的问题,因为数组非常小。
      • Joe 卷积的好处还在于您可以使用wrong_pixels = ~conv_arr.astype(bool),因为除0 之外的任何整数都将解析为True 而无需进行比较。快多了。您还将覆盖许多与彩色像素相邻的黑色像素。
      • @JürgMerlinSpaak convolve2d 中的最后一个参数应该是“相同的”。即使您希望它保持完整大小,这也会将数组减少到 (3,3),不是吗?
      • @megashigger "same" 是正确的参数。它告诉 convolve 返回一个与 in1 形状相同的数组。两个数组的顺序应该不同,先是bool_arr,然后是np.ones((3,3)),在编辑中改了
      猜你喜欢
      • 2020-12-24
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      相关资源
      最近更新 更多