边缘检测最小线长问题:如何快速过滤Canny边缘检测结果中的短线段
你当前实现的本质是8连通域面积过滤,手动嵌套Python循环遍历像素是速度慢的核心原因,直接调用OpenCV内置的连通域分析API即可实现相同需求,运算效率提升数百倍。
优化后代码
import cv2 import numpy as np img = cv2.imread("edtest.jpg") # 原逻辑提取红色通道做边缘检测 img_r = img.copy() img_r[:, :, 0] = 0 img_r[:, :, 1] = 0 img_r = cv2.GaussianBlur(img_r, (3, 3), 0) basic_edge = cv2.Canny(img_r, 240, 250) min_threshold = 100 # 调用OpenCV连通域分析,8连通模式 num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(basic_edge, connectivity=8) culled_edge = np.zeros_like(basic_edge) # 遍历所有连通域,跳过背景标签0 for label in range(1, num_labels): # 取当前连通域的像素数量 area = stats[label, cv2.CC_STAT_AREA] if area >= min_threshold: # 保留面积符合要求的连通域 culled_edge[labels == label] = 255 cv2.imshow("basic_edge", basic_edge) cv2.imshow("culled_edge", culled_edge) cv2.waitKey(0) cv2.destroyAllWindows()
说明
- 内置API会自动完成所有连通域的像素统计,不需要手动写遍历逻辑,效果和你原实现完全一致
- 额外需要导入numpy做数组掩码操作,属于OpenCV默认依赖的基础库,不需要额外安装
内容的提问来源于stack exchange,提问作者JoshW
相关产品推荐
相关产品推荐

