<p>问题是噪音和微弱的信号。您可以通过平均/积分来抑制噪声,同时保持信号,因为它是沿维度复制的(信号是一条线)</p>
<p>您使用非常宽但很窄的内核的方法可以扩展为简单地沿整个映像进行集成</p>
<ol>
<li>旋转图像,使可疑线与轴对齐(例如水平)</li>
<li>将一条扫描线(水平线)的所有像素相加,<code>np.sum(axis=1)</code>或求平均值,无论哪种方式都要考虑数据类型。使用浮球很方便</李>
<li>使用一维值系列</李>
</ol>
<p>这不会告诉你这条线有多长,只会告诉你它在那里并且可能跨越整个宽度</p>
<p>编辑:既然我的回答得到了回应,我也会详细说明:</p>
<p>我认为你可以通过低通得到“灰色”基线,然后减去(“高斯差”)。这会给你一个很好的信号</p>
<pre><code>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]
</code></pre>
<p><a href="https://i.stack.imgur.com/UyL4k.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/UyL4k.png" alt="the plot"/></a></p>