用OpenCV去除裂纹检测前的背景纹理图案

2024-05-16 01:34:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我要检测移动的传送带上的裂缝。下面是一个例子:

crack on light pattern belt

对于上面的图像,我可以使用高斯模糊,然后用Canny,然后用findContour来检测裂纹。但在其他情况下,我需要检测重型皮带上的裂纹。例如,下面是无裂纹的“重型花纹”皮带。(抱歉,我找不到这种皮带有裂缝的)。在

no crack on belt with heavy pattern

我以前的方法对这种皮带不太管用。如果我用一个更大的核来计算高斯模糊,我可以去掉皮带图案。但它也能减少/消除裂缝。在

更新:这是另一个blob类型的裂纹图像。在

another crack on light pattern belt

我试着用SimpleBlobDetector检测它。但在厚重的花纹带上,它给出了很多假阳性。有什么建议可以帮你在有花纹的皮带上检测出那样的斑点吗?在

更新2:

我听从了@Nathance关于双边过滤器的建议:

min_area = 400
blur = cv2.bilateralFilter(gray, 11, 125, 125)
thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,3,2)
canny = cv2.Canny(thresh, 120, 255, 1)

放大后的图像如下所示。在

dilated image 1dilated image 2dilated image 3

对于这些特殊的图片,我可以做一个“最小面积=400”来区分裂缝和图案。然而,较大的内核模糊也会将部分裂缝和图案一起擦掉。所以我希望在更复杂的真实环境中(即不同的光照条件等),min_区域的选择不会非常稳定。我有个问题,因为模式总是+-45度。这些模式有什么可以帮助去除的吗?在


Tags: 图像模式mincv2建议图案裂缝皮带
1条回答
网友
1楼 · 发布于 2024-05-16 01:34:38

这里有一个潜在的解决方案

  • 将图像转换为灰度和中值模糊
  • 自适应阈值
  • Canny边缘检测
  • 消除噪声的形态学变换
  • 扩张以增强轮廓
  • 查找等高线
  • 迭代轮廓并使用最小阈值区域进行滤波

这是结果

enter image description here

一个潜在的预处理步骤是在检测裂纹之前去除暗区,因为这会破坏中值模糊和自适应阈值。例如,如果您能够删除最后一个图像上的黑色部分,您将得到这个结果。在

enter image description here

潜在的优化可能是使用中间模糊,因为这有助于平滑皮带上的图案。您还可以调整最小阈值区域以控制检测到的裂纹的大小

import cv2
import numpy as np

image = cv2.imread('1.png')

blur = cv2.medianBlur(image, 7)
gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,3)

canny = cv2.Canny(thresh, 120, 255, 1)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
opening = cv2.morphologyEx(canny, cv2.MORPH_CLOSE, kernel)
dilate = cv2.dilate(opening, kernel, iterations=2)

cnts = cv2.findContours(dilate, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

min_area = 3000
for c in cnts:
    area = cv2.contourArea(c)
    if area > min_area:
        cv2.drawContours(image, [c], -1, (36, 255, 12), 2)

cv2.imshow('image', image)
cv2.imwrite('image.png', image)
cv2.waitKey(0)

相关问题 更多 >