You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV单边缘检测与非闭合轮廓提取:条纹图上V形轮廓获取

问题:提取条纹图像的上V形轮廓

我在处理如下条纹图像时,难以提取目标的上V形轮廓:
条纹图像

第一次尝试:Canny边缘检测+轮廓提取

尝试了以下代码:

edges = cv2.Canny(cvimg, 150, 600)
plt.subplot(111)
plt.imshow(cvimg,cmap = 'gray')
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 获取平均y值最小的轮廓,即最上方的轮廓
avg_y = [cont.T[1].mean() for cont in contours]
idx = np.argmin(avg_y)
contour = np.asarray(contours[idx]).squeeze().T # 重塑和调整方向用于绘图
plt.plot(contour[0], contour[1], color="r")
plt.show()

初看该方案有效,得到了轮廓和边缘结果:
提取的轮廓
Canny边缘
但Canny边缘的上下侧构成了闭合轮廓,无法轻松分离两侧。

第二次尝试:直接阈值处理+轮廓提取

直接对图像做阈值处理,不使用Canny:

_, cvimg = cv2.threshold(cvimg, 50, 255, type=cv2.THRESH_OTSU)
contours, _ = cv2.findContours(cvimg, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 获取平均y值最小的轮廓,即最上方的轮廓
avg_y = [cont.T[1].mean() for cont in contours]
idx = np.argmin(avg_y)
contour = np.asarray(contours[idx]).squeeze().T
plt.plot(contour[0], contour[1], color="r")
plt.show()

但结果仍是闭合轮廓:
阈值处理后的闭合轮廓

第三次尝试:Canny后取每列首个非零索引

使用Canny滤波后的图像,取每列首个非零索引:

edges = cv2.Canny(cvimg, 150, 600)
contour = np.argmax(edges>0, axis=0)
plt.subplot(111)
plt.imshow(cvimg,cmap = 'gray')
plt.plot(contour, color="r")
plt.show()

该方案也不理想,会同时检测到两侧的冗余内容:
包含冗余内容的轮廓

如何才能仅获取上V形轮廓,无需可能不适用于所有数据的后处理?能否让OpenCV不闭合Canny边缘?或是我未正确使用该库?感谢解答!


内容的提问来源于stack exchange,提问作者Raphael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:25:47