写点什么

跟我学 Python 图像处理丨获取图像属性、兴趣 ROI 区域及通道处理

  • 2022 年 5 月 05 日
  • 本文字数:2417 字

    阅读完需:约 8 分钟

本文分享自华为云社区《[Python图像处理] 三.获取图像属性、兴趣ROI区域及通道处理 | 【生长吧!Python】》,作者: eastmount 。

一.获取图像属性

1.形状-shape

通过 shape 关键字获取图像的形状,返回包含行数、列数、通道数的元祖。其中灰度图像返回行数和列数,彩色图像返回行数、列数和通道数。如下图所示:


# -*- coding:utf-8 -*-import cv2import 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 cv2import 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 cv2import numpy
#读取图片img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
#获取图像形状print(img.shape)
#获取像素数目print(img.size)
#获取图像类型print(img.dtype)
复制代码

输出结果:

(445L, 670L, 3L)894450uint8

二.获取感兴趣 ROI 区域

ROI(Region of Interest)表示感兴趣区域。它是指从被处理图像以方框、圆形、椭圆、不规则多边形等方式勾勒出需要处理的区域。可以通过各种算子(Operator)和函数求得感兴趣 ROI 区域,并进行图像的下一步处理,被广泛应用于热点地图、人脸识别、图像分割等领域。

通过像素矩阵可以直接获取 ROI 区域,如 img[200:400, 200:400]。

代码如下:

# -*- coding:utf-8 -*-import cv2import numpy as np
#读取图片img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
#定义200*100矩阵 3对应BGRface = 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 cv2import numpy as np
#读取图片img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
#定义300*100矩阵 3对应BGRface = np.ones((200, 200, 3))
#显示原始图像cv2.imshow("Demo", img)
#显示ROI区域face = img[100:300, 150:350]img[0:200,0:200] = facecv2.imshow("face", img)
#等待显示cv2.waitKey(0)cv2.destroyAllWindows()
复制代码

将提取的头部融合至图像左上角部分,如下图所示:

如果想将两张图像进行融合,只需再读取一张图像即可,方法原理类似。 实现代码如下:

# -*- coding:utf-8 -*-import cv2import numpy as np
#读取图片img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)test = cv2.imread("test3.jpg", cv2.IMREAD_UNCHANGED)
#定义300*100矩阵 3对应BGRface = np.ones((200, 200, 3))
#显示原始图像cv2.imshow("Demo", img)
#显示ROI区域face = img[100:300, 150:350]test[400:600,400:600] = facecv2.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 cv2import 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 cv2import 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 cv2import 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.shapeb = 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 所有源代码:


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 2
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
跟我学Python图像处理丨获取图像属性、兴趣ROI区域及通道处理_Python_华为云开发者社区_InfoQ写作社区