一.图像的基本表示方法
1.二值图像
二值图像指的是仅仅包含黑色和白色两种颜色的图像。在计算机中,通过矩阵数组来表示和处理图像,矩阵的每一个位置元素就是一个独立的处理单位,称其为像素点。计算机将白色像素点处理为“1”,黑色像素点处理为“0”,方便后续的操作。由于二值图像只有黑色和白色两种颜色,因此只用一个比特位(0或1)就能表示。
2.灰度图像
二值图像简单方便,但是只有黑白两种颜色,表示的图像不够细腻,,更多的颜色种类才能表示更细腻的图片。如下图是一幅灰度图像,采用更多地数值 0到255 来表示图像。
计算机将灰度处理为256个灰度级,用数值区间 [0, 255] 来表示。其中 “0” 表示纯黑色,“255” 表示纯白色,其余的数值表示从纯黑到纯白之间不同级别的灰度。
3.彩色图像
比起二值图像和灰度图像,彩色图像是更常见的一类图像,能表现更加丰富的细节信息。
从不同的角度表述颜色,可以得到不同的色彩空间(也称为颜色空间、颜色模式)。而 RGB 色彩空间是我们常用的色彩空间,在 RGB 色彩空间中,存在 R(red,红色)通道、 G(green,绿色)通道、 B(blue,蓝色)通道,每个色彩通道的值都是在 [0, 255] 之间,我们用这三个色彩通道组合来表示彩色颜色。由于每个通道都有 256 种数值,所以可以组合成 256x256x256=16777216 种颜色。下表为常见的几种组合颜色。
R | G | B | RGB | 颜色 |
---|---|---|---|---|
0 | 0 | 0 | (0,0,0) | 纯白 |
255 | 255 | 255 | (255,255,255) | 纯黑 |
255 | 0 | 0 | (255,0,0) | 红色 |
0 | 255 | 0 | (0,255,0) | 绿色 |
0 | 0 | 255 | (0,0,255) | 蓝色 |
139 | 69 | 19 | (139,69,19) | 棕色 |
114 | 141 | 216 | (114,141,216) | 天蓝色 |
如下图所示,在彩色图的某个像素点的值为 (256,89,68) ,这个三个值分别对应为 R、G、B 三个通道的值,三个值组合起来形成了我们看到的彩色。(注意在opencv中读取图像后,图像默认会转为BGR格式)
二.图像像素处理
像素是图像构成的基本单位,通过对数组位置索引的形式可以对图像内的元素进行访问,处理。
三.通道操作
针对RGB图像,我们可以拆分出 R、G、B 三个通道,先读取原彩色图片img = cv2.imread('dog.jpg')
(注意此时的图片为 BGR 通道顺序)。此时 img 为三维矩阵 img.shape = (512,512,3)
,部分值如下图所示:
1.通道拆分
(1).通过索引拆分
b = img[:, :, 0] # 获取图像的 B 通道
g = img[:, :, 1] # 获取图像的 G 通道
r = img[:, :, 2] # 获取图像的 R 通道
img[:, :, 0] = 1 # 将图像 B 通道的值设为1
img[:, :, 1] = 0 # 将图像 G 通道的值设为0
img[:, :, 2] = 10 # 将图像 R 通道的值设为10
(2).通过函数拆分
b,g,r = cv2.split(img)
###或者写成一下形式###
b = cv2.split(img)[0] # 获取图像的 B 通道
g = cv2.split(img)[1] # 获取图像的 G 通道
r = cv2.split(img)[2] # 获取图像的 R 通道
此时 b,g,r 都分别为二维矩阵 b.shape = (512,512)
,部分值如下图所示:
2.通道合并
通道合并是通道拆分的逆过程,可以将三个通道的灰度图合并来构成一幅彩色图像。
b,g,r = cv2.split(img)
bg_img = cv2.merge([b,g])
rgb_img = cv2.merge([r,g,b])
此时 bg_img 为三维矩阵 bg.shape =(512, 512, 2)
,部分值如下图所示:
此时 rgb_img 为三维矩阵 rgb.shape =(512, 512, 3)
,部分值如下图所示:
3.获取图像属性
img = cv2.imread('xxx.png')
img.shape
:如果是彩色图,返回 (行数, 列数, 通道数) 的三元组;如果是灰度图,返回 (行数, 列数) 的二元组img.size
:返回图像的像素数目。值为 “行数 x 列数 x 通道数”img.dtype
:返回图像的数据类型
示例
import cv2
bgr = cv2.imread('dog.jpg')
print(bgr.shape)
print(type(bgr.shape))
print(bgr.size)
print(bgr.dtype)
gray = cv2.cvtColor(bgr,cv2.COLOR_BGR2GRAY)
print(gray.shape)
print(type(gray.shape))
print(gray.size)
print(gray.dtype)
'''结果如下
(512, 512, 3)
<class 'tuple'>
786432
uint8
(512, 512)
<class 'tuple'>
262144
uint8
'''