【问题标题】:how to mask the outline of an object in python如何在python中掩盖对象的轮廓
【发布时间】:2015-07-31 19:23:43
【问题描述】:

如何掩盖图像中的对象,例如通过概述对象的形状或存储作为对象一部分的所有像素的数组索引?由于我只会在有对象的区域中进行其他进一步处理,因此我想“摆脱”/忽略背景,只关注对象本身。

这两个图像(物体是金属球和光散射球)与我将要处理的图像相似。我会尝试改善物体和背景之间的对比度,并在我拍摄更多图像时使用支撑物体的支撑“支架”,但是对于这里给出的图像,有什么方法可以掩盖物体吗?

最初,我想对图像进行阈值处理,以便保留比某个值“更亮”的像素,然后使用 numpy.nonzero(threshold_image) 找出属于部分像素的所有索引图片。但是,我发现它不适用于这种“嘈杂”的图像。

谢谢

【问题讨论】:

  • 发布您迄今为止尝试过的代码,以及您不喜欢它的哪些地方或它的结果。

标签: python opencv image-processing numpy python-imaging-library


【解决方案1】:

理论上可以使用Numpy's masked arrays 来为数组存储掩码,但我不建议这样做(从性能方面来说它很慢,稍后我会根据时间编辑我的帖子)

最 Pythonic 的方式(因此最酷)只是存储一个与图像大小相同的普通 bool 数组,并使用 * 运算符组合它(因为数字乘以 False 变为 0,但 NaN

# creates an array of bool of same shape as image
maskAboveThreshold = image > 30 

# Show a 'cropped' version on the image
from matplotlib import pyplot as plt
plt.imshow(image * maskAboveThreshold, cmap='gray')

请注意,我在这里假设 image 是灰度的 2D 图像,但只要您的蒙版形状与图像相同,它就可以在任何维度上工作。

关于图像的分离,我不知道你对图像处理技术有多熟悉,但一般来说,在你觉得噪点很烦人的情况下,先把图像模糊一点通常是有效的,因为在小区域上的隐含平均意味着噪声(尖峰)被平滑了。

关于迭代 ndarrays 的旁注: 您可能不想遍历 np.nonzero() 输出,因为它给您的像素位置可能是未排序的,这意味着您最终将访问图像中的随机位置,而不是访问连续(彼此跟随)地址,这是常见的“内存访问最坏情况”会减慢执行速度。

对于二值图像处理,例如删除掩码中的小孤立像素组,请查看Binary Morphology

【讨论】:

    【解决方案2】:

    您可以从对输入图像的每个颜色通道 (r,g,b) 进行阈值处理开始。下方图像中的对象在绿色通道中应该是可分离的,对于顶部图像,即使只是亮度也可以很好地完成初始工作。

    第二步是 labeling connected components 在掩码中,可能使用上面链接中的函数。

    最后,您可以按尺寸/形状选择最佳组件。

    如果你所有的对象都是圆形,你可以从形状检测开始——这意味着做边缘检测,然后Hough Transfrom

    【讨论】:

      猜你喜欢
      • 2012-04-05
      • 2020-01-01
      • 2016-09-25
      • 2021-01-23
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多