python - 如何使用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 概念。
所以在这里需要一些帮助/建议,如果有人尝试过这样的事情,请提供帮助。如果不是代码片段,请告诉我我会尝试的方法。提前致谢。
即使我不确定问题标题是否适合问题陈述:)
解决方案
推荐阅读
- c# - 如何在 NUnit 中模拟 IOptions?
- r - 如何在ggplot中的不均匀中断之间获得相等的间距
- c - 我可以从 wdf 驱动程序检查另一个设备的存在吗?
- lua - 如果玩家 startergui 中的值为真,我想在玩家触摸时打开一扇门
- java - 如何使用 getIntent().getSerializableExtra 从数据库中检索数据
- freemarker - 如何在 FreeMarker 中嵌套相同的自定义指令?
- java - curl请求minikube超时,不明白为什么
- oracle - oracle中如何使用sql游标属性
- python - Numpy:如何将 (4, ) 数组和 (9, 9) 数组添加到 (9, 9, 4) 数组?
- python-3.x - 通过拆分值在熊猫数据框中创建一列