智能硬件与机器视觉:基于树莓派、Python和OpenCV
上QQ阅读APP看书,第一时间看更新

4.2.2 访问单个像素

首先,你要知道什么是像素?

所有图像都是由像素构成的,像素是图像的基本元素。一个640×480的图像有640列(宽度)和480行(高度)。这个尺寸下的图像就有640×480=307200个像素。

灰阶图像中的每个像素有一个灰阶代表的值。在OpenCV中,有256种灰阶,从0到255。因此灰阶图像中有与每个像素相关联的灰阶值。

彩色图像中的像素还有另一层附加信息。在了解图像处理时,你很快就会熟悉好几种色彩模式。为简单起见,这里只考虑RGB色彩模式。

在OpenCV中,RGB(红色,绿色,蓝色)色彩模式中的彩色图像是与每个像素相关联的3元组:(B,G,R),如图4-1所示。

图4-1 RGB色彩模式

其中,顶部为灰阶渐变,较亮的像素接近255,而较暗的像素接近0;底部为RGB维恩图,其中较亮的像素更接近中心。

请注意,顺序是BGR而不是RGB。这是因为多年前OpenCV首次开发时,标准是BGR顺序。多年来,该标准现已变成RGB,但OpenCV仍然保留这种“遗留”的BGR排序,以确保之前编写的代码不会报错。

BGR 3元组的每个值的范围为[0,255]。那么,OpenCV中RGB图像中的每个像素一共有多少种颜色可能性?这很简单:256×256×256=16777216。

知道了什么是像素,下面我们来看如何查找图像中单个像素的值,具体实现代码如下:


 # 访问位于x = 50,y = 100的RGB像素, #17
# 请记住OpenCV以BGR顺序存储图像而不是RGB #18
(B, G, R) = image[100, 50]  #19
print("R={}, G={}, B={}".format(R, G, B))   #20

如前所示,图像尺寸为:width=768,height=512,depth=3。只要在最大宽度和高度范围内,就可以通过坐标方式来访问数组中的各个像素值。

代码image[100,50]会从x=50和y=100的像素位置产生3元组BGR值(再次注意,height是行数并且width是列数,你必须接受这种表述方式)。如上所述,OpenCV以BGR顺序存储图像(这与Matplotlib不同)。看看第19行就知道提取像素颜色值是多么的简单。

在终端上显示的像素值如下:


 R=255, G=255, B=238