1.图像类型
图像类型可以分为三种,分别为二值图,灰度图,彩色图。
- 二值图,顾名思义只有0,255两种值,黑白两种颜色
- 灰度图,常以8位0-255灰度值的灰度图。
- 彩色图,彩色图分为彩色图和伪彩色图,彩色图有RGB三种通道,每个通道0-255个值,而伪彩色图为直接0-255代表一种颜色区分只有一种通道(用处甚微,以后所称彩色图均为三通道彩色图)
2.图像矩阵表示
图像以矩阵表示。灰度图为二维矩阵表示,彩色图为三位矩阵表示。
分辨率的概念就是水平和竖直方向单位像素的个数。
img.ndim==3
img_gray.ndim==2
可以进行矩阵到图像的模拟,用上期的show()
函数显示图像:
#再次给出show()函数的封装以便巩固学习
def show(img):
if img.ndim==2:
plt.imshow(img,cmap='gray')#可调整参数vmin=0,vmax=255来调整放缩,细分灰度
else:
img=cv.cvtColor(img,cv.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()
矩阵模拟灰度图:
A=np.random.randint(0,256,(4,4),dtype=np.uint8)#4*4分辨率
show(A)
图像为:
这里也可以看到灰度图为二维数组:
array([[114, 66, 153, 60],
[ 45, 149, 118, 167],
[248, 72, 163, 245],
[128, 15, 31, 154]], dtype=uint8)
矩阵来模拟彩色图:
B=np.random.randint(0,256,(4,4,3),dtype=np.uint8)#()内的参数为4*4的分辨率,3指的是通道数,而非维数
show(B)
这里也可以看到彩色图为三维数组:
array([[[147, 122, 138],
[151, 50, 253],
[228, 196, 165],
[113, 15, 224]],
[[ 7, 157, 8],
[214, 59, 101],
[ 49, 121, 35],
[ 8, 70, 96]],
[[ 58, 184, 46],
[131, 140, 238],
[ 97, 244, 243],
[245, 157, 118]],
[[ 29, 62, 238],
[143, 132, 13],
[181, 7, 157],
[130, 139, 136]]], dtype=uint8)
3.通道及通道的分离与合并
RGB红绿蓝三色通道,OpenCV中读取图像为BGR三色通道,只是颜色顺序不同,本质都是矩阵数据。
彩色图为三色通道叠加而成。
接下里是关于彩色图像转为灰色图像的函数使用:
img_gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
show(img_gray)
再从灰度图像转为二值图:
x,img_bin=cv.threshold(img_gray,125,255,cv.THRESH_BINARY)
#其中第一个参数为灰度图像,第二个参数为分界值125,即为当thresh>125置为255,否则置为0,
show(img_bin)
当然,这里有其他可以设置二值图的方案可以自行选择
threshold=125
img_gray[img_gray>threshold]=255
img_gray[img_gray<=threshold]=0
show(img_gray)
OpenCV中给出了三色通道分离与合成的相关函数:
#分离
b,g,r=cv.split(img)
#合成
img2=cv.merge([b,g,r])