Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理
前文传送门:
「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」
图像属性
图像属性包括行数,列数和通道数,图像数据类型,像素数等。
1. 形状:shape
图像的形状可以通过 shape
关键字进行获取,使用 shape
关键的后,获取的信息包括行数、列数、通道数的元祖。
需要注意的是,如果是灰度图片,只会返回图像的行数和列数,而彩色图片才会图像的行数、列数和通道数。
示例如下:
import cv2 as cv
# 读取彩色图片
color_img = cv.imread("maliao.jpg", cv.IMREAD_ANYCOLOR)
print(color_img.shape)
# 结果打印
(310, 560, 3)
# 读取灰度图片
gray_img = cv.imread("maliao.jpg", cv.IMREAD_GRAYSCALE)
print(gray_img.shape)
# 结果打印
(310, 560)
2. 像素数量:size
图像的像素数量可以通过关键字 size
进行获取。
同样需要注意的是,灰度图片的像素数量是要小于彩色图片的,具体的关系是 1/3 。
import cv2 as cv
# 读取彩色图片
color_img = cv.imread("maliao.jpg", cv.IMREAD_ANYCOLOR)
print(color_img.size)
# 结果打印
520800
# 读取灰度图片
gray_img = cv.imread("maliao.jpg", cv.IMREAD_GRAYSCALE)
print(gray_img.size)
# 结果打印
173600
3. 图像类型-dtype
图像类型是通过关键字 dtype
获取的,通常返回 uint8 ,这个属性在彩色图片和灰度图片中是保持一致的。
注意 dtype 在调试时非常重要,因为 OpenCV-Python 代码中的大量错误是由无效的数据类型引起的。
import cv2 as cv
# 读取彩色图片
color_img = cv.imread("maliao.jpg", cv.IMREAD_ANYCOLOR)
print(color_img.dtype)
# 结果打印
uint8
# 读取灰度图片
gray_img = cv.imread("maliao.jpg", cv.IMREAD_GRAYSCALE)
print(gray_img.dtype)
# 结果打印
uint8
获取图像感兴趣 ROI 区域
ROI(Region of Interest)表示感兴趣区域。
它是指从被处理图像以方框、圆形、椭圆、不规则多边形等方式勾勒出需要处理的区域。可以通过各种算子(Operator)和函数求得感兴趣ROI区域,并进行图像的下一步处理,被广泛应用于热点地图、人脸识别、图像分割等领域。
如果我们要对于图像中的眼睛检测,首先对整个图像进行人脸检测。在获取人脸图像时,我们只选择人脸区域,搜索其中的眼睛,而不是搜索整个图像。它提高了准确性(因为眼睛总是在面部上:D )和性能(因为我们搜索的区域很小)。
我们通过像素矩阵可以直接得到 ROI 区域,如: img[200:400, 200:400]
。
比如下面这个示例我们获取马里奥的脸,然后再把它显示出来:
import cv2 as cv
img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)
face = img[10:175, 100:260]
# 原始图像显示
cv.imshow("demo", img)
# 马里奥的脸显示
cv.imshow("face", face)
#等待显示
cv.waitKey(0)
cv.destroyAllWindows()
它的结果如下:
如果我们要把这两张图像合成一张图像,可以对图像进行区域赋值:
import cv2 as cv
img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)
# 获取 ROI 区域
face = img[10:175, 100:260]
# 图像赋值
img[0:165, 0:160] = face
# 原始图像显示
cv.imshow("demo", img)
#等待显示
cv.waitKey(0)
cv.destroyAllWindows()
结果如下:
这里我稍微偷点懒,直接就把 ROI 区域放在了图片的左上角,这个位置可以随意指定,但是指定的区域要和 ROI 的区域一样大,否则会报一个 ValueError
的错误。
拆分和合并图像通道
1. 拆分图像通道
有些时候,我们需要分别处理图像的 B,G,R 通道。的通道,用 PS 抠过图的人应该都清楚抠图的时候可以使用单通道进行抠图操作。
将图像的通道拆分出来可以使用 split()
函数,如下:
import cv2 as cv
img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)
#拆分通道
b, g, r = cv.split(img)
# 分别显示三个通道的图像
cv.imshow("B", b)
cv.imshow("G", g)
cv.imshow("R", r)
# 等待显示
cv.waitKey(0)
cv.destroyAllWindows()
结果如下:
可以看到,三个通道的图像看起来都是灰白色的,这个玩过 PS 的人应该都很熟悉。
除了使用 split()
函数获取图像通道,还可以通过索引进行获取,代码如下:
b = img[:, :, 0]
g = img[:, :, 1]
r = img[:, :, 2]
如果需要将所有红色像素都设置为零,无需先拆分通道,索引更快:
img[:, :, 2] = 0
注意:
split()
函数是一项耗时的操作(就时间而言)。因此,仅在必要时才这样做。否则请进行Numpy索引。
2. 合并图像通道
合并图像通道我们使用函数 merge()
,示例如下:
import cv2 as cv
img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)
# 拆分通道
b, g, r = cv.split(img)
# 合并图像通道
m = cv.merge([r, g, b])
cv.imshow('merge', m)
# 等待显示
cv.waitKey(0)
cv.destroyAllWindows()
结果如下:
这里如果是按照 [r, g, b]
进行图像通道合并,我们的马里奥就会变身成为蓝精灵,因为 OpenCV 是按照 BGR 读取的,如果想要显示会原图,合并的时候也按照 [b, g, r]
合并即可,如下:
如果我们想要做一个真正的蓝精灵,可以只提取 B 颜色通道,其余两个 G 、 R 通道全部设置为 0 ,这样,我们就获得了一个真正的蓝精灵(整个图像只有蓝色通道),代码如下:
import cv2 as cv
import numpy as np
# 读取图片
img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)
rows, cols, chn = img.shape
# 拆分通道
b = img[:, :, 0]
g = np.zeros((rows,cols), dtype=img.dtype)
r = np.zeros((rows,cols), dtype=img.dtype)
# 合并图像通道
m = cv.merge([b, g, r])
cv.imshow('merge', m)
# 等待显示
cv.waitKey(0)
cv.destroyAllWindows()
结果如下:
同理,如果想要绿精灵和红精灵,一样可以做出来。
示例代码
如果有需要获取源码的同学可以在公众号回复「OpenCV」进行获取。
参考
https://blog.csdn.net/eastmount/article/details/82177300
Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理的更多相关文章
- 跟我学Python图像处理丨获取图像属性、兴趣ROI区域及通道处理
摘要:本篇文章主要讲解Python调用OpenCV获取图像属性,截取感兴趣ROI区域,处理图像通道. 本文分享自华为云社区<[Python图像处理] 三.获取图像属性.兴趣ROI区域及通道处理 ...
- Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理
摘要:本篇文章主要讲解Python调用OpenCV获取图像属性,截取感兴趣ROI区域,处理图像通道. 本文分享自华为云社区<[Python图像处理] 三.获取图像属性.兴趣ROI区域及通道处理 ...
- Python 图像处理 OpenCV (4):图像算数运算以及修改颜色空间
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- Python 图像处理 OpenCV (5):图像的几何变换
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- Python 图像处理 OpenCV (6):图像的阈值处理
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- Python 图像处理 OpenCV (14):图像金字塔
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- Python 图像处理 OpenCV (15):图像轮廓
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- Python 图像处理 OpenCV (16):图像直方图
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- Python 图像处理 OpenCV (7):图像平滑(滤波)处理
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
随机推荐
- php中&&和and有什么区别
PHP中的逻辑“与”运算有两种形式:AND 和 &&,同样“或”运算也有OR和||两种形式. 如果是单独两个表达式参加的运算,两种形式的结果完全相同,例如 $a AND $b和$a & ...
- jdbc批量插入数据
//插入很多书(批量插入用法) public void insertBooks(List<Book> book) { final List<Book> tempBook=b ...
- MATLAB学习1 之画图函数
ezplot适用条件 "ezplot"命令可以用于显函数.隐函数和参数方程作图. 不同函数的使用格式 显函数y=f(x),ezplot函数的调用格式为ezplot(f, [xmin ...
- json序列化字符串后,配置枚举类型显示数值而不是名称
2019独角兽企业重金招聘Python工程师标准>>> 经常有这么一个需求,实体类里面用到枚举常量,但序列化成json字符串时.默认并不是我想要的值,而是名称,如下 类 @Data ...
- jQuery学习(二)
操作DOM对象: 修改文本: jQuery对象的text()和html()方法可以用来获取节点的文本内容和HTML文本.而当你给方法传入参数时,这两个方法可以被用于设置jQuery的文本内容. 还是以 ...
- 图论--2-SAT--HDU/HDOJ 1814 Peaceful Commission
Peaceful Commission Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- 题解 CF1286A 【Garland】
updata on 2020.3.19 往博客园搬的时候看了看自己以前写的blog 其实没多久,才两个多月,感觉自己之前写的东西好罗嗦啊.. 但也是最近写的blog才开始多起来 当然现在也没好到哪去. ...
- SpringBoot集成Quartz实现定时任务
1 需求 在我的前后端分离的实验室管理项目中,有一个功能是学生状态统计.我的设计是按天统计每种状态的比例.为了便于计算,在每天0点,系统需要将学生的状态重置,并插入一条数据作为一天的开始状态.另外,考 ...
- 怎么成为一名WEB前端开发工程师
对于刚开始学的人来说,web 就是HTML+CSS+JavaScript其实我们是可以这样理解的.web工程师负责或参与Web产品的页面开发,包含PC端.移动APP内嵌移动端.微信小程序.web ...
- GIL-Guilds(黑白灰染色)
传送门门门门门咩咩咩咩咩咩咩咩咩咩咩咩 \(这题真是扯谈!!!\) \(灰色很高级是吧,但是题目没要你把颜色全部用上去啊!!!\) \(黑色或者白色只有一个条件,但灰色需要和所有三种颜色都相邻.这么难 ...