python学opencv|读取图像(四十)掩模:三通道图像的局部覆盖

【1】引言

前序学习了使用numpy创建单通道的灰色图像,并对灰色图像的局部进行了颜色更改,相关链接为:

python学opencv|读取图像(九)用numpy创建黑白相间灰度图_numpy生成全黑图片-CSDN博客

之后又学习了使用numpy创建三通道的彩色图像,并对彩色图像按照不同通道进行了颜色更改,相关链接为:

python学opencv|读取图像(十)用numpy创建彩色图像_python新建一张caise的图片-CSDN博客

实际上还会有一些需求,只需要改变三通道彩色图像的局部颜色,也就是获得掩模效果,这就是今天文章的目标。

【2】可行性分析

根据上述文章,修改彩色图像的颜色是通过修改各个通道的BGR值实现的,修改灰度图像的颜色是通过修改各个像素点的BGR(本质上由于只有一个通道,所以本质上也是通过修改通道的BGR值实现 )实现。

import numpy as np  # 引入numpy模块
import cv2 as cv  # 引入cv模块canvas = np.ones((580, 580, 3), np.uint8)   # 绘制一个580*580大小的画布,3代表有3个通道,unit8为图像存储格式

那如果对彩色图像直接修改像素点的BGR,应该也会有颜色变化。

【3】代码测试

在上述分析的基础上,直接尝试修改像素点的BGR值。

首先是引入相关模块,绘制出画布,此时的画布为纯黑色:

import numpy as np  # 引入numpy模块
import cv2 as cv  # 引入cv模块canvas = np.ones((580, 580, 3), np.uint8)   # 绘制一个580*580大小的画布,3代表有3个通道,unit8为图像存储格式

然后在纯黑色的画布上,先把第50到300行,第20到280列改为纯白色像素,然后显示完整的画布:

canvas[50:300,20:280,:]=255 #第50到300行,第20到280列为纯白色像素cv.imshow('yanmo', canvas)  # 在屏幕展示掩模的效果
cv.imwrite('yanmo.png', canvas)  # 保存图像

之后把画布改为纯白色,相应的把区域第50到300行,第20到280列改为纯黑色像素,然后显示完整的画布:

canvas[:,:,:]=255 #画布改为纯白色像素
canvas[50:300,20:280,:]=0 #第50到300行,第20到280列为纯黑色像素
cv.imshow('yanmo1', canvas)  # 在屏幕展示掩模的效果cv.imwrite('yanmo1.png', canvas)  # 保存图像
cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

代码运行后,获得的掩模效果为:

图1 黑色画布白色掩模

图2 白色画布黑色掩模 

 由图1和 图2可见,三通道彩色图像,通过改像素点值的做法,也能实现修改图像区域颜色的目标,也就是实现掩模效果。

此时的完整代码为:

import numpy as np  # 引入numpy模块
import cv2 as cv  # 引入cv模块canvas = np.ones((580, 580, 3), np.uint8)   # 绘制一个580*580大小的画布,3代表有3个通道,unit8为图像存储格式canvas[50:300,20:280,:]=255 #第50到300行,第20到280列为纯白色像素cv.imshow('yanmo', canvas)  # 在屏幕展示掩模的效果
cv.imwrite('yanmo.png', canvas)  # 保存图像canvas[:,:,:]=255 #画布改为纯白色像素
canvas[50:300,20:280,:]=0 #第50到300行,第20到280列为纯黑色像素
cv.imshow('yanmo1', canvas)  # 在屏幕展示掩模的效果cv.imwrite('yanmo1.png', canvas)  # 保存图像
cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

【4】细节说明

在彩色图像的掩模效果实现中,未单独设置BGR通道值。

尝试修改第二通道值,只需要增加代码:

canvas[:,:,:]=255 #画布改为纯白色像素
canvas[50:300,20:280,:]=0 #第50到300行,第20到280列为纯黑色像素
canvas[:,:,1]=0 #第二个通道值
cv.imshow('yanmo2', canvas)  # 在屏幕展示掩模的效果
cv.imwrite('yanmo2.png', canvas)  # 保存图像

此时新获得的图像为:

图3 白色画布黑色掩模 + 所有二通道值=0

图3出现了预料之外的结果,为探清缘由,在所有的掩模操作下增加代码,读取掩模区域中的像素点BGR值:

print("黑色画布白色掩模像素数为[100,100]位置处的BGR=", canvas[100, 100])  # 获取像素数为[100,100]位置处的BGR

这时候获得的BGR输出值为:

图4  BGR值

