【OpenCV】数字图像的表示 | 图像IO操作接口 | 图像混合操作

news2025/1/11 23:02:07


 


 

Ⅰ. 数字图像的表示

0x00 位数

计算机采用0/1编码的系统,数字图像也是利用0/1来记录信息。
我们平常接触的图像都是8位数图像,包含0~255灰度。

  •  0:代表最黑
  •  1:表示最白


 

0x01 二值图像

一幅二值图像的二维矩阵仅由0、1两个值构成;

“0”代表黑色,“1”代白色。由于每一像素(矩阵中每一元素)。

其取值仅有 0 和 1 两种可能,所以计算机中二值图像的数据类型通常为 1 个二进制位。

二值图像通常用于文字、线条图的扫描识别 (OCR) 和掩膜图像的存储。

  

灰度图:

每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度。

尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。

灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;

但是,灰度图像在黑色与白色之间还有许多级的颜色深度。

灰度图像经常是在单个电磁波频谱如可见光内测量每个像素的亮度得到的,

用于显示的灰度图像通常用每个采样像素8位的非线性尺度来保存,

这样可以有256级灰度(如果用16位,则有65536级)。

彩色图:

每个像素通常是由  RGB 三个分量来表示的,分量介于  (0,255)  。

RGB 图像与索引图像一样都可以用来表示彩色图像。

与索引图像一样,它分别用 RGB 三原色的组合来表示每个像素的颜色。

但与索引图像不同的是,RGB 图像每一个像素的颜色值(由 RGB 三原色表示),

直接存放在图像矩阵中,由于每一像素的颜色需由 RGB 三个分量来表示,

M,N 分别表示图像的行列数,

3 个M\times N 的二维矩阵分别表示各个像素的 RGB 三个颜色分量。

RGB 图像的数据类型一般为 8 位无符号整形,通常用于表示和存放真彩色图像。

  • 像素点取值范围:0-255
     


Ⅱ. OpenCV 基本操作

0x00 图像 I/O 操作的 API

 cv2.imread()     # 读取图像
  • cv2.IMREAD*COLOR:以彩色模式加载图像,任何图像的透明度都被忽略,这是默认参数。
  • cv2.IMREAD*GRAYSCALE:以灰度模式加载图像
  • cv.IMREAD_UNCHANGED:包括alpha通道的加载图像模式。

* 注: 可以使用 1、0 或者 -1 来替代上面三个标志

cv2.imshow():     #显示图像


📌 注意:在调用显示图像的 API 后,要调用 cv.waitKey() 给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来。

cv2.imwrite():        #保存图像

在图像上绘制几何图像:

  •  cv2.line(): 绘制直线
  •  cv2.circle(): 绘制圆形
  •  cv2.rectangle(): 绘制矩形
  •  cv2.putText(): 在图像上添加文字

直接使用行列索引获取图像中的像素并进行修改

图像的属性:

 
 拆分通道:

cv.split()

  通道合并:

cv.merge()

 色彩空间的改变:

cv.cvtColor(input_image,flag)

💎 举例:

  •  数据读取 —— 图像:
image = cv2.imread("sunshine.jpg")
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Over theClouds - gray", gray_image)
cv2.waitKey(0)#等待时间,毫秒级,0表示按任意键终止

  • 截取部分图像数据
img = cv2.imread("sunshine.jpg")#读取图片
sunshine = img[0:80, 10:200]#切片
cv2.imshow("sunshine", sunshine)
cv2.waitKey(0)#等待时间,毫秒级,0表示按任意键终止
  • 颜色通道提取

颜色排列为 B G R  (与三原色 RGB 相反)

只保留 R 通道

img[:, :, 0] = 0
img[:, :, 1] = 0

只保留 G 通道 

img[:, :, 0] = 0
img[:, :, 2] = 0

边界填充:

top_size, bottom_size, left_size, right_size = (200, 200, 200, 200)
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REFLECT)
reflect_101= cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_CONSTANT, value=0)#zero padding
plt.subplot(231), plt.imshow(sunshine), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect), plt.title('REFLECT')
plt.subplot(234), plt.imshow(reflect_101), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant), plt.title('CONSTANT')

  • BORDER_REPLICATE:复制法,复制最边缘像素
  • BORDER_REFLECT: 反射法,对感兴趣的图像中的像素在两边进行复制
  • BORDER_REFLECT_101:反射法,一最边缘的像素为轴
  • BORDER_WRAP:外包装法
  • BORDER_CONSTANT:常量法,常数值填充 
     

0x01  算数操作

图像的加法:

你可以使用 OpenCV 的 cv.add() 函数把两幅图像相加,

