Python 如何从该图像中裁剪手机?

Python 如何从该图像中裁剪手机?,python,opencv,crop,Python,Opencv,Crop,我想从下图裁剪手机: 为此,我尝试检测图像中的矩形,然后使用以下代码裁剪图像: import cv2 import numpy as np img = cv2.imread('rt1.jpg') imgGry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret , thrash = cv2.threshold(imgGry, 240 , 255, cv2.CHAIN_APPROX_NONE) contours , hierarchy = cv2.fin

我想从下图裁剪手机:

为此,我尝试检测图像中的矩形,然后使用以下代码裁剪图像:

import cv2
import numpy as np

img = cv2.imread('rt1.jpg')

imgGry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret , thrash = cv2.threshold(imgGry, 240 , 255, cv2.CHAIN_APPROX_NONE)
contours , hierarchy = cv2.findContours(thrash, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
j=0
for contour in contours:
    approx = cv2.approxPolyDP(contour, 0.01* cv2.arcLength(contour, True), True)
    cv2.drawContours(img, [approx], 0, (0, 0, 0), 5)
    if len(approx) == 4 :
        x, y , w, h = cv2.boundingRect(approx)
        cv2.putText(img, "mobile", (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 0, 0))
        out = img[y:y+h,x:x+w]
        cv2.imwrite('cropped'+str(j)+'.jpg', out)
        j = j+1
cv2.imshow('shapes', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

但这并没有影响手机。您能否建议对代码进行任何改进以获得所需的结果?

无需对轮廓进行近似处理。对于该特定图像,您将获得一个大轮廓,您可以简单地从中获取边界矩形,并裁剪所需的部分。我可选地添加了背景透明设置

导入cv2
将numpy作为np导入
#读取图像,转换为灰度
img=cv2.imread('images/2EZyS.jpg')
灰色=cv2.CVT颜色(img,cv2.COLOR\U BGR2GRAY)
#阈值图像,注意:cv2.THRESH\u BINARY\u INV!
thr=cv2.阈值(灰色,240255,cv2.阈值二元值[1]
#查找轮廓w.r.t.OpenCV版本,注意:cv2.RETR\u外部!
cnts=cv2.找到的孔(thr、cv2.外部翻新、cv2.链约无)
如果len(cnts)==2个其他cnts[1],则cnts=cnts[0]
#按大小过滤轮廓
cnts=[如果cv2.contourArea(cnt)>2000,则cnt中cnt的cnt为cnt]
thr=cv2.绘制轮廓(np.类零(thr),CNT,-1255,cv2.填充)
#准备输出
out=img.copy()
#可选:将背景设置为透明。
out=cv2.CVT颜色(img、cv2.COLOR\U BGR2BGRA)
out[…,3]=thr
#收成
x、 y,w,h=cv2.boundingRect(thr)
out=out[y:y+h,x:x+w]
#使用透明和不使用透明进行保存
cv2.imwrite('crop_w.png',out)
cv2.imwrite('crop_wo.png',out[…,:3])
这将是具有透明度的输出图像:

在原始代码中,您在
cv2.threshold
调用中使用了
cv2.CHAIN\u APPROX\u NONE
。碰巧,该值等于
1
,也就是
cv2.THRESH\u BINARY\u INV
。然而,你应该注意这些细节

此外,我会在这里使用
cv2.RETR\u EXTERNAL
而不是
cv2.RETR\u TREE
,因为您只有一个对象,因此找到最外部的轮廓就足够了

----------------------------------------
系统信息
----------------------------------------
平台:Windows-10-10.0.16299-SP0
Python:3.9.1
NumPy:1.20.2
OpenCV:4.5.1
----------------------------------------