python - 如何在python中屏蔽对象的轮廓

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

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

这两个图像(对象是一个金属球和一个光散射球)与我将要处理的相似。我会尝试提高物体和背景之间的对比度,并在我拍摄更多图像时处理支撑物体的支撑“支架”,但是对于这里给出的图像,是否有任何方法可以遮盖物体?

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

谢谢

metal ball scattering ball

最佳答案

存储数组的掩码理论上可以用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

关于python - 如何在python中屏蔽对象的轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30334552/

相关文章:

python - 将条目添加到 SQLAlchemy 数据库触发器 `sqlite InterfaceError: Error binding parameter 0 - probably unsupported type`

opencv - 需要消除相机镜头变形

Python:标准化图像曝光

python - 如何在OpenCV中区分实心圆/轮廓和未实心圆/轮廓?

python - 如何计算2个红色像素之间的距离

image - RGB 图像中的噪声去除 MATLAB

python - django 形式的动态表

python - Aerospike docker 连接被拒绝使用 docker 服务名

python - 在 Python 中将类属性作为该类函数的参数传递

python - 将颜色应用于渐变方向