首页 > 解决方案 > 如何使用opencv python根据形状裁剪图像

问题描述

我在裁剪图像(眼镜)以提取框架部分(应删除其他部分)时遇到问题。由于没有特定的形状,所以我无法应用基于特定几何形状的检测方法。输入图像是 在此处输入图像描述

预期的输出类似于 在此处输入图像描述

我采取了一种去除背景的方法(主要是背景是白色的),然后是阈值和轮廓查找,没有特定颜色的过滤器,因为它可以是任何颜色,

import cv2 
im = cv2.imread('org.jpg')

# Plain contour mrthod
imz = im[300:, :700]  #  Manually defind teh ROI
gray = cv2.cvtColor(imz, cv2.COLOR_BGR2GRAY)
blur = cv2.blur(gray, (5,5))
#ret, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_OTSU)
ret, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
contours, heirarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key=cv2.contourArea, reverse=True)
cv2.drawContours(imz, contours, -1, (0,255,0), 2)
cv2.imshow('imz_cont', imz)
cv2.imwrite("imz_cont.png", imz)
if cv2.waitKey(0):
    cv2.destroyAllWindows()

所以,在这里我得到了检测到的轮廓,(是的,我已经尝试改变阈值参数和模糊内核值),仍然无法得到预期的结果。

甚至尝试了grabcut方法,但我相信它需要一个矩形(ROI)开始,然后在这种情况下,如果我必须给出一个封闭的矩形,那么镜头部分和一些太阳穴部分将在那里。

所以我只是想不出一种可能的方法,可能有一些形状基近似方法,比如如何根据二进制视频帧中的近似形状过滤轮廓,但在我的情况下,它是区域独立的,我是无法理解 approcploydp 或 cv2.fitEllipse 概念。

所以在这里需要一些帮助/建议,如果有人尝试过这样的事情,请提供帮助。如果不是代码片段,请告诉我我会尝试的方法。提前致谢。

即使我不确定问题标题是否适合问题陈述:)

标签: pythonopencvimage-processingopencv-python

解决方案


推荐阅读