对于Python的一个小实验,我想在水果上发现一些小划痕。划痕很小,人眼很难察觉。
我正在使用高分辨率相机进行实验。
这是我要检测的缺陷:
原始图片:
这是我用很少的代码行得到的结果:
所以我找到了水果的轮廓。我怎样才能找到划痕? RGB值类似于水果的其他部分。那么我该如何区分A划痕和部分水果呢?
我的代码:
# 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()
答案 0 :(得分:2)
我将您的图像更改为HSL色彩空间。 我在L通道中看不到刮痕,因此前面建议的灰度方法将很困难。 但是刮痕在色相平面上非常明显。
您可以使用边缘检测器在色相通道中找到瑕疵。在这里,我使用了一个不同的高斯探测器(大小为20和4)。
答案 1 :(得分:1)
个人猜测是使用某种算法来检测灰度变化。刮擦周围的灰度变化应大于其他区域的变化。 Sobel和Scharr衍生物可能是一种选择。这是关于python-openCV关于图像渐变的link。您可以先使用coutour应用程序将水果切出
答案 2 :(得分:0)
如果您真的想使用传统的计算机视觉技术,则应从可以在水果上检测到的边缘开始。一些边缘是由水果上的凸起引起的,因此您必须查看边缘周围区域的各种特征,才能发现划痕和凸起之间的差异。在查看了大约一百个划痕之后,您应该能够提出一些规则。
但是这个过程将非常累人,我猜您运气不好。解决此问题的更好方法是通过在大约100张图像上手动标注划痕来训练深度神经网络,然后让网络自行找出如何从水果的其余部分中区分划痕。
如果您是这些内容的初学者,请搜索PyImageSearch和LearnOpenCV。两者都是资源丰富的网站,您可以在其中快速学习。