OpenCV图像处理基础
一、感兴趣区域
在图像处理过程中,我们可能对图像的某一特定区域特别感兴趣,该区域就被称为感兴趣区域(Region 偶发Interest,ROI),设定感兴趣区域后,就可以对该区域进行整体操作。
如图所示,假设当前图像名称为img,图中的数字分别表示行号和列号,则蓝色区域就是感兴趣区域,表示为img[200:400, 200:600]。

二、通道操作
1. 通道拆分
对于RGB图像,可以分别拆分出该图像的R通道,G通道,B通道。在OpenCV中,既可以索引的方式拆分通道,也可以通过函数的方式拆分通道。
1.1 通过索引拆分
通过索引的方式,可以直接将各个通道从图像内提取出来,例如,对于OpenCV内的BGR图像Lena,可以通过如下语句分别提取B通道,G通道,R通道。
# B通道
b = lena[:,:,0]
# G通道
g = lena[:,:,1]
# R通道
r = lena[:,:,2]
注意:
使用 scipy.misc.imread 读取的图片数据是 RGB 格式;
使用 PIL.Image.open 读取的图片数据是RGB格式;
使用 cv2.imread 读取的图片数据是 BGR 格式;
由于博主所使用的是cv2,所以是BGR格式。
具体实现
# 导入库
import cv2
# 读取图片
cv2.imread("./pictures/lena.jfif",-1)
# -1 表示保持原格式不变
# 0 表示将图像调整为单通道的灰度图像
# 1 表示将图像调整为3通道的RGB图像,该值是默认值
得到如下的array对象:
array([[[130, 132, 227],
[130, 132, 227],
[128, 132, 227],
...,
[113, 148, 234],
[ 90, 132, 215],
[ 64, 108, 191]],
[[130, 132, 227],
[128, 132, 227],
[128, 132, 227],
...,
[119, 150, 235],
[100, 136, 220],
[ 72, 112, 194]],
[[128, 132, 227],
[128, 132, 227],
[128, 132, 227],
...,
[125, 149, 233],
[106, 134, 218],
[ 77, 107, 188]],
...,
[[ 58, 19, 87],
[ 60, 21, 89],
[ 61, 21, 92],
...,
[ 84, 70, 172],
[ 84, 69, 177],
[ 83, 70, 178]],
[[ 57, 18, 86],
[ 60, 21, 89],
[ 63, 23, 94],
...,
[ 84, 70, 175],
[ 85, 72, 182],
[ 85, 74, 184]],
[[ 57, 18, 86],
[ 60, 21, 89],
[ 64, 24, 95],
...,
[ 80, 66, 172],
[ 82, 69, 179],
[ 83, 71, 183]]], dtype=uint8)
将其值赋给一个lena对象:
lena = cv2.imread("./pictures/lena.jfif",-1)
通过如下语句分别提取B通道,G通道,R通道。
# B通道
b = lena[:,:,0]
# G通道
g = lena[:,:,1]
# R通道
r = lena[:,:,2]
显示图像:
cv2.imshow("Lena",lena)
cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
cv2.waitKey()
cv2.destroyAllWindows()
结果如下:
(一)原图

(二)B通道

(三)G通道

(四)R通道

1.2 通过函数拆分
函数cv2.split()能够拆分图像的通道。可以使用如下的语句对BGR图像lena进行拆分,得到B通道图像b,G通道图像g,R通道图像r。
b1,g1,r1 = cv2.split(lena)
上述语句还可写为如下形式:
b1 = cv2.split(lena)[0]
g1 = cv2.split(lena)[1]
r1 = cv2.split(lena)[2]
显示图像:
cv2.imshow("b1",b1)
cv2.imshow("g1",g1)
cv2.imshow("r1",r1)
cv2.waitKey()
cv2.destroyAllWindows()
结果如下:

第一张为R通道,第二张为G通道,第三张为B通道。
1. 通道合并
通道合并是通道拆分的逆过程,通过合并通道可以得到将三个灰度图像构成一幅彩色图像。实现通道合并的函数是cv2.merge()。例如有B通道图像b,G通道图像g,R通道图像r,使用函数cv2.merge()合并的实现语句如下:
bgr = cv2.merge([b,g,r])
具体实现代码如下:
import cv2
# 读取图像
lena = cv2.imread("./pictures/lena.jfif",-1)
# 先拆分
b,g,r = cv2.split(lena)
# 合并颜色通道cv2.merge([b,g,r])
bgr = cv2.merge([b,g,r])
# 合并颜色通道cv2.merge([r,g,b])
rgb = cv2.merge([r,g,b])
# 显示图像
cv2.imshow("lena",lena)# 原图
cv2.imshow("BGR",bgr)# BGR合并
cv2.imshow("RGB",rgb)# RGB合并
cv2.waitKey()
cv2.destroyAllWindows()
效果如下:

今天的学习分享就到这里。
初次尝试OpenCV,只能当作学习笔记,若有不当或者编写有错误的地方,还请广大博友指出,定当虚心接受,谢谢!!!

本文介绍了OpenCV图像处理中的感兴趣区域(ROI)概念,并详细讲解了如何进行通道操作,包括通过索引和函数进行通道拆分,以及如何使用cv2.merge()进行通道合并。内容涵盖RGB图像的BGR通道处理,展示了不同通道单独显示的效果。
289

被折叠的 条评论
为什么被折叠?



