OpenCV检测显微裂纹时边界与检测目标粘连问题求助
解决OpenCV裂纹检测中图像边界与目标粘连的问题
问题原因
检测结果出现边界与裂纹粘连,核心是二值化后图像边缘的黑色区域被误判为裂纹的一部分,再加上形态学闭操作的膨胀作用,把边缘和被截断的裂纹合并成了一个大轮廓。
解决方案
1. 预处理添加白色边框(最直接有效)
在二值化前给图像加一圈白色边框,彻底隔离原图像边缘的黑色区域,避免被当成裂纹处理:
# 给图像添加1像素宽的白色边框 src = cv.copyMakeBorder(src, 1, 1, 1, 1, cv.BORDER_CONSTANT, value=255)
2. 优化形态学操作参数
当前闭操作迭代次数为2,膨胀过度可能加剧粘连,可尝试减少迭代次数:
# 调整闭操作迭代次数为1 closing = cv.morphologyEx(th1, cv.MORPH_CLOSE, kernel, iterations=1)
3. 过滤超大轮廓(兜底方案)
如果仍有大轮廓漏网,通过计算轮廓面积过滤掉远大于正常裂纹的对象:
valid_contours = [] for cnt in contours: # 根据你的图像实际情况调整面积阈值 if cv.contourArea(cnt) < 5000: valid_contours.append(cnt) # 仅绘制有效轮廓 cont = cv.drawContours(overlay, valid_contours, -1, (0, 255, 0), 1)
修改后的完整代码
import numpy as np import cv2 as cv from matplotlib import pyplot as plt src = cv.imread('cracks.TIF', cv.IMREAD_GRAYSCALE) # 添加白色边框隔离边缘 src = cv.copyMakeBorder(src, 1, 1, 1, 1, cv.BORDER_CONSTANT, value=255) ret, th1 = cv.threshold(src, 95, 255, cv.THRESH_BINARY) kernel = np.ones((2, 2), np.uint8) closing = cv.morphologyEx(th1, cv.MORPH_CLOSE, kernel, iterations=1) contours, hierarchy = cv.findContours(closing, cv.RETR_LIST, cv.CHAIN_APPROX_NONE) # 过滤不符合尺寸的轮廓 valid_contours = [] for cnt in contours: if cv.contourArea(cnt) < 5000: valid_contours.append(cnt) overlay = src.copy() cont = cv.drawContours(overlay, valid_contours, -1, (0, 255, 0), 1) titles = ["ORIGINAL", "THRESH_BINARY", "CLOSING" , "CONTOURS"] images = [src, th1, closing, overlay] for i in range(len(images)): plt.subplot(2, 2, i+1), plt.imshow(images[i], cmap='gray') plt.title(titles[i]) plt.xticks([]), plt.yticks([]) plt.show()
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

