OpenCV图像处理基础

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

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,只能当作学习笔记,若有不当或者编写有错误的地方,还请广大博友指出,定当虚心接受,谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值