我想測量影像中沿綠線的寬度,我通過 OpenCV 應用了像 canny 這樣的過濾器,但我猜由于溫度非常高,過濾器不起作用(無法顯示邊緣)。我的想法是畫兩條垂直線并通過在它們之間畫一條線來測量(我想在圖片中繪制物件的垂直邊緣,所以)。有什么方法可以解決這個問題嗎?

uj5u.com熱心網友回復:
紅色組件二值化非常好,所以找到邊不是什么大問題。
為了獲得更高的精度,您可以垂直低通濾波器以減少噪聲。您還可以使用跨越邊緣的線性模型進行亞像素插值。但是我不確定您的情況是否需要這種奢侈。

低通:

uj5u.com熱心網友回復:
- 取一行像素
- 只走紅色通道(其他不包含資訊)
- 低通一點以抑制噪音
- 坡度
- 最大值和最小值分別是上升沿和下降沿
由此,falling - rising您可以直接在影像的掃描線上獲得工件的寬度(以像素為單位)。
您也可以并且也許應該使用全域閾值而不是邊緣。在這張圖片中,0.4 的閾值看起來不錯。您可以使用 Otsu 的方法來確定。
im = cv.imread("UEj1P.png")
# try threshold using Otsu
row_u8 = im[550, :, 2] # red channel
(otsulevel, thresh) = cv.threshold(row_u8, 0, 255, cv.THRESH_BINARY cv.THRESH_OTSU)
row = im[500:550, :, 2].mean(axis=0) / 255
lowpassed = scipy.ndimage.gaussian_filter1d(row, sigma=2.0)
gradient = np.gradient(lowpassed)
rising = np.argmax(gradient)
falling = np.argmin(gradient)
# two plots in the figure
fig, ax = plt.subplots(2, 1, figsize=(15, 10))
# first plot: row
ax[0].plot(row)
ax[0].plot(lowpassed)
# otsu threshold line
ax[0].axhline(otsulevel/255, color="blue")
# second plot: gradient
ax[1].plot(gradient)
# draw some vertical lines at rising and falling edge
ax[0].axvline(x=rising, color="red")
ax[0].axvline(x=falling, color="red")
ax[1].axvline(x=rising, color="red")
ax[1].axvline(x=falling, color="red")
plt.show()

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/505698.html
標籤:Python opencv 图像处理 计算机视觉 边缘检测
上一篇:亮度校正(預期校正)
