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:
_, 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
相关产品推荐
相关产品推荐

