小能豆

如何去除直线的噪点

py

所以我有一堆直线形成各种形状的图像。然而,这些直线往往不太直,因为底层源经常让这些线穿过像素。在这种情况下,底层源会产生一条线旁边的像素。在这种情况下,我希望删除这些多余的像素。

这里我们有一张源图像:

1.png

这里我们对同一幅图像进行了去噪:

2.png

我正在尝试使用 houghline 变换或去噪算法,但这些算法都没有很好地发挥作用,感觉应该有一个好的方法来解决这个问题,利用这些是线而不是普通的胡椒和盐噪声这一具体事实。

我现在正在使用 python,但其他语言的答案也是可以接受的。


阅读 17

收藏
2025-01-01

共1个答案

小能豆

我想到的是与 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
1.png

res
2.png


结果并不完美,也不具有普遍性。
使用 for 循环可能会得到更好的结果。
示例:删除下方有很多水平像素但旁边只有很少水平像素的像素(对左侧、右侧和底部重复)。

2025-01-01