跟我学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所有源代码:
跟我学Python图像处理丨获取图像属性、兴趣ROI区域及通道处理的更多相关文章
- Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理
摘要:本篇文章主要讲解Python调用OpenCV获取图像属性,截取感兴趣ROI区域,处理图像通道. 本文分享自华为云社区<[Python图像处理] 三.获取图像属性.兴趣ROI区域及通道处理 ...
- Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 图像属性 图像 ...
- 跟我学Python图像处理丨基于灰度三维图的图像顶帽运算和黑帽运算
摘要:本篇文章结合灰度三维图像讲解图像顶帽运算和图像黑猫运算,通过Python调用OpenCV函数实现. 本文分享自华为云社区<[Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽 ...
- 跟我学Python图像处理丨何为图像的灰度非线性变换
摘要:本文主要讲解灰度线性变换,基础性知识希望对您有所帮助. 本文分享自华为云社区<[Python图像处理] 十六.图像的灰度非线性变换之对数变换.伽马变换>,作者:eastmount . ...
- 跟我学Python图像处理丨图像特效处理:毛玻璃、浮雕和油漆特效
摘要:本文讲解常见的图像特效处理,从而让读者实现各种各样的图像特殊效果,并通过Python和OpenCV实现. 本文分享自华为云社区<[Python图像处理] 二十四.图像特效处理之毛玻璃.浮雕 ...
- 跟我学Python图像处理丨关于图像金字塔的图像向下取样和向上取样
摘要:本文讲述图像金字塔知识,了解专门用于图像向上采样和向下采样的pyrUp()和pyrDown()函数. 本文分享自华为云社区<[Python图像处理] 二十一.图像金字塔之图像向下取样和向上 ...
- 跟我学Python图像处理丨带你掌握傅里叶变换原理及实现
摘要:傅里叶变换主要是将时间域上的信号转变为频率域上的信号,用来进行图像除噪.图像增强等处理. 本文分享自华为云社区<[Python图像处理] 二十二.Python图像傅里叶变换原理及实现> ...
- 跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波
摘要:本文讲解基于傅里叶变换的高通滤波和低通滤波. 本文分享自华为云社区<[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波>,作者:eastmount . 一.高通滤波 傅 ...
- Python图像处理丨基于OpenCV和像素处理的图像灰度化处理
摘要:本篇文章讲解图像灰度化处理的知识,结合OpenCV调用cv2.cvtColor()函数实现图像灰度操作,使用像素处理方法对图像进行灰度化处理. 本文分享自华为云社区<[Python图像处理 ...
随机推荐
- Spring框架中的单例bean是线程安全的吗?
不,Spring框架中的单例bean不是线程安全的.
- springboot 指定启动环境
java -jar dbmaster.jar --spring.profiles.active=test
- Citus 分布式 PostgreSQL 集群 - SQL Reference(手动查询传播)
手动查询传播 当用户发出查询时,Citus coordinator 将其划分为更小的查询片段,其中每个查询片段可以在工作分片上独立运行.这允许 Citus 将每个查询分布在集群中. 但是,将查询划分为 ...
- Vue2的右键弹出菜单(vue-contextmenu)
给大家推荐一个基于Vue2的右键弹出菜单插件,支持单一SPA页面以及可以在循环绑定中使用. 项目地址为:https://github.com/chIIC/vue-...demo1: 父组件绑定右键事件 ...
- java中类变量和实例变量的实质区别?
类变量和实例变量的区别 相对于static(静态的)或说类的, 本章开始提到的都是instance(实例的)或说对象的. 每个对象都有自己的一份儿对象域或实例域,相互之间没关系, 不共享. 我们可以从 ...
- npm权限不够(安装什么都报错)
问题 Windows下使用npm安装任何包都报错, Windows下使用npm显示权限不够 如图: 解决方法 1. 方法一 使用管理员权限打开 命令窗口, 治标不治本!!!!不推荐 ...
- mybatis 实现分页和过滤模糊查询
基于 mybatis 的分页和过滤查询 学习内容: 分页设计 1.分页需传递的参数 2.分页需展示的数据 3.分页需展示的数据的来源 3.1.结果总数与结果集(分页原理) 3.2.总页数.上一页和下一 ...
- Mybatis实现简单增删改查
Mybatis的简单应用 学习内容: 需求 环境准备 代码 总结: 学习内容: 需求 使用Mybatis实现简单增删改查(以下是在IDEA中实现的,其他开发工具中,代码一样) jar 包下载:http ...
- 项目中常用到的布局 flex
1. 没header,footer固定 html<div class="page"> <div class="top"> <div ...
- LazyCaptcha自定义随机验证码和字体
介绍 LazyCaptcha是仿EasyCaptcha和SimpleCaptcha,基于.Net Standard 2.1的图形验证码模块. 目前Gitee 52star, 如果对您有帮助,请不吝啬点 ...