像素是图像的基本元素,从根本上来说,一张图像是一个由数值组成的矩阵,矩阵的每一个元素代表一个像素,对于灰度图像来说,像素由8位无符号数来表示的(0-255),对于彩色图像来说,每个像素需要3个8位无符号数来表示红绿蓝三个颜色通道,这样的矩阵元素为三元数。
为了获取矩阵元素,需要在代码中指定元素所在的行和列,程序会返回相应的元素。如果图像是单通道的,返回值是单个数值;如果图像是多通道的,返回值则是一组向量(Vector)。
类cv::Mat有若干成员函数可以获取图像的属性。公有成员变量cols和rows给出了图像的宽和高。成员函数at(int y,int x)可以可以用来存取图像元素。
这里我们通过一个简单的函数来说明如何直接存取像素值,这个函数能在图像中加入椒盐噪点。通过调用这个函数来实现像素的存取。
#include<opencv2/opencv.hpp>
using namespace cv;
void salt(Mat &image,int n)
{
for(int k=0;k<n;k++)
{
int i=rand()%image.cols;
int j=rand()%image.rows;
if(image.channels()==1)//灰度图
{
image.at<uchar>(j,i)=255;
}
else if(image.channels()==3)//彩色图
{
image.at<Vec3b>(j,i)[0]=255;
image.at<Vec3b>(j,i)[1]=255;
image.at<Vec3b>(j,i)[2]=255;
}
}
}
下面是主程序:
#include"opencv2/opencv.hpp"
using namespace cv;
void salt(Mat&, int n);
int main()
{
srand(getTickCount());//初始化随机数发生器
Mat image=imread("Demo.jpg",1);
if(!image.data)return -1;
namedWindow("src");
imshow("src",image);
salt(image,7000);
namedWindow("dst");
imshow("dst",image);
imwrite("salted.bmp",image);
waitKey(3000);
return 0;
}
处理的结果如图所示: