跟我学Python图像处理丨获取图像属性、兴趣ROI区域及通道处理
摘要:本篇文章主要讲解Python调用OpenCV获取图像属性,截取感兴趣ROI区域,处理图像通道。
本文分享自华为云社区《[Python图像处理] 三.获取图像属性、兴趣ROI区域及通道处理 | 【生长吧!Python】》,作者: eastmount 。
一.获取图像属性
1.形状-shape
通过shape关键字获取图像的形状,返回包含行数、列数、通道数的元祖。其中灰度图像返回行数和列数,彩色图像返回行数、列数和通道数。如下图所示:
# -*- coding:utf-8 -*- import cv2 import numpy #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #获取图像形状 print(img.shape) #显示图像 cv2.imshow("Demo", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果如下图所示:(445L, 670L, 3L),该图共445行、670列像素,3个通道。
2.像素数目-size
通过size关键字获取图像的像素数目,其中灰度图像返回行数 * 列数,彩色图像返回行数 * 列数 * 通道数。代码如下:
# -*- coding:utf-8 -*- import cv2 import numpy #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #获取图像形状 print(img.shape) #获取像素数目 print(img.size)
输出结果:
(445L, 670L, 3L)
894450
3.图像类型-dtype
通过dtype关键字获取图像的数据类型,通常返回uint8。代码如下:
# -*- coding:utf-8 -*- import cv2 import numpy #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #获取图像形状 print(img.shape) #获取像素数目 print(img.size) #获取图像类型 print(img.dtype)
输出结果:
(445L, 670L, 3L)
894450
uint8
二.获取感兴趣ROI区域
ROI(Region of Interest)表示感兴趣区域。它是指从被处理图像以方框、圆形、椭圆、不规则多边形等方式勾勒出需要处理的区域。可以通过各种算子(Operator)和函数求得感兴趣ROI区域,并进行图像的下一步处理,被广泛应用于热点地图、人脸识别、图像分割等领域。
通过像素矩阵可以直接获取ROI区域,如img[200:400, 200:400]。
代码如下:
# -*- coding:utf-8 -*- import cv2 import numpy as np #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #定义200*100矩阵 3对应BGR face = np.ones((200, 100, 3)) #显示原始图像 cv2.imshow("Demo", img) #显示ROI区域 face = img[200:400, 200:300] cv2.imshow("face", face) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果如下图所示:
下面将提取的ROI图像进行融合实验,代码如下:
# -*- coding:utf-8 -*- import cv2 import numpy as np #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #定义300*100矩阵 3对应BGR face = np.ones((200, 200, 3)) #显示原始图像 cv2.imshow("Demo", img) #显示ROI区域 face = img[100:300, 150:350] img[0:200,0:200] = face cv2.imshow("face", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
将提取的头部融合至图像左上角部分,如下图所示:
如果想将两张图像进行融合,只需再读取一张图像即可,方法原理类似。 实现代码如下:
# -*- coding:utf-8 -*- import cv2 import numpy as np #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) test = cv2.imread("test3.jpg", cv2.IMREAD_UNCHANGED) #定义300*100矩阵 3对应BGR face = np.ones((200, 200, 3)) #显示原始图像 cv2.imshow("Demo", img) #显示ROI区域 face = img[100:300, 150:350] test[400:600,400:600] = face cv2.imshow("Pic", test) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果如下图所示:
三.图像通道处理
1.通道拆分
OpenCV读取的彩色图像由B、G、R三原色组成,可以通过下面代码获取不同的通道。
b = img[:, :, 0]
g = img[:, :, 1]
r = img[:, :, 2]
也可以使用split()函数拆分通道,下面是拆分不同通道再显示的代码。
# -*- coding:utf-8 -*- import cv2 import numpy as np #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #拆分通道 b, g, r = cv2.split(img) #显示原始图像 cv2.imshow("B", b) cv2.imshow("G", g) cv2.imshow("R", r) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果如下图所示:
也可以获取不同的通道,核心代码如下所示: b = cv2.split(a)[0] g = cv2.split(a)[1] r = cv2.split(a)[2]
2.通道合并
图像通道合并主要调用merge()函数实现,核心代码如下:
m = cv2.merge([b, g, r])
# -*- coding:utf-8 -*- import cv2 import numpy as np #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #拆分通道 b, g, r = cv2.split(img) #合并通道 m = cv2.merge([b, g, r]) cv2.imshow("Merge", m) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果如下:
注意,如果是合并[r,g,b]三通道,则显示如下所示,因OpenCV是按照BGR进行读取的。
b, g, r = cv2.split(img)
m = cv2.merge([r, g, b])
cv2.imshow(“Merge”, m)
同时,可以提取图像的不同颜色,提取B颜色通道,G、B通道设置为0,则显示蓝色。代码如下所示:
# -*- coding:utf-8 -*- import cv2 import numpy as np #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) rows, cols, chn = img.shape #拆分通道 b = cv2.split(img)[0] g = np.zeros((rows,cols),dtype=img.dtype) r = np.zeros((rows,cols),dtype=img.dtype) #合并通道 m = cv2.merge([b, g, r]) cv2.imshow("Merge", m) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
蓝色通道输出结果如下所示:
绿色通道核心代码及输出结果如下所示:
rows, cols, chn = img.shape
b = np.zeros((rows,cols),dtype=img.dtype)
g = cv2.split(img)[1]
r = np.zeros((rows,cols),dtype=img.dtype)
m = cv2.merge([b, g, r])
红色通道修改方法与上面类似。希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。
该系列在github所有源代码:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
zorm 1.5.5 发布,关闭数据库连接池
zorm是go(golang)轻量级ORM,零依赖,零侵入分布式事务,支持达梦(dm),金仓(kingbase),神通(shentong),南大通用(gbase),mysql,postgresql,oracle,mssql,sqlite,clickhouse数据库. 源码地址:https://gitee.com/chunanyong/zorm go get gitee.com/chunanyong/zorm 基于原生sql语句编写,是springrain的精简和优化. 自带代码生成器 代码精简,主体2500行,零依赖4000行,注释详细,方便定制修改 支持事务传播,这是zorm诞生的主要原因 支持mysql,postgresql,oracle,mssql,sqlite,dm(达梦),kingbase(金仓),shentong(神通),gbase(南通),clickhouse 支持多库和读写分离 更新性能zorm,gorm,xorm相当. 读取性能zorm比gorm,xorm快50% 不支持联合主键,变通认为无主键,业务控制实现(艰难取舍) 集成seata-golang,支持全局托管...
- 下一篇
What?构造的查询语句会导致堆栈溢出
摘要:本文归纳了Neo4j和Nebula两个开源图数据库的两个pull request修复的堆栈溢出问题,并试着写写通过阅读pr中的问题而得到的一些启发 本文分享自华为云社区《巧妙构造的查询语句会导致堆栈溢出?从两个开源图数据库PR看查询执行时的编码设计问题》,作者:蜉蝣与海 。 导读&简介 查询语言(Query Language)的出现方便了用户在计算引擎上执行各种操作,就图数据库而言,neo4j支持查询语言cypher,nebula有其独有的查询语言nGQL。由于查询语言规则依赖语言自身文法,用户使用查询语言自由度较大,输入灵活,一般测试手段难以覆盖到所有情况,所以在某种程度上复杂的查询语句是各类计算产品健壮性的试金石,本文归纳了两个开源产品pr(pull request)时修复的堆栈溢出问题,并试着写写通过阅读pr中的问题而得到的一些启发。 先上链接,如果你更喜欢读代码而不是听我叨叨:StackOverFlowError occurs when reducing a List(neo4j): issue:https://github.com/neo4j/neo4j/iss...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- 设置Eclipse缩进为4个空格,增强代码规范