可见,由于画布颜色强制为白色,所有的BGR值本来是统一为255,但把第二通道的值改为0后,画布的BGR组成就变为[255 0 255],这时候画布就变成粉红色。

为证明上述分析,新增一段代码来做验证:

canvas[:,:,:]=255 #画布改为纯白色像素
canvas[:,:,1]=0 #第二个通道值
cv.imshow('yanmo3', canvas)  # 在屏幕展示掩模的效果
cv.imwrite('yanmo3.png', canvas)  # 保存图像
print("白色画布+所有二通道BGR=0像素数为[100,100]位置处的BGR=", canvas[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("白色画布+所有二通道BGR=0像素数为[500,500]位置处的BGR=", canvas[100, 100])  # 获取像素数为[500,500]位置处的BGR

此时,先规划白色画布,然后直接强制第二通道值为0。

代码运行后,获得的图像为:

图5 白色画布+所有二通道值=0

此时输出的图像为粉红色,读取的像素点BGR为:

图6 白色画布+所有二通道值像素BGR值

由图6可见,各个像素点的BGR值都是[255 0 255],和图3所示的粉红色图像相应像素点的BGR值读取效果一致。

【5】总结

掌握了python+opencv三通道彩色图像掩模效果的实现技巧。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/66621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统常用指令

查找文件 find / -name "<文件名>" 2>/dev/null //遍历系统查找指定文件名文件ls -l | grep "<文件名>" //列出当前目录下有关文件名的文件find -name sw_sfp_alarm_cfg.xml //查找文件名对应路径 切换目录 编辑文件 vi <文件…

【Unity】ScrollViewContent适配问题(Contentsizefilter不刷新、ContentSizeFilter失效问题)

最近做了一个项目&#xff0c;菜单栏读取数据后自动生成&#xff0c;结果用到了双重布局 父物体 尝试了很多方式&#xff0c;也看过很多大佬的文章&#xff0c;后来自己琢磨了一下&#xff0c;当子物体组件自动生成之后&#xff0c;使用以下以下代码效果会好一些&#xff1a; …

AI辅助医学统计分析APP

AI辅助医学统计分析APP 医学统计分析的困难点在于开始阶段分析的规划和得出分析结果之后分析结果的解释&#xff0c;前者之所以困难是因为分析方法繁多又有不同的使用条件&#xff0c;后者则是因为结果中术语较多&#xff0c;且各种分析方法术语又有不同&#xff0c;非统计专业…

[STM32 HAL库]串口中断编程思路

一、前言 最近在准备蓝桥杯比赛&#xff08;嵌入式赛道&#xff09;&#xff0c;研究了以下串口空闲中断DMA接收不定长的数据&#xff0c;感觉这个方法的接收效率很高&#xff0c;十分好用。方法配置都成功了&#xff0c;但是有一个点需要进行考虑&#xff0c;就是一般我们需要…

AutoSar架构学习笔记

1.AUTOSAR&#xff08;Automotive Open System Architecture&#xff0c;汽车开放系统架构&#xff09;是一个针对汽车行业的软件架构标准&#xff0c;旨在提升汽车电子系统的模块化、可扩展性、可重用性和互操作性。AUTOSAR的目标是为汽车电子控制单元&#xff08;ECU&#xf…

算法竞赛之差分进阶——等差数列差分 python

目录 前置知识进入正题实战演练 前置知识 给定区间 [ l, r ]&#xff0c;让我们把数组中的[ l, r ] 区间中的每一个数加上c,即 a[ l ] c , a[ l 1 ] c , a[ l 2] c , a[ r ] c; 怎么做&#xff1f;很简单&#xff0c;差分一下即可 还不会的小伙伴点此进入学习 进入正题 …

TDengine 做 Apache SuperSet 数据源

‌Apache Superset‌ 是一个现代的企业级商业智能&#xff08;BI&#xff09;Web 应用程序&#xff0c;主要用于数据探索和可视化。它由 Apache 软件基金会支持&#xff0c;是一个开源项目&#xff0c;它拥有活跃的社区和丰富的生态系统。Apache Superset 提供了直观的用户界面…

金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践

导读&#xff1a;中信银行信用卡中心每日新增日志数据 140 亿条&#xff08;80TB&#xff09;&#xff0c;全量归档日志量超 40PB&#xff0c;早期基于 Elasticsearch 构建的日志云平台&#xff0c;面临存储成本高、实时写入性能差、文本检索慢以及日志分析能力不足等问题。因此…

虚幻商城 Fab 免费资产自动化入库

文章目录 一、背景二、实现效果展示三、实现自动化入库一、背景 上一次写了个这篇文章 虚幻商城 Quixel 免费资产一键入库,根据这个构想,便决定将范围扩大,使 Fab 商城的所有的免费资产自动化入库,是所有!所有! 上一篇文章是根据下图这部分资产一键入库: 而这篇文章则…

游戏为什么失败?回顾某平庸游戏

1、上周玩了一个老鼠为主角的游戏&#xff0c;某平台喜1送的&#xff0c; 下载了很久而一直没空玩&#xff0c;大约1G&#xff0c;为了清硬盘空间而玩。 也是为了拔掉心中的一根刺&#xff0c;下载了而老是不玩总感觉不舒服。 2、老鼠造型比较写实&#xff0c;看上去就有些讨…

亲测有效!如何快速实现 PostgreSQL 数据迁移到 时序数据库TDengine

小T导读&#xff1a;本篇文章是“2024&#xff0c;我想和 TDengine 谈谈”征文活动的优秀投稿之一&#xff0c;作者从数据库运维的角度出发&#xff0c;分享了利用 TDengine Cloud 提供的迁移工具&#xff0c;从 PostgreSQL 数据库到 TDengine 进行数据迁移的完整实践过程。文章…

C#,入门教程(01)—— Visual Studio 2022 免费安装的详细图文与动画教程

通过本课程的学习&#xff0c;你可以掌握C#编程的重点&#xff0c;享受编程的乐趣。 在本课程之前&#xff0c;你无需具备任何C#的基础知识&#xff0c;只要能操作电脑即可。 不过&#xff0c;希望你的数学不是体育老师教的。好的程序是数理化的实现与模拟。没有较好的数学基础…

Linux探秘坊-------3.开发工具详解(2)

1.动静态库和动静态链接&#xff08;操作&#xff09; 静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件 ⽐较⼤,但在运⾏时也就不再需要库⽂件了。其后缀名⼀般为“.a” 动态库与之相反,在编译链接时并 没有把库⽂件的代码加⼊到可执⾏⽂件中 ,⽽…

电脑开机出现Bitlock怎么办

目录 1.前言 2.产生原因&#xff1a; 1.系统异常关机 2.系统更新错误 3.硬件更换 4.CMOS电池问题 5.出厂设置 6.意外情况 3.解锁步骤&#xff1a; 3.1&#xff1a;记住密钥ID&#xff08;前6位&#xff09; 3.2&#xff1a;打开aka.ms/myrecoverykey网址 3.3&#…

Avalonia系列文章之小试牛刀

最近有朋友反馈&#xff0c;能否分享一下Avalonia相关的文章&#xff0c;于是就抽空学习了一下&#xff0c;发现Avalonia真的是一款非常不错的UI框架&#xff0c;值得花时间认真学习一下&#xff0c;于是边学习边记录&#xff0c;整理成文&#xff0c;分享给大家&#xff0c;希…

springboot自动配置原理(高低版本比较)spring.factories文件的作用

SpringBootApplication public class SpringSecurityApplication {public static void main(String[] args) {SpringApplication.run(SpringSecurityApplication.class, args);}}注解SpringBootApplication Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Doc…

vue2 - Day05 - VueX

Vuex 是 Vue.js 官方的状态管理库。它是一个让你能在应用中集中管理共享状态的工具。当应用的规模逐渐增大&#xff0c;组件之间的数据传递变得越来越复杂时&#xff0c;Vuex 就成为了救星&#xff0c;提供了一个集中式的存储来管理所有的组件状态&#xff0c;并且保证状态以一…

IDEA导入Maven工程不识别pom.xml

0 现象 把阿里 sentinel 项目下载本地后&#xff0c;IDEA 中却没显示 maven 工具栏。 1 右键Maven Projects 点击IDEA右侧边栏的Maven Projects&#xff0c;再点击&#xff1a; 在出现的选择框中选择指定的未被识别的pom.xml即可&#xff1a; 2 Add as maven project 右键p…

VUE学习笔记(入门)5__vue指令v-html

v-html是用来解析字符串标签 示例 <!doctype html> <html lang"en"> <head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document<…

OSPF的LSA的学习研究

OSPF常见1、2、3、4、5、7类LSA的研究 1、拓扑如图&#xff0c;按照地址表配置&#xff0c;激活OSPF划分相关区域并宣告相关网段 2、1类LSA&#xff0c;每台运行了OSPF的路由器都会产生&#xff0c;描述了路由器的直连接口状况和cost 可以看到R1产生了一条router lsa&#xff0…