上一篇开了一个头,这一篇我们继续
提醒一点:上一篇我们用 'import cv2.cv2 as cv',由于本地机器问题,cv2无法出现提示导致。为了一面引起读者的歧义,接下来的所有篇幅我直接 import cv2来进行说明。
二值图像及灰度图像
OpenCv最小的数据类型时无符号的8位二进制数,其最小值是0,最大值是255.因此,OpenCv中没有仅用一位二进制数表示二值图像的一个像素值(0或1)的数据类型。它使用0位二进制数最小值0表示二值图像的黑色,使用8位二进制数的最大值255表示二值图像中的白色。因此,可以将二值图像理解为是一个特殊的灰度图像,像素仅有最大值255和最小值0.
我们来尝试用Numpy模拟一个80*80的全黑图像
import cv2import numpy as npimg = np.zeros((80,80),dtype = np.uint8)print('img:\n',img)cv2.imshow('black_picture',img)cv2.waitKey()
首先看img的数组内容:
再看imshow的窗口内容
此时我们改变img数组中的部分数值,从0(黑色)变成255(白色):
img[5:15,5:15] = 255cv2.imshow('black_picture2',img)cv2.waitKey()
此时弹出来了改变后的图
可以看出,第5~15行,5~15列交界处变成了一个白色的方块。
彩色图像
Opencv在处理RGB模式的彩色图像时,会按照行方向分别读取该RGB图像像素点的B通道,G通道,R通道的像素值,并将像素值以行为单位储存在ndarray的列中。例如,有一副大小为R行*C列的原始BGR模式的三位数组形式存储,可以使用表达式访问数组内的值
例:使用img[0,0,0]访问img图像B通道内第0行第0列上的像素点。其中:
第一个索引表示第0行
第二个索引表示第0列
第三个索引表示第0个颜色通道。
综上所述,如果有一副红色图像,则img[0,0] = [0,0,255];img[0,0,1] = 0
让我们接下来做一个实例:
import cv2img = cv2.imread('D:/PixC/1.jpg')print('img[0,0] = ',img[0,0])print('img[0,0,0] = ',img[0,0,0])print('img[0,0,1] = ',img[0,0,1])print('img[0,50] = ',img[0,50])
得到这样的结果
img[0,0] = [90 51 42]
img[0,0,0] = 90
img[0,0,1] = 51
img[0,50] = [90 51 42]
可以看到,每个点的值以及每一个像素通道的值。于是我们再尝试着画图
img[0:10,0:50] = [0,0,255] #Rimg[10:20,0:50] = [0,255,0] #Gimg[20:30,0:50] = [255,0,0] #Bimg[30:40,0:50] = [0,255,255] #R&Gimg[40:50,0:50] = [255,255,0] #G&Bimg[50:60,0:50] = [255,255,255] #R&Gcv2.imshow('another',img)cv2.waitKey()
接着我们就得到了这样一张图
顺便复习了一下三原色以及叠加后会变成什么颜色