OpenCV 案例六【道路裂缝检测】
目录:
- 一、环境准备
- 1、Anaconda 环境配置
- 2、图像处理方法介绍
- 二、代码案例
- 三、运行效果
一、环境准备
1、Anaconda 环境配置
环境配置参考前面章节:
OpenCV 案例一【人脸检测】
2、图像处理方法介绍
主要用到了自适应阈值二值化(Adaptive Thresholding)方法,主要作用是:
对经过预处理(去噪、增强对比度)的灰度图像,采用自适应阈值方法,将其转换为二值图像,目的是突出图像中的裂缝。如:图片中的裂缝会被设置为白色(255),而背景会是黑色(0)。由于代码中使用了 cv2.THRESH_BINARY_INV,进行反转,因为裂缝通常是黑色的,最终效果是裂缝被设置成白色。
二、代码案例
importcv2importnumpyasnpimportmatplotlib.pyplotasplt# 设置中文字体plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=False# 读取图像并灰度化image_path='road_2.png'image=cv2.imread(image_path)gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)# 图像预处理blurred=cv2.GaussianBlur(gray,(5,5),0)# 使用 CLAHE 增强对比度clahe=cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))enhanced=clahe.apply(blurred)# 二值化:提取裂缝_,binary=cv2.threshold(enhanced,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)# 形态学操作:去噪 + 连接裂缝kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))# 开运算:去除小噪点opening=cv2.morphologyEx(binary,cv2.MORPH_OPEN,kernel,iterations=2)# 闭运算:连接断裂的细小裂缝closing=cv2.morphologyEx(opening,cv2.MORPH_CLOSE,kernel,iterations=3)# 轮廓检测:提取裂缝区域contours,_=cv2.findContours(closing,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)# 创建一个掩膜,用于画出最终的裂缝区域crack_mask=np.zeros_like(gray)# 过滤小区域,假设小于 min_area 的为噪声min_area=50forcntincontours:ifcv2.contourArea(cnt)>min_area:cv2.drawContours(crack_mask,[cnt],-1,255,thickness=cv2.FILLED)# 统计裂缝像素crack_pixel_count=np.sum(crack_mask==255)total_pixels=crack_mask.size crack_ratio=crack_pixel_count/total_pixels# 设定阈值crack_threshold=1000# 判断并打印结果ifcrack_pixel_count>crack_threshold:print("该道路图像中存在裂缝")else:print("该道路图像中未发现明显裂缝")print(f"检测到的裂缝像素数:{crack_pixel_count},占比约:{crack_ratio:.4%}")# 在原图上标记result=image.copy()result[crack_mask==255]=[0,0,255]# 可视化plt.figure(figsize=(15,10))plt.subplot(2,3,1),plt.imshow(cv2.cvtColor(image,cv2.COLOR_BGR2RGB))plt.title('原始图像'),plt.axis('off')plt.subplot(2,3,2),plt.imshow(gray,cmap='gray')plt.title('灰度图'),plt.axis('off')plt.subplot(2,3,3),plt.imshow(enhanced,cmap='gray')plt.title('增强后(CLAHE)'),plt.axis('off')plt.subplot(2,3,4),plt.imshow(binary,cmap='gray')plt.title('二值化图像'),plt.axis('off')plt.subplot(2,3,5),plt.imshow(closing,cmap='gray')plt.title('形态学处理后'),plt.axis('off')plt.subplot(2,3,6),plt.imshow(cv2.cvtColor(result,cv2.COLOR_BGR2RGB))plt.title('检测到的裂缝(红色)'),plt.axis('off')plt.tight_layout()plt.show()