2024-05-15 14:12:40 发布
网友
我试图通过Houghlines变换找到这两条水平线。正如你所看到的,这幅画很吵!当前我的工作流如下所示:
裁剪图像
模糊它
降低噪声(为此,我将图像反转,然后将模糊图像减为反转图像)
打开它并用“水平内核”扩展它(kernel_1 = np.ones((10,1), np.uint8)
kernel_1 = np.ones((10,1), np.uint8)
门槛
霍格林
结果没有预期的那么好……知道我将始终搜索水平线(因此,绝对值(θ)将始终接近0或π),是否有更好的策略
问题是噪音和微弱的信号。您可以通过平均/积分来抑制噪声,同时保持信号,因为它是沿维度复制的(信号是一条线)
您使用非常宽但很窄的内核的方法可以扩展为简单地沿整个映像进行集成
np.sum(axis=1)
这不会告诉你这条线有多长,只会告诉你它在那里并且可能跨越整个宽度
编辑:既然我的回答得到了回应,我也会详细说明:
我认为你可以通过低通得到“灰色”基线,然后减去(“高斯差”)。这会给你一个很好的信号
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]
与Christoph的答案大致相同,但我只是想分享一张经过处理的图片,这是我在评论中无法做到的
我只是用np.mean(axis=1)取了所有行的平均值,并将结果归一化。希望你能看到与你的线条相对应的两条暗带
np.mean(axis=1)
问题是噪音和微弱的信号。您可以通过平均/积分来抑制噪声,同时保持信号,因为它是沿维度复制的(信号是一条线)
您使用非常宽但很窄的内核的方法可以扩展为简单地沿整个映像进行集成
np.sum(axis=1)
或求平均值,无论哪种方式都要考虑数据类型。使用浮球很方便李>这不会告诉你这条线有多长,只会告诉你它在那里并且可能跨越整个宽度
编辑:既然我的回答得到了回应,我也会详细说明:
我认为你可以通过低通得到“灰色”基线,然后减去(“高斯差”)。这会给你一个很好的信号
与Christoph的答案大致相同,但我只是想分享一张经过处理的图片,这是我在评论中无法做到的
我只是用
np.mean(axis=1)
取了所有行的平均值,并将结果归一化。希望你能看到与你的线条相对应的两条暗带相关问题 更多 >
编程相关推荐