Python OpenCV从二进制图像中检测白色对象并裁剪它

Python OpenCV从二进制图像中检测白色对象并裁剪它,第1张

概述我的目标是从这个二进制图像中检测一张白纸然后裁剪这张白纸,并为这份白皮书制作一个新的子集二进制图像. 现在我的OpenCV Python代码可以找到这份白皮书.第一步,我创建了一个用于查找此白皮书的掩码: 正如你们所看到的,小的白噪声和小块已被删除.然后问题变成了如何从这个二进制图像中裁剪这个白皮书对象来制作一个新的子集二进制图像? 我目前的代码是: import cv2import numpy 我的目标是从这个二进制图像中检测一张白纸然后裁剪这张白纸,并为这份白皮书制作一个新的子集二进制图像.

现在我的OpenCV Python代码可以找到这份白皮书.第一步,我创建了一个用于查找此白皮书的掩码:

正如你们所看到的,小的白噪声和小块已被删除.然后问题变成了如何从这个二进制图像中裁剪这个白皮书对象来制作一个新的子集二进制图像?

我目前的代码是:

import cv2import numpy as npQR = cv2.imread('img_0352.TIF',0) mask = np.zeros(QR.shape,np.uint8) contours,hIErarchy = cv2.findContours(QR,cv2.RETR_List,cv2.CHAIN_APPROX_SIMPLE)for cnt in contours:    if cv2.contourArea(cnt)>1000000:        cv2.drawContours(mask,[cnt],255,-1)

寻找cnt var,有四个元素,但它们对我来说是无稽之谈.
我使用代码来装箱:

x,y,w,h = cv2.boundingRect(cnt)cv2.rectangle(img,(x,y),(x+w,y+h),(0,0),2)

盒子信息似乎不正确.

谢谢你的任何建议.

跟进:
我已经弄清楚了这个问题,这很容易.代码附后:

import cv2import numpy as npQR_orig = cv2.imread('CamR_img_0352.TIF',0)QR = cv2.imread('img_0352.TIF',0) # read the QR code binary image as grayscale image to make sure only one layermask = np.zeros(QR.shape,np.uint8) # mask image the final image without small pIEces# using findContours func to find the none-zero pIEcescontours,cv2.CHAIN_APPROX_SIMPLE)# draw the white paper and eliminate the small pIEces (less than 1000000 px). This px count is the same as the QR code dectectionfor cnt in contours:    if cv2.contourArea(cnt)>1000000:        cv2.drawContours(mask,-1) # the [] around cnt and 3rd argument 0 mean only the particular contour is drawn        # Build a ROI to crop the QR        x,h = cv2.boundingRect(cnt)        roi=mask[y:y+h,x:x+w]        # crop the original QR based on the ROI        QR_crop = QR_orig[y:y+h,x:x+w]        # use cropped mask image (roi) to get rID of all small pIEces        QR_final = QR_crop * (roi/255)cv2.imwrite('QR_final.TIF',QR_final)
解决方法 轮廓对象是包围检测到的对象的点的任意向量(列表).

实现这一目标的一个简单的脑死亡方法是在阈值处理后遍历所有像素,然后简单地复制白色像素.

我相信findContours()会改变图像(副作用),所以检查QR.

但是,您需要(通常)获得最大的轮廓.
例:

# Choose largest contourbest = 0maxsize = 0count = 0for cnt in contours:    if cv2.contourArea(cnt) > maxsize :        maxsize = cv2.contourArea(cnt)        best = count    count = count + 1x,h = cv2.boundingRect(cnt[best])cv2.rectangle(img,2)
总结

以上是内存溢出为你收集整理的Python OpenCV从二进制图像中检测白色对象并裁剪它全部内容,希望文章能够帮你解决Python OpenCV从二进制图像中检测白色对象并裁剪它所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1197115.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存