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

对于上面的图像,我可以使用GaussianBlur,后面跟着一个Canny,然后是findContour来检测裂缝。但是在其他情况下,我需要发现带上的裂纹与沉重的模式。例如,下面是“重型”带,没有裂缝。(对不起,我找不到这种皮带上有裂纹的)。

我的旧方法在这种皮带上不太好用。如果我为GaussianBlur使用更大的内核,我可以删除带模式。但它也能减少/消除裂缝。
更新:这是另一个blob类型的裂纹图像。

我试着用SimpleBlobDetector来检测它。但在沉重的模式带上,却产生了大量的假阳性。关于如何在有图案的皮带上发现这样的斑点,有什么建议吗?
更新2:
我遵循了bilateralFilter上@nathancy的建议:
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)放大的图像如下所示。



对于这些特殊的图片,我可以做一个"min_area = 400“来区分裂缝和图案。然而,较大的内核模糊也会将部分裂缝与模式一起擦掉。因此,我预计在更复杂的实际环境(即不同的光照条件等)中,min_area的选择不会非常稳定。我有个问题,因为模式总是+-45度。是否有任何过滤器可以帮助移除这些方向的模式?
发布于 2019-07-18 21:21:25
这里有一个潜在的解决方案
这是结果

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

潜在的优化将是发挥中位模糊,因为这有助于平滑皮带上的模式。您还可以调整最小阈值区域以控制检测到的裂纹的大小。
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)https://stackoverflow.com/questions/57089115
复制相似问题