所以我有一堆直线形成各种形状的图像。然而,这些直线往往不太直,因为底层源经常让这些线穿过像素。在这种情况下,底层源会产生一条线旁边的像素。在这种情况下,我希望删除这些多余的像素。
这里我们有一张源图像:
这里我们对同一幅图像进行了去噪:
我正在尝试使用 houghline 变换或去噪算法,但这些算法都没有很好地发挥作用,感觉应该有一个好的方法来解决这个问题,利用这些是线而不是普通的胡椒和盐噪声这一具体事实。
我现在正在使用 python,但其他语言的答案也是可以接受的。
我想到的是与 Cris 评论的相同的解决方案:
np.ones((3, 15))
np.ones((15, 3))
以下是代码示例:
import numpy as np import cv2 img = cv2.imread('input.png') # Read input image (BGR color format) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Convert to grayscale thresh = cv2.threshold(gray, 1, 255, cv2.THRESH_BINARY)[1] # Convert to binary (only zeros and 255) horz = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, np.ones((3, 15))) # Keep only horizontal lines vert = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, np.ones((15, 3))) # Keep only vertical lines mask = cv2.bitwise_or(horz, vert) # Unite horizontal and vertical lines to form a mask res = cv2.bitwise_and(img, img, mask=mask) # Place zeros where mask is zero # Show the result cv2.imshow('mask', mask) cv2.imshow('res', res) cv2.waitKey() cv2.destroyAllWindows()
结果:
mask:
mask
res:
res
结果并不完美,也不具有普遍性。 使用 for 循环可能会得到更好的结果。 示例:删除下方有很多水平像素但旁边只有很少水平像素的像素(对左侧、右侧和底部重复)。