【问题标题】:How do I denoise straight lines如何对直线进行降噪
【发布时间】:2021-06-01 14:34:04
【问题描述】:

所以我有一堆直线形成各种形状的图像。然而,这些直线往往不是很直,因为底层源通常在像素之间有这些线。在这种情况下,底层源会产生靠近一条线的像素。在这种情况下,我希望移除这些额外的像素。

这里有一张源图片:

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

.

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

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

【问题讨论】:

  • 欢迎任何建议甚至不完整的答案,如果您有任何问题,请发表评论,以便我回答/添加信息。
  • 理想情况下,您应该在阈值处理之前对图像进行降噪。但是鉴于您在此处拥有的图像,使用水平和垂直线结构元素应用闭合应该可以解决问题(或将两个结果放在一起)。
  • @CrisLuengo 是的,在阈值之前去噪是理想的,但是底层源实际上是一个仅近似阈值算法的神经网络(它实际上是一个相当复杂的系统,它根据周围的环境标记单个像素。)
  • yoz 可以提取每个轮廓并尝试独立平滑两个方向:沿轮廓和垂直于轮廓。

标签: python opencv image-processing computer-vision


【解决方案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:

res:


结果并不完美,也不是一概而论。
使用 for 循环可能会获得更好的结果。
示例:删除下方有很多水平像素但旁边只有少数水平像素的像素(重复左、右和下)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-05
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    相关资源
    最近更新 更多