或者可以简单地通过 Numpy 操作添加两个图像。

譬如  res = img1 + img2 ,两个图像应具有相同的大小和类型,或第二个图像可以是标量值。


📌 注意:

\textrm{OpenCV } 加法和 Numpy 加法之间存在差异,\textrm{OpenCV }的加法是饱和操作,而 Numpy 添加是模运算。


💬 参考以下代码:

>>> x = np.uint8([250])
>>> y = np.uint8([10])
>>> print( cv.add(x,y) ) # 250+10 = 260 => 255
[[255]]
>>> print( x+y )          # 250+10 = 260 % 256 = 4
[4]


这种差别在你对两幅图像进行加法时会更加明显,\textrm{OpenCV } 的结果会更好一点。

所以我们尽量使用 \textrm{OpenCV } 中的函数。


图像融合:

这其实也是加法,但是不同的是两幅图像的权重不同,

这就会给人一种混合或者透明的感觉。

图像混合的计算公式如下:

{\color{Red} g(x)} = (1-\alpha )\, f0(x) + \alpha f1(x)

通过修改 \alpha 的值( 0\rightarrow 1),可以实现非常炫酷的混合!

💎 示例:

img_sunshine = cv2.resize(img_sunshine, (500, 250))
img_cloud = cv2.resize(img_cloud, (500, 250))

res = cv2.addWeighted(img_sunshine, 0.4, img_cloud, 0.6, 0)
plt.imshow(res)
plt.show()

res2 = cv2.resize(img_sunshine, (0, 0), fx=3, fy=1)
plt.imshow(res2)
plt.show()

总结:
1. 图像加法:将两幅图像加载一起
cv.add()

2. 图像的混合:将两幅图像按照不同的比例进行混合
cv.addweight()

注意:这里都要求两幅图像是相同大小的。

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

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

相关文章

VTK-vtkAbstractTransform及其子类

前言:本博文主要研究vtkAbstractTransform及其子类的实现原理,以及由此扩展的类。 目录 vtkAbstractTransform vtkGeneralTransform vtkGeoSphereTransform(9.0.3中没有该接口) vtkGeoTransform(9.0.3中没有该接口) vtkHomogeneousTransform vtkId…

企业微信客户联系自定义工具栏开发

一、问题说明:企业微信中私聊微信客户,在聊天输入框上面有一行快捷工具,这边怎么自定义开发?如下图,我们可以点击快捷发送,然后弹出一个页面,页面中有我们需要发送给当前会话的各种资源&#xf…

Maven高级-聚合-继承

多模块构建维护 作用&#xff1a;聚合用于快速构建maven工程&#xff0c;一次性构建多个项目/模块。 制作方式&#xff1a; 创建一个空模块&#xff0c;打包类型定义为pom <packaging>pom</packaging>定义当前模块进行构建操作时关联的其他模块名称 <modules&g…

2021年MathorCup高校数学建模挑战赛—大数据竞赛B题信息流智能推荐算法中的序列评估问题求解全过程文档及程序

2021年MathorCup高校数学建模挑战赛—大数据竞赛 B题 信息流智能推荐算法中的序列评估问题 原题再现&#xff1a; 随着互联网信息的蓬勃发展&#xff0c;用户在使用互联网应用时面临着信息过载的问题。推荐算法的出现&#xff0c;满足了用户个性化的内容消费需求&#xff0c;…

分布式任务调度系列 - XXL-JOB

一、前言 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 二、传统的定时任务 1. 概念 1.1、定时任务的基本概念 程序为解决一个信息处理任务而预先编制的工作执行方案&#xff0c;这就是定时任务&#xff0c;核心组成如下&#xff1a; 执行器&#…

28个数据可视化图表的总结和介绍

数据可视化本身就是一种通用语言。我们这里通用语言的意思是&#xff1a;它能够向各行各业的人表示信息。它打破了语言和技术理解的障碍。数据是一些数字和文字的组合&#xff0c;但是可视化可以展示数据包含的信息。 “数据可视化有助于弥合数字和文字之间的差距”——Brie E…

C++入门——引用

1.概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量共用同一块内存空间 类型& 引用变量名(对象名) 引用实体&#xff1b; 而引用类型必然要与引用实体的类型一致。 …

下载微信小程序中的视频

工具准备&#xff1a;Fiddler 我这里用的5.0的版本。&#xff08;这个用来抓取视频下载地址&#xff09;Internet Download Manager&#xff08;idm&#xff09;版本6.37&#xff08;这个用来下载视频&#xff09;步骤&#xff1a;打开Fiddler如下图配置后抓包2.登录PC版微信&a…

