2

Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理

 1 year ago
source link: https://blog.51cto.com/u_15214399/5283457
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

摘要:本篇文章主要讲解Python调用OpenCV获取图像属性,截取感兴趣ROI区域,处理图像通道。

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

本篇文章主要讲解Python调用OpenCV获取图像属性,截取感兴趣ROI区域,处理图像通道。全文均是基础知识,希望对您有所帮助。

一.获取图像属性

1.形状-shape

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

Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理_python

# -*- 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个通道。

Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理_OpenCV_02

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区域,并进行图像的下一步处理,被广泛应用于热点地图、人脸识别、图像分割等领域。

Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理_图像通道_03

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

Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理_OpenCV_04

代码如下:

# -*- 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()

输出结果如下图所示:

Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理_python_05

下面将提取的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()

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

Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理_图像通道_06

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

# -*- 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()

输出结果如下图所示:

Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理_彩色图像_07

三.图像通道处理

1.通道拆分

OpenCV读取的彩色图像由B、G、R三原色组成,可以通过下面代码获取不同的通道。

b = img[:, :, 0]

g = img[:, :, 1]

r = img[:, :, 2]

Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理_python_08

也可以使用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()

输出结果如下图所示:

Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理_图像处理_09

也可以获取不同的通道,核心代码如下所示: 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()

输出结果如下:

Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理_图像通道_10

注意,如果是合并[r,g,b]三通道,则显示如下所示,因OpenCV是按照BGR进行读取的。

b, g, r = cv2.split(img)

m = cv2.merge([r, g, b])

cv2.imshow(“Merge”, m)

Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理_python_11

同时,可以提取图像的不同颜色,提取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()

蓝色通道输出结果如下所示:

Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理_图像处理_12

绿色通道核心代码及输出结果如下所示:

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])

Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理_图像通道_13

红色通道修改方法与上面类似。希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。

本文摘录自eastmount X华为云开发者社区联合出品的电子书《从零到一 • Python图像处理及识别》。

点击免费下载电子书《​ ​从零到一 •Python图像处理及识别​​》

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK