从网格图像提取特征:求网格单元边厚及指定区域面积
实际图像

线条检测结果

目标任务示意图

我目前正在处理上述网格图像,已经通过Canny边缘检测、Hough变换实现了线条检测,现在需要完成两个核心任务:
- 提取网格单元各边的厚度特征
- 计算示意图中标注区域的面积
恳请提供可行的实现方法。
已实现的代码片段
# Dilate the edge image to make the edges thicker dialted_edge_image = cv2.dilate(edge_canny_image, kernel, iterations = 2) # Perform a Hough Transform to detect lines lines = probabilistic_hough_line(edge_canny_image, threshold=40, line_length=1, line_gap=2) # Create a separate image for line detection line_detected_image = np.dstack([edge_canny_image] * 3) # Convert to RGB for colored lines for line in lines: p0, p1 = line cv2.line(line_detected_image, p0, p1, (255, 255, 255), 2)
解决方案
一、提取网格边的厚度特征
1. 基于轮廓的厚度计算
- 对膨胀后的边缘图像执行轮廓检测:
contours, _ = cv2.findContours(dialted_edge_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) - 针对每个网格边的轮廓,计算最小外接矩形,矩形的短边长度即为该边的厚度:
for contour in contours: rect = cv2.minAreaRect(contour) thickness = min(rect[1]) - 若线条为水平/垂直方向,也可直接统计轮廓在垂直于线条方向的像素范围差作为厚度(比如水平线条取y轴范围差)。
2. 基于距离变换的厚度分析
- 对二值边缘图像做距离变换,线条区域内的最大距离值的2倍,即为线条近似厚度:
dist_transform = cv2.distanceTransform(edge_canny_image, cv2.DIST_L2, 3) max_dist = np.max(dist_transform) thickness = max_dist * 2
二、计算指定区域的面积
1. 先完成网格结构化建模
- 从Hough检测结果中分离水平/垂直线条:通过计算线条斜率,筛选斜率接近0(水平)和斜率绝对值极大(垂直)的线条。
- 对水平/垂直线条分别排序,确定网格的行列间距,建立每个网格单元的坐标范围。
2. 面积计算方法
- 快速估算:若已知标注区域包含的网格数量,先计算单个网格面积(相邻水平/垂直线条间距相乘),再乘以网格数量。
- 精确像素面积:
- 根据网格坐标范围生成目标区域掩码:
mask = np.zeros_like(edge_canny_image) # 假设目标区域是从(x1,y1)到(x2,y2)的矩形范围 cv2.rectangle(mask, (x1,y1), (x2,y2), 255, -1) - 统计掩码中白色像素数量得到像素面积,若需物理面积,结合图像像素分辨率(如每像素对应多少毫米)换算:
pixel_area = cv2.countNonZero(mask) physical_area = pixel_area * (pixel_mm ** 2) # pixel_mm为单像素对应毫米数
- 根据网格坐标范围生成目标区域掩码:
补充优化建议
- 调整Hough变换参数:当前
line_length=1过小,建议增大到10-20,减少噪声线条干扰。 - 对检测到的线条做聚类合并:通过计算线条的距离和角度,合并同一条网格边的重复检测结果。
内容的提问来源于stack exchange,提问作者Sakura
相关产品推荐
相关产品推荐

