Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中屏蔽对象的轮廓_Python_Opencv_Image Processing_Numpy_Python Imaging Library - Fatal编程技术网

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

如何在python中屏蔽对象的轮廓,python,opencv,image-processing,numpy,python-imaging-library,Python,Opencv,Image Processing,Numpy,Python Imaging Library,如何在图像中遮罩对象,例如通过勾勒对象的形状或存储作为对象一部分的所有像素的数组索引?由于我将只在对象所在的区域进行其他进一步处理,因此我希望“摆脱”背景/忽略背景,只关注对象本身 这两个图像(对象是一个金属球和一个光散射球)与我将要处理的类似。我将尝试提高物体和背景之间的对比度,并在拍摄更多图像时制作支撑物体的“支架”,但对于这里给出的图像,有没有办法遮罩物体 最初,我想对图像设置阈值,以便保留比某个值“更亮”的像素,然后使用numpy.nonzero(threshold_image)查找作为

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

这两个图像(对象是一个金属球和一个光散射球)与我将要处理的类似。我将尝试提高物体和背景之间的对比度,并在拍摄更多图像时制作支撑物体的“支架”,但对于这里给出的图像,有没有办法遮罩物体

最初,我想对图像设置阈值,以便保留比某个值“更亮”的像素,然后使用numpy.nonzero(threshold_image)查找作为图像一部分的像素的所有索引。然而,我发现它不适合这种“嘈杂”的图像

谢谢


理论上可以使用存储阵列掩码,但我不建议使用它(从性能上看,它相当慢,我稍后会用计时编辑我的帖子)

最具python风格的方法(因此最酷)就是存储一个与image大小相同的普通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图像,但只要遮罩形状与图像相同,它就可以在任何维度上工作

至于图像的分离,我不知道你对图像处理技术有多熟悉,但一般来说,在你发现噪声令人烦恼的情况下,在其他任何事情之前稍微模糊一下你的图像通常是有效的,因为在小面积上的隐含平均意味着噪声(尖峰)是平滑的

关于在Ndarray上迭代的旁注: 您可能不想在
np.nonzero()
输出上迭代,因为它将给您提供的像素位置可能未排序,这意味着您将访问图像中的随机位置,而不是访问连续(彼此紧跟)地址,这是一种常见的“内存访问最坏情况”,会降低执行速度


对于二值图像处理,如移除遮罩中的一小群孤立像素,请务必查看

存储阵列遮罩理论上可以使用,但我不建议使用它(从性能角度看,它相当慢,稍后我将使用计时编辑我的帖子)

最具python风格的方法(因此最酷)就是存储一个与image大小相同的普通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图像,但只要遮罩形状与图像相同,它就可以在任何维度上工作

至于图像的分离,我不知道你对图像处理技术有多熟悉,但一般来说,在你发现噪声令人烦恼的情况下,在其他任何事情之前稍微模糊一下你的图像通常是有效的,因为在小面积上的隐含平均意味着噪声(尖峰)是平滑的

关于在Ndarray上迭代的旁注: 您可能不想在
np.nonzero()
输出上迭代,因为它将给您提供的像素位置可能未排序,这意味着您将访问图像中的随机位置,而不是访问连续(彼此紧跟)地址,这是一种常见的“内存访问最坏情况”,会降低执行速度


对于二值图像处理,如移除遮罩中的小孤立像素组,请务必查看

您可以从折叠每个颜色通道(r、g、b)开始在绿色通道中,下部图像中的对象应该是可分离的,对于顶部图像,即使只是亮度也可以很好地完成初始工作

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

最后,您可以根据大小/形状选择最佳组件


如果所有对象都是圆,则可以从按形状检测开始,这意味着要进行边缘检测,然后可以从对每个颜色通道(r、g、b)进行树折叠开始在绿色通道中,下部图像中的对象应该是可分离的,对于顶部图像,即使只是亮度也可以很好地完成初始工作

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

最后,您可以根据大小/形状选择最佳组件


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

发布你迄今为止尝试过的代码,以及你不喜欢的代码或结果。发布你迄今为止尝试过的代码,以及你不喜欢的代码或结果。