一个字节就是0~255范围内的一个整数。目前,在 实时图形应用程序中,像素通常由每个通道一个字节来表示,但是也 可以使用其他表示方式。 OpenCV图像是numpy.array类型的二维或者三维数组。8位灰度图 像是包含字节值的一个二维数组。24位的BGR图像是一个三维数组,也 包含字节值。我们可以通过使用类似于image[0,0]或者image[0,0,0] 的表达式来访问这些值。第一个索引是像素的y坐标或者行,0表示顶 部。第二个索引是像素的x坐标或者列,0表示最左边。第三个索引 (如果有的话)表示一个颜色通道。
操作BGR图像的(0,0)坐标处的像素,并将其转换成白色像素:
import cv2
img = cv2.imread("picture.png")
img[0, 0] = [255, 255, 255]
如果将修改后的图像保存到文件后再查看该图像,你会在图像的 左上角看到一个白点。当然,这种修改并不是很有用,但是它显示了 某种修改的可能性。
考虑使用数组切片来操作颜色通道的一个例子。将一 幅图像的所有G(绿色)值都设置为0非常简单
img = cv2.imread("picture.png")
img[:, :, 1] = 0
程序从所有行和列中获取所有像素,并把 绿色值(在三元BGR数组的一个索引处)设置为0。如果显示此图像, 那么绿色完全消失了。
这样可以把这 个区域绑定到一个变量,定义第二个区域,将第一个区域的值赋给第 二个区域(从而将图像的一部分复制到图像的另一个位置)例如:
img = cv2.imread("picture.png")
my_roi = img[0:100, 0:100]
img[300:400, 300:400] = my_roi
# 确保两个区域在大小上一致很重要。如果大小不一致,NumPy会提示这两个形状不匹配
关于np数组的属性有以下方法
img = cv2.imread("picture.png")
print(img.shape)
print(img.size)
print(img.dtype)
这三个属性的定义如下:
shape:描述数组形状的一个元组。对于图像,它(依次)包括 高度、宽度、通道数(如果是彩色图像的话)。shape元组的长度是确定图像是灰度的还是彩色的一种有用方法。对于灰度图像, len(shape)==2,对于彩色图像,len(shape)==3
size:数组中的元素数。对于灰度图像,这和像素数是一样的。 对于BGR图像,它是像素数的3倍,因为每个像素都由3个元素(B、G 和R)表示。
dtype:数组元素的数据类型。对于每个通道8位的图像,数据类型是numpy.uint8。
下面一行代码表示按照OpenCV中的颜色通道顺序来提取当前img图像的BRG颜色(数组)
b, g, r = cv2.spilt(img)
print(b)
颜色通道组合
img = cv2.merge((b,g,r))
img.shape
灰度模型是通过将颜色信息转换为灰度或亮度来减少颜色信息 的一种模型。在只有亮度信息就足够的问题中(如人脸检测),这个 模型对于图像的中间处理非常有用。通常,灰度图像中的每个像素都 是由一个8位值表示的,范围从0(黑色)到255(白色)。
BGR表示蓝–绿–红颜色模型,其中每个像素都有一个三元组 值表示的蓝、绿、红分量或者像素颜色的通道。Web开发人员以及任 何从事计算机图形工作的人员除了反向通道顺序(RGB)外,还都熟 悉类似的颜色定义。通常,BGR图像中的每个像素都由一个8位的三元 组值来表示,例如[0,0,0]表示黑色,[255,0,0]表示蓝色,[0,255,0]表示绿 色,[0,0,255]表示红色,[255,255,255]表示白色。
HSV模型使用一个不同的三元组通道。色调(hue)是颜色的基调,饱和度(saturation)是颜色的强度,值(value)表示颜色的亮 度。
默认情况下,OpenCV使用BGR颜色模型(每个通道8位)表示其从 文件加载或从摄像头抓取的任何图像。