python根据多边形polygon生成掩膜图像问题cv2.fillPoly()和cv2.fillConvexPoly()

上图说一下需求:
在这里插入图片描述
在这里插入图片描述

目标是根据画的多边形生成掩膜(即白色区域)图像,生成的图像大小与原图大小保持一致,在对应位置生成掩膜。

处理方式:
1、把画的多边形的各顶点坐标读出,要的是在图像中的像素坐标
2、生成与原图大小一致的全为0或1的图用于后续使用
3、根据cv2库的fillPoly函数在全0或全1 图的对应多边形位置进行填充
4、输出填充后得到掩膜的图像cv2.imwrite

以上就是基本流程,python代码也是呼之欲出了,

注意的问题:

一张图像上可能有多个多边形掩膜要输出,要注意遍历多边形在同一张图像中生成掩膜输出

我期间碰到的问题:

opencv含有两个函数可将多边形区域进行像素填充,分别是cv2.fillConvexPoly() 和 cv2.fillPoly(),两个函数略有区别,导致生成结果的效果存在差异:
在这里插入图片描述
左侧是cv2.fillConvexPoly()的输出结果,右侧是cv2.fillPoly()的输出结果。
可以看出左侧图像他能准确的描绘多边形的边缘,但是多边形内部的一些区域不能准确填充像素,造成掩膜生成失败,
而右侧的另一个函数的生成效果则完美的符合多边形的区域。

关于两个函数:(个人查找资料后就当做个笔记)
1、cv2.fillConvexPoly()函数可以用来填充凸多边形,只需要提供凸多边形的顶点

img = np.zeros((1080, 1920, 3), np.uint8)
triangle = np.array([[0, 0], [1500, 800], [500, 400]])
 
cv2.fillConvexPoly(img, triangle, (255, 255, 255))
 
cv2.imwrite('./1.jpg',img)

2、cv2.fillPoly()函数可以用来填充任意形状的图型.可以用来绘制多边形,工作中也经常使用非常多个边来近似的画一条曲线.cv2.fillPoly()函数可以一次填充多个图型.

多个区域传入要加 “[ ]”

img = np.zeros((1080, 1920, 3), np.uint8)
area1 = np.array([[250, 200], [300, 100], [750, 800], [100, 1000]])
area2 = np.array([[1000, 200], [1500, 200], [1500, 400], [1000, 400]])
 
cv2.fillPoly(img, [area1, area2], (255, 255, 255))
 
cv2.imwrite('./2.jpg',img)

半透明填充:
有时候希望有半透明的填充效果,可以用cv2.addWeighted方法

alpha = 0.7
beta = 1-alpha
gamma = 0
img_add = cv2.addWeighted(img1, alpha,img2, beta, gamma)
cv2.imwrite('final ret.jpg',img_add)
cv2.imshow('img_add',img_add)
if cv2.waitKey(500) and 0xff == ord('q'):
    cv2.destroyAllWindows()

猜你喜欢

转载自blog.csdn.net/qq_44442727/article/details/127114134