概述
示例图片:
途径
>将图像转换为HSV色彩空间.将V增加2倍,以获得更多可见的东西.
>在x和y方向找到Sobel衍生物.计算两个方向的重量相等的量值.
>使用Otsu方法阈值图像.
>将Closing应用于您的图像.
>应用Canny边缘检测器.
>找到Hough Line Transform.
>查找线图像的边界矩形.
>将其叠加到您的图像上.(最后完成:P)
码
image = cv2.imread('image3.jpg',cv2.IMREAD_COLOR) original = np.copy(image) if image is None: print 'Can not read/find the image.' exit(-1) hsv_image = cv2.cvtColor(image,cv2.COLOR_BGR2HSV) H,S,V = hsv_image[:,:,0],hsv_image[:,1],2] V = V * 2 hsv_image = cv2.merge([H,V]) image = cv2.cvtColor(hsv_image,cv2.COLOR_HSV2RGB) image = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY) # plt.figure(),plt.imshow(image) Dx = cv2.sobel(image,cv2.CV_8UC1,1,0) Dy = cv2.sobel(image,1) M = cv2.addWeighted(Dx,Dy,0) # plt.subplot(1,3,1),plt.imshow(Dx,'gray'),plt.title('Dx') # plt.subplot(1,2),plt.imshow(Dy,plt.title('Dy') # plt.subplot(1,3),plt.imshow(M,plt.title('Magnitude') ret,binary = cv2.threshold(M,10,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU) # plt.figure(),plt.imshow(binary,'gray') binary = binary.astype(np.uint8) binary = cv2.morphologyEx(binary,cv2.MORPH_CLOSE,cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(20,20))) edges = cv2.Canny(binary,50,100) # plt.figure(),plt.imshow(edges,'gray') lines = cv2.HoughLinesP(edges,3.14/180,20,10)[0] output = np.zeros_like(M,dtype=np.uint8) for line in lines: cv2.line(output,(line[0],line[1]),(line[2],line[3]),(100,200,50),thickness=2) # plt.figure(),plt.imshow(output,'gray') points = np.array([np.transpose(np.where(output != 0))],dtype=np.float32) rect = cv2.boundingRect(points) cv2.rectangle(original,(rect[1],rect[0]),(rect[1]+rect[3],rect[0]+rect[2]),(255,255),thickness=2) original = cv2.cvtColor(original,cv2.COLOR_BGR2RGB) plt.figure(),plt.imshow(original,'gray') plt.show()
注意:您可以取消注释行以显示每个步骤的结果!我只是为了便于阅读而评论它们.
结果
注意:如果您知道罐头的纵横比,可以更好地修复它!
我希望这会有所帮助.祝好运 :)
总结
以上是编程之家为你收集整理的python – 在opencv中检测罐子或瓶子全部内容,希望文章能够帮你解决python – 在opencv中检测罐子或瓶子所遇到的程序开发问题。
如果您也喜欢它,动动您的小指点个赞吧