OpenCV 案例六【道路裂缝检测】

目录:

一、环境准备

1、Anaconda 环境配置

环境配置参考前面章节:

OpenCV 案例一【人脸检测】

2、图像处理方法介绍

主要用到了自适应阈值二值化(Adaptive Thresholding)方法,主要作用是:

对经过预处理(去噪、增强对比度)的灰度图像,采用自适应阈值方法,将其转换为二值图像,目的是突出图像中的裂缝。如:图片中的裂缝会被设置为白色(255),而背景会是黑色(0)。由于代码中使用了 cv2.THRESH_BINARY_INV,进行反转,因为裂缝通常是黑色的,最终效果是裂缝被设置成白色。

二、代码案例

python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 设置中文字体
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 = 50
for cnt in contours:
    if cv2.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

# 判断并打印结果
if crack_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()

三、运行效果


相关推荐
stuartevil2 分钟前
AI图生视频常见坑:参考图风格不一致怎么解决
人工智能·深度学习·音视频
星核0penstarry8 分钟前
HICOOL 2026深度解读:从四大仪式看北京硬科技生态的底层逻辑
大数据·人工智能·科技·ai·创业创新·ai编程
aichitang20248 分钟前
快乐泛函每一天:希尔伯特空间中的最佳逼近与正交投影定理
人工智能·考研·算法·ai·面试·泛函分析
Python大数据分析@10 分钟前
如何评价openworker办公agent?
人工智能
H03111698511 分钟前
AI任务不中断:支持离线与关机后继续运行的几款工具
人工智能
陈年老古董12 分钟前
OpenCV实战:文档扫描与图像风格迁移
人工智能·python·opencv·计算机视觉
智嵌研习社12 分钟前
从 Prompt 到工程化技能包:AI Skills 标准与 Continue 落地
人工智能·prompt·skill
淬炼之火13 分钟前
笔记:Visually-Guided Policy Optimization for Multimodal Reasoning
人工智能·笔记·算法·机器学习·语言模型·自然语言处理
STLearner18 分钟前
KDD 2026 | (2月轮)时空数据(Spatial-Temporal)论文总结时空(交通)预测,轨迹数据挖掘(表示,生成)
论文阅读·人工智能·python·深度学习·学习·机器学习·数据挖掘
学习星球19 分钟前
空天地一体化网络(NTN)深度解析:从Starlink D2C到3GPP NTN,卫星直连手机是如何实现的?
网络·人工智能·算法·智能手机·php