我正在寻找一种使用OpenCV从二进制图像中去除孤立的白色像素的方法。类似的问题(OpenCV get rid of isolated pixels)有许多“答案”,但是没有一个对我有效。我已经尝试了各种打开和关闭的组合,但都没有成功。
这里的文章:
以下是代码:
什么是去除像这样孤立的像素的正确方法?
更新:Alexander的答案非常好用且速度最快。另一个答案也提供了一种解决方案,即使用cv2.connectedComponents函数,但它需要更多的处理器资源。以下是一个使用该方法的函数:
这里的文章:
https://homepages.inf.ed.ac.uk/rbf/HIPR2/hitmiss.htm
建议我可以使用hit-or-miss操作来实现这个目的:
1 用于在二值图像中定位孤立点。
原因是与直接使用腐蚀/膨胀时0的解释不同(在那里,0被解释为“不关心”,而不是“非白色”,这基本上是我想要的)。然而,使用此核心只会呈现原始图像。
我的输入图像是这样的:
你会注意到图像左侧有几个白色像素,我想摆脱它们。以下是代码:
kernel = np.array([ [0, 0, 0],
[0, 1, 0],
[0, 0, 0]],np.uint8)
hitormiss = cv2.morphologyEx(input_image, cv2.MORPH_HITMISS, kernel)
cv2.imshow('hitormiss', hitormiss)
什么是去除像这样孤立的像素的正确方法?
更新:Alexander的答案非常好用且速度最快。另一个答案也提供了一种解决方案,即使用cv2.connectedComponents函数,但它需要更多的处理器资源。以下是一个使用该方法的函数:
def remove_isolated_pixels(self, image):
connectivity = 8
output = cv2.connectedComponentsWithStats(image, connectivity, cv2.CV_32S)
num_stats = output[0]
labels = output[1]
stats = output[2]
new_image = image.copy()
for label in range(num_stats):
if stats[label,cv2.CC_STAT_AREA] == 1:
new_image[labels == label] = 0
return new_image
0,0,0 0,1,0 0,0,0
内核的Hit-or-Miss形态学,它立即隔离了您的噪点像素。我注意到您的图像是调色板 - 您是否检查了输入图像中期望找到噪声的实际值 - 我的意思是打印出它们的实际值和周围8个像素? - Mark Setchell