1.5日报

今天完成项目环境的搭建&#xff0c;并成功剥离TestMrl相关接口&#xff0c;并成功运行 遇到的问题&#xff1a; 缺少 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <v…

展望2023,回首2022,让我们一起努力

回首2022 时光如白驹过隙般&#xff0c;飞逝而过。时光荏苒&#xff0c;日月如梭。不知不觉中&#xff0c;充满希望与光明的2023年已经到来了。回首2022年&#xff0c;有喜悦&#xff0c;有失落&#xff0c;有艰辛与困难&#xff0c;也有解决困难后的欣慰&#xff0c;有着无数…

第03章 运算符

运算符介绍 运算符是一种特殊的符号&#xff0c;用以表示数据间的运算、赋值和比较等。 算数运算符 算数运算符用于对数值型变量间的计算。 注意&#xff1a;图片中最后一行&#xff0c;字符串相加的结果中间没有空格&#xff0c;这个课件错误❌。 除法[ / ] System.out.pr…

RabbitMQ 消息类型

RabbitMQ 消息类型 下面我们简单介绍下RabbitMQ的一些消息种类&#xff0c;并结合Java代码进行学习。 如果需要执行代码&#xff0c;需要下载RabbitMQ的客户端&#xff08;例如java客户端&#xff1a; https://www.rabbitmq.com/java-client.html&#xff09; 使用maven&…

聊天突然尬住?教你用Python一键获取斗图表情包,各种表情包轻松化解尴尬

很多兄弟在聊天上没有下太多的功夫&#xff0c;导致自己聊天的时候很容易尬住&#xff0c;然后就不知道聊啥了&#xff0c;这时候合适表情包分分钟就能救场&#xff0c;但是一看自己收藏的表情包&#xff0c;好家伙&#xff0c;两只手都数得过来。 所以今天来给兄弟们分享一下…

IDEA书签,备份使用,全分支共享

IDEA原本设计就是给单分支保存书签使用的&#xff0c;但是我比较喜欢多个分支用同一个IDEA书签。然后在网上找到很久的IDEA书签全分支共享的办法&#xff0c;真心没找到合适的&#xff0c;自己浅浅总结了一下。首先找到我们需要备份书签的项目的目录然后在项目的目录下打开隐藏…

小程序 超长页面截图保存web-view+html2canvas

web-view文档建议参考----支付宝提供的文档&#xff0c;html2canvas官方文档&#xff08;官网可以下载html2canvas.js 和 html2canvas.min.js&#xff09;。由于篇幅受限&#xff0c;这里就贴了一下用法&#xff0c;对于web-view的配置情况&#xff0c;需要自己去查看文档&…

【测试】开发模型+测试模型

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、开发模型和测试模型概述二、 开发模型一&#xff09; 瀑布模型二&#xff09;螺旋模型三&#xff09;增量模型和迭代模型四&#xff09;敏捷模型【重点:sunny:】三、 测试模型一&#xff09;V模型二&#xff09;…

【4.2】Ribbon负载均衡策略

【4.2】Ribbon负载均衡策略1 Ribbon--负载均衡策略2.1 修改负载均衡规则--代码方式2.1.1 具体测试&#xff1a;2.2 修改负载均衡规则--配置文件方式2.2.1 具体配置3 总结Ribbon负载均衡原理 中学习到&#xff1a; IRule接口决定了负载均衡的策略。 接下来学习IRule接口的实现有…

【Java编程进阶】Object类及常用方法详解

Java 编程基础教程系列&#xff1a;Java 编程进阶之路【从入门到精通】 &#xff0c;从入门到精通一站学习&#xff0c;买不了吃亏&#xff0c;买不了上当&#xff01;&#xff01; 文章目录1. Object类2. 常用的方法2.1 toString 方法2.2 equals 方法2.3 hashcode 方法3. 注意…

Verilog语法笔记(夏宇闻第三版)-数据类型及其常量、变量

目录 常量&#xff1a; 整数&#xff1a; x和z值: 负数: 下划线(underscore_)&#xff1a; 参数(Parameter)型&#xff1a; 变量&#xff1a; wire型&#xff1a; reg型&#xff1a; memory型&#xff1a; Verilog HDL中总共有十九种数据类型,数据类型是用来表示数字…

SSH远程连接服务详解

远程连接服务器 一&#xff0c;远程连接服务器简介 1、什么是远程连接服务器 远程连接服务器通过文字或图形接口方式来远程登录系统&#xff0c;让你在远程终端前登录 linux 主机以取得可操作主机接口&#xff08;shell&#xff09;&#xff0c;而登录后的操作感觉就像是坐在…