如何去噪直线

2024-09-19 20:55:36 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一组形成各种形状的直线的图像。然而,这些直线有一种不太直的趋势,因为底层源通常有这些直线在像素之间。在这种情况下,基础源会生成一条线旁边的像素。在这种情况下,我希望这些额外的像素被删除

这里我们有一个源图像:

noised

这里我们对相同的图像进行去噪处理:

denoised

我在胡思乱想houghline变换或去噪算法,但这些都不能很好地工作,而且感觉应该有一种很好的方法来解决这个问题,它使用了特定的事实,即这些是线,而不仅仅是普通的椒盐噪声

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


Tags: 方法图像算法情况像素基础趋势直线
1条回答
网友
1楼 · 发布于 2024-09-19 20:55:36

我想到了与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
enter image description here

res
enter image description here


结果不是完美的,也不是一般化的。
使用for循环可以获得更好的结果。
示例:删除下面有许多水平像素,但旁边只有少数水平像素的像素(对左、右和底部重复)

相关问题 更多 >