第2章 构建图像处理工具
2.1 基本数据类型
OpenCV中的基本数据类型是Mat,用来存储图像。总体上讲,一幅图像被保存为一个头加上一个包含像素数据的内存区。图像有若干个通道。灰度图像有一个通道,而彩色图像通常有红、绿和蓝三个构成成分(但是OpenCV以其逆序,即蓝、绿和红来存储这三个分量),还可以使用第四个透明度(alpha)通道。可以用img.channels()获取一幅img图像的通道数。
使用若干个位来存储一幅图像的每个像素,这被称为图像深度(image depth)。对于灰度图像,像素通常存储为8位,因此允许256个灰度级(从整数值0到255)。对于彩色图像,每个像素存储为3个字节,每个颜色通道占用一个字节。某些操作必须以浮点格式存储像素。可以使用img.depth()获取图像深度,其返回值是:
CV_8U,8位无符号整数(0~255)
CV_8S,8位有符号整数(-128~127)
CV_16U,16位无符号整数(0~65?535)
CV_16S,16位有符号整数(-32?768~32?767)
CV_32S,32位有符号整数(-2?147?483?648~2?147?483?647)
CV_32F,32位浮点数
CV_64F,64位浮点数
注意,对于灰度图像和彩色图像,最常见的图像深度是CV_8U。使用方法convertTo可以将一种图像深度转换为另一种图像深度:
在浮点图像上进行操作(即像素值是数学运算的结果)是很常见的。如果使用imshow()显示这幅图像,将不会看到任何有意义的内容。在这种情况下,必须将像素转换到0~255整数范围。函数convertTo实现一种线性变换并有两个额外的参数alpha和beta,分别表示增加一个尺度因子和一个增量值。这意味着每个像素p被转
换为:
newp = alpha*p + beta
它可以用来正确地显示浮点图像。假设img图像有最小值m和最大值M(参考下面的代码,看看如何获取这些值),则我们可以使用:
这些代码将结果图像值的范围映射到0~255范围。图2-1显示了运行该代码的
结果。
使用行属性和列属性可以获取图像的大小。还有一个size属性可获得二者:
除了图像本身,其他数据类型都很常见,请参考表2-1:
其中某些类型有附加操作。例如,可以检查一个点是否位于一个矩形内:
这里的参数p和参数r分别是点(二维)和矩形。注意,在任何情况下,表2-1并不是非常完备的;OpenCV的相关方法提供了更多的支撑结构。