在知道这些线条的角度的情况下,在质量很差的图像上查找线条的最佳方法是什么?

Jul*_*e96 4 python opencv hough-transform

我试图用 Houghlines 变换找到这两条水平线。正如你所看到的,图像非常嘈杂!目前我的工作流程如下所示:

  • 裁剪图像

  • 模糊它

  • 降低噪声(为此,我反转图像,然后将模糊图像减去反转图像)

  • 打开它并使用“水平内核”对其进行扩展(kernel_1 = np.ones((10,1), np.uint8)

  • 临界点

  • 胡格林斯

结果不如预期...是否有更好的策略,知道我将始终搜索水平线(因此,abs(theta)将始终接近 0 或 pi

我的原始图像在这里

阈值结果

Chr*_*itz 8

问题是噪音和微弱的信号。您可以通过平均/积分来抑制噪声,同时保持信号,因为它是沿某个维度复制的(信号是一条线)。

您使用非常宽但窄的内核的方法可以扩展到简单地沿着整个图像进行积分。

  1. 旋转图像,使可疑的线与轴对齐(假设水平)
  2. 将一条扫描线(水平线)的所有像素相加,np.sum(axis=1)或平均值,无论哪种方式,请注意数据类型。使用浮标很方便。
  3. 使用一维系列值。

这不会告诉您该线有多长,只会告诉您它在那里并且可能跨越整个宽度。

编辑:既然我的回答得到了反应,我也会详细说明:

我认为你可以通过低通它来获得“灰色”基线,然后减去(“高斯差异”)。这应该会给你一个很好的信号。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
import scipy.ndimage

im = cv.imread("0gczo.png", cv.IMREAD_GRAYSCALE) / np.float32(255)
relief = im.mean(axis=1)
smoothed = scipy.ndimage.gaussian_filter(relief, sigma=2.0)
baseline = scipy.ndimage.gaussian_filter(relief, sigma=10.0)
difference = smoothed - baseline
std = np.std(difference)
level = 2
outliers = (difference <= std * -level)
plt.plot(difference)
plt.hlines([std * +level, std * -level], xmin=0, xmax=len(relief))
plt.plot(std * -level + outliers * std)
plt.show()
# where those peaks are:
edgemap = np.diff(outliers.astype(np.int8))
(edges,) = edgemap.nonzero()
print(edges)           # [392 398 421 427]
print(edgemap[edges])  # [ 1 -1  1 -1]
Run Code Online (Sandbox Code Playgroud)

剧情


Mar*_*ell 5

与克里斯托夫的回答大致相同,但只是想分享经过处理的图像,但我无法在评论中做到这一点。

我只是取各行的平均值并将np.mean(axis=1)结果标准化。希望您能看到与您的线条相对应的两条暗带。

在此输入图像描述