我正在研究一个程序,以找到我制造的零件中卡住的碎片。到目前为止,我已经能够取一个干净的部分和一个有芯片的部分,然后减去这两个图像,留下两者之间的任何差异作为二值图像。我不明白的是如何在二值图像中检测这个项目。到目前为止,我使用的是SimpleBlobDetector函数,但是为了使它正常工作,我不得不对图像进行模糊处理,我担心它不能处理较小的碎片。我希望能够在没有大量模糊的情况下检测到原始图像。任何帮助都将不胜感激。代码和图片如下。在
import cv2
import numpy as np
#Load Images
tempImg = cv2.imread('images/partchip.jpg')
lineImg = cv2.imread('images/partnochip.jpg')
#Crop Images
cropTemp = tempImg[460:589, 647:875]
cropLine = lineImg[460:589, 647:875]
#Gray Scale
grayTemp = cv2.cvtColor(cropTemp,cv2.COLOR_BGR2GRAY)
grayLine = cv2.cvtColor(cropLine,cv2.COLOR_BGR2GRAY)
#Subtract Images
holder = cv2.absdiff(grayTemp,grayLine)
#THreshold Subtracted Image
th, imgDiff = cv2.threshold(holder, 160, 255, cv2.THRESH_BINARY_INV)
#Blur Image
#blur = imgDiff
blur = cv2.blur(imgDiff,(20,20))
#Detect Blobs
detector = cv2.SimpleBlobDetector_create()
blob = detector.detect(blur)
imgkeypoints = cv2.drawKeypoints(blur, blob, np.array([]), (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
originalWithPoints=cv2.drawKeypoints(cropTemp, blob, np.array([]), (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.namedWindow("Template", cv2.WINDOW_NORMAL)
cv2.namedWindow("Line", cv2.WINDOW_NORMAL)
cv2.namedWindow("Difference", cv2.WINDOW_NORMAL)
cv2.resizeWindow("Template", 500, 300)
cv2.resizeWindow("Line", 500, 300)
cv2.resizeWindow("Difference", 500, 300)
cv2.imshow('Template',originalWithPoints)
cv2.imshow('Line',cropLine)
cv2.imshow('Difference',imgkeypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()
我用你的代码找到了异常。我得到了
imgDiff
二值图像上面积最大的轮廓。用它我可以用一个长方形把它绑起来。在我希望这就是你想要的。。。。在
编辑:
我已经解释了程序以及以下代码:
注意:使用
cv2.bitwise_not(imgDiff)
反转你的imgDiff
,因为如果对象是白色的,就会发现轮廓。在相关问题 更多 >
编程相关推荐