Python Opencv二进制项目检测

Python Opencv二进制项目检测,python,opencv,Python,Opencv,我正在做一个程序,寻找我制造的零件中卡住的碎片。到目前为止,我已经能够得到一个干净的部分和一个带有芯片的部分,然后减去这两个图像,将两者之间的任何差异保留为二进制图像。我不明白的是如何在二值图像中检测这个项目。到目前为止,我使用了SimpleBlobDetector功能,但我必须对图像进行太多的模糊处理才能使其正常工作,因此我担心它无法处理较小的碎片。我希望能够检测到原始图像,而不会出现大量模糊。任何帮助都将不胜感激。代码和图片如下 import cv2 import numpy as np

我正在做一个程序,寻找我制造的零件中卡住的碎片。到目前为止,我已经能够得到一个干净的部分和一个带有芯片的部分,然后减去这两个图像,将两者之间的任何差异保留为二进制图像。我不明白的是如何在二值图像中检测这个项目。到目前为止,我使用了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
,因为如果对象为白色,则会找到轮廓

#---Finding the contours present in 'imgDiff'---
_, contours,hierarchy = cv2.findContours(imgDiff,2,1)

ff = 0   #----to determine which contour to select---
area = 0   #----to determine the maximum area---
for i in range(len(contours)):
    if(cv2.contourArea(contours[i]) > area):
        area = cv2.contourArea(contours[i])
        ff = i

#---Bounding the contour having largest area---
x,y,w,h = cv2.boundingRect(contours[ff])
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow('fin.jpg',img)

你能上传你正在使用的图像吗?刚刚上传了,它们链接在代码下面,但是你上传的两个图像之间似乎没有(视觉)区别对不起,上传了两次相同的图像。已经纠正了。你能在“芯片”上添加一个带有指示的图像吗。你认为这是质量不好的吗?杰鲁,你能帮我发一下代码吗。这正是我想要做的,但我不确定如何找到最大的区域。再次感谢!!!