为了编写计算机视觉应用,我们必须会存取图像的内容,如修改或者创建图像,这些过程都需要对图像的基本元素进行操作,即所谓的像素。
1【存取像素值】
为了存取矩阵元素,我们需要在代码中指定元素所在的行和列,程序会返回相应的元素。如果是单通道的,返回值是单个数值;如果是多通道的,返回值是一组向量(Vector)。
我们先通过一个简单的例子演示如何直接存取像素值。在图像随机添加一些椒盐噪点,随机将一些像素设置为白色或者黑色。在传输过程中,如果部分像素值丢失,那么这种噪点就会出现。首先写一个简单的函数
void salt(cv::Mat&image, int n)
{
}
函数功能很简单,就不介绍了。
测试程序如下
效果如下所示
2【通过指针遍历图像】
通过一个颜色缩减函数来说明指针遍历图像的方法。主要函数如下
void colorReduce(const cv::Mat& image, cv::Mat& result, int div = 64)
{
}
运行效果如下所示
成员变量cols代表图像的列数(宽度),rows代表图像的行数(高度),step代表以字节为单位的图像的有效宽度。即使你的图像的元素类型不是uchar,step仍然代表着行的字节数。像素的大小可以油elemSize函数得到:对于一个三通道的short行矩阵(CV_16SC3),elemSize返回6。图像的通道数可以由channels方法得到:对于灰度图像来说为1,对于彩色图像来说为3。total函数返回矩阵的像素个数。一般出于效率考虑,每行会填补一些额外像素,这是因为,如果行的长度为4或者8的倍数,对于一些处理器来说,处理的更高效。如果需要根据新的尺寸和数据类型对一个矩阵进行重新分配,我们可以调用create成员函数。。而且,如果新指定的尺寸和数据类型与原有的一样,create函数会直接返回,不会对本矩阵做任何改动。图像分配内存的大小为total()*elemSize()。
3【使用迭代器遍历图像】
opencv为cv::Mat提供了与STL迭代器兼容的迭代器。可以通过cv::Mat Iteerator_的实例来得到。这是一个模板类。
未完成