首页 > 解决方案 > OpenCV 检测水果上的划痕

问题描述

对于我正在做的 Python 小实验,我想在水果上找到小划痕。划痕非常小,人眼难以察觉。

我正在使用高分辨率相机进行该实验。

这是我要检测的缺陷:

在此处输入图像描述

原图:

在此处输入图像描述

这是我用很少几行代码得到的结果:

在此处输入图像描述

所以我找到了我的水果的轮廓。我怎样才能继续寻找划痕?RGB 值与水果的其他部分相似。那么如何区分划痕和水果的一部分呢?

我的代码:

# Imports
import numpy as np
import cv2
import time

# Read Image & Convert
img = cv2.imread('IMG_0441.jpg')
result = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# Filtering
lower = np.array([1,60,50])
upper = np.array([255,255,255])
result = cv2.inRange(result, lower, upper)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(9,9))
result = cv2.dilate(result,kernel)

# Contours
im2, contours, hierarchy = cv2.findContours(result.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
result = cv2.cvtColor(result, cv2.COLOR_GRAY2BGR)
if len(contours) != 0:
    for (i, c) in enumerate(contours):
        area = cv2.contourArea(c)
        if area > 100000:
            print(area)
            cv2.drawContours(img, c, -1, (255,255,0), 12)
            x,y,w,h = cv2.boundingRect(c)            
            cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),12)

# Stack results
result = np.vstack((result, img))
resultOrig = result.copy()

# Save image to file before resizing
cv2.imwrite(str(time.time())+'_0_result.jpg',resultOrig)

# Resize
max_dimension = float(max(result.shape))
scale = 900/max_dimension
result = cv2.resize(result, None, fx=scale, fy=scale)

# Show results
cv2.imshow('res',result)

cv2.waitKey(0)
cv2.destroyAllWindows()

标签: pythonopencv

解决方案


我将您的图像更改为 HSL 颜色空间。我看不到 L 通道中的划痕,所以前面建议的灰度方法会很困难。但是在色调平面上的划痕非常明显。 色相平面上的划痕非常明显

您可以使用边缘检测器来查找色调通道中的瑕疵。在这里,我使用了不同的高斯检测器(尺寸为 20 和 4)。

狗


推荐阅读