图像垂直线边缘提取与分析:分离、平滑及定位技术问询
原始帖子
我有一批相似的图像需要分析。
经过以下步骤:
- 阈值处理(thresholding)
- 使用
skimage.morphology.reconstruction进行孔洞填充 - 图像闭运算(image closing)
我得到了类似这样的图像:
我关注形状的边缘,尤其是原始灰度图像中沿垂直线的坡度陡峭程度。我尝试用Canny边缘检测获取轮廓,得到了如下结果:
我的问题:
- 如何分离近似垂直和水平的边缘?二者对我意义不同,我完全不关注相邻水平线之间的区域(更希望直接裁剪掉这些部分),但关注垂直线附近的情况(黑白图像中的白色区域)。
- 我认为线条应是笔直的(可能存在倾斜,但噪声过高),如何平滑轮廓线?
- 最终我希望回到灰度图像,查看垂直线附近的像素统计信息,如何从Canny检测到的边缘中提取线条的位置信息?
我的代码:
im_th= cv2.inRange(img, 0, 500, cv2.THRESH_BINARY) seed = np.copy(im_th) seed[1:-1, 1:-1] = im_th.max() mask = im_th filled = reconstruction(seed, mask, method='erosion').astype(np.uint8) kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(4,4)) closed = cv2.morphologyEx(filled,cv2.MORPH_CLOSE, kernel=kernel) edges = cv2.Canny(cv2.medianBlur(closed, 5), 50, 150)
补充内容
根据Christoph Rackwitz和mimocha的建议,我尝试使用findContours和HoughLinesP。两种方法的结果都有前景,但仍需进一步处理才能投入使用。
findContours方法
代码:
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) contour_img = cv2.drawContours(cv2.cvtColor(closed, cv2.COLOR_GRAY2BGR), contours, -1, (255,0,0), 3)
生成图像(叠加在闭运算图像上):
轮廓被很好地检测出来,但仍有151条轮廓线。我希望平滑结果并减少线条数量。
HoughLinesP方法
代码:
threshold = 15 min_line_length = 30 max_line_gap = 200 line_image = np.copy(cv2.cvtColor(closed, cv2.COLOR_GRAY2BGR)) * 0 lines = cv2.HoughLinesP(edges, 1, np.pi / 180, threshold, None, min_line_length, max_line_gap) for line in lines: for x1,y1,x2,y2 in line: cv2.line(line_image,(x1,y1),(x2,y2),(255,0,0),5) lines_edges = cv2.addWeighted(cv2.cvtColor(closed, cv2.COLOR_GRAY2BGR), 0.2, line_image, 1, 0)
生成图像:
HoughLinesP确实能生成直线,且检测效果良好,但部分线条过“粗”(图像中可见部分粗线实际为平行线),因此需要优化结果的方法。
目前总结:
- 轮廓法和霍夫变换法均有成效。
- 霍夫变换法优势在于返回直线,且可分离水平和垂直线。
- 仍需线条合并/聚类的方法。
内容的提问来源于stack exchange,提问作者Yair M
相关产品推荐
相关产品推荐

