当前位置: 首页 > news >正文

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()

相关文章:

  • Gan生成手写数字
  • 基于Springboot+Vue开发前后端端分离农产品进销存系统
  • poi-tl 用word模板生成报告
  • leveldb-FilterBlock实现
  • 关于移动端H5获取微信非静默授权被拦截进入【微信快照页】问题及解决方案
  • token和JWT token区别、登录安全、页面权限、数据权限、单点登录
  • Liteos信号量的使用
  • 基于Verilog搭建一个卷积运算单元的简单实现
  • pytorch-实现mnist手写数字识别(彩色)
  • C/C++语言100题练习计划 99——找第一个只出现一次的字符
  • Go使用Gin+mysql实现增删改查
  • PIE-Engine:房山区洪涝灾害风险评价
  • 【我的渲染技术进阶之旅】如何编译Filament的windows版本程序?
  • 03 C++ 字符串、向量和数组
  • python 代码 C 执行
  • Apache的80端口被占用以及访问时报错403
  • Effective Java 笔记(一)
  • PHP变量
  • underscore源码剖析之整体架构
  • webgl (原生)基础入门指南【一】
  • 成为一名优秀的Developer的书单
  • 读懂package.json -- 依赖管理
  • 使用Swoole加速Laravel(正式环境中)
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 一个SAP顾问在美国的这些年
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • #git 撤消对文件的更改
  • #Java第九次作业--输入输出流和文件操作
  • (bean配置类的注解开发)学习Spring的第十三天
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (三分钟)速览传统边缘检测算子
  • (十三)Maven插件解析运行机制
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)甲方乙方——赵民谈找工作
  • .NET CF命令行调试器MDbg入门(一)
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • /bin、/sbin、/usr/bin、/usr/sbin
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @ConfigurationProperties注解对数据的自动封装
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [android] 手机卫士黑名单功能(ListView优化)
  • [Android]如何调试Native memory crash issue
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [CC2642R1][VSCODE+Embedded IDE+IAR Build+Cortex-Debug] TI CC2642R1基于VsCode的开发环境
  • [LeetCode] 148. Sort List 链表排序
  • [Linux] CE知识随笔含Ansible、防火墙、VIM、其他服务
  • [node] Node.js 缓冲区Buffer
  • [one_demo_8]十进制转二进制
  • [THUPC 2024 初赛] 二进制 (树状数组单点删除+单点查询)(双堆模拟set)
  • [Vue 配置] Vite + Vue3 项目配置和使用 NProgress
  • [Vue安装教程]十分钟学会vue 安装
  • [贰],万能开篇HelloWorld