如何从图像中检测裂纹线条的高度、宽度及实际长度?
裂纹尺寸测量技术方案
前置优化:二值图降噪
你当前生成的二值图可能存在零散噪声点,会干扰轮廓提取,先做形态学开运算过滤杂点:
import cv2 import numpy as np # 你原有二值化逻辑 im_gray = cv2.imread('1.jpg', cv2.IMREAD_GRAYSCALE) thresh = 127 im_bw = cv2.threshold(im_gray, thresh, 255, cv2.THRESH_BINARY)[1] # 新增降噪逻辑:3x3卷积核做开运算,可调整核大小适配你的噪声情况 kernel = np.ones((3,3), np.uint8) im_bw_clean = cv2.morphologyEx(im_bw, cv2.MORPH_OPEN, kernel, iterations=1) # 裂纹为黑色区域时反转图像,让裂纹变为白色适配轮廓提取逻辑 im_bw_reverse = 255 - im_bw_clean
步骤1:提取裂纹轮廓
过滤掉面积过小的无效轮廓,保留主裂纹轮廓:
# 提取所有外层轮廓 contours, hierarchy = cv2.findContours(im_bw_reverse, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 过滤小轮廓,面积阈值可根据实际图像大小调整 valid_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > 10] # 取面积最大的轮廓作为主裂纹 crack_cnt = max(valid_contours, key=cv2.contourArea)
步骤2:计算尺寸参数
裂纹整体高度、宽度
通过最小外接矩形获取裂纹整体的宽高参数:
# 最小外接矩形返回参数:(中心坐标, (宽, 高), 旋转角度) rect = cv2.minAreaRect(crack_cnt) crack_width, crack_height = rect[1] print(f"裂纹整体宽度:{round(crack_width,2)}像素,裂纹整体高度:{round(crack_height,2)}像素")
裂纹线条实际长度
如果需要测量裂纹曲线本身的长度,可通过轮廓周长计算:
# 线条类轮廓的闭合周长约等于2倍线条本身长度 crack_length = cv2.arcLength(crack_cnt, closed=True) / 2 print(f"裂纹线条实际长度:{round(crack_length,2)}像素")
物理尺寸转换说明
如果需要将像素长度转换为毫米等实际物理单位,拍摄时在相同焦距、相同拍摄距离下放置已知长度的标尺,计算出单像素对应实际长度 = 标尺实际长度 / 标尺像素长度,乘以上述像素值即可得到实际尺寸。
内容的提问来源于stack exchange,提问作者Bingo Man
相关产品推荐
相关产品推荐

