我正在寻找一种使用OpenCV从二进制图像中删除孤立的白色像素的方法。一个类似的问题(OpenCV摆脱了孤立的像素)也有很多“答案”,但似乎没有一个对我有用。我也尝试过打开和关闭的各种组合,但都没有成功。
这里的文章:
https://homepages.inf.ed.ac.uk/rbf/HIPR2/hitmiss.htm
建议我可以完全出于此目的使用“命中或失败”操作:
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)
Run Code Online (Sandbox Code Playgroud)
删除像这样的孤立像素的正确方法是什么?
更新:亚历山大的答案就像一个魅力,是最快的解决方案。另一个答案也提供了一个解决方案,即使用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
Run Code Online (Sandbox Code Playgroud)