You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从图像中检测裂纹线条的高度、宽度及实际长度?

裂纹尺寸测量技术方案

前置优化:二值图降噪

你当前生成的二值图可能存在零散噪声点,会干扰轮廓提取,先做形态学开运算过滤杂点:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:27:03