方法1.直接访问法
如果图像为单通道 src.
at<uchar>(j,i)
如果图像为三通道 src.at<Vec3b>(j,i)[channel]
例程:
图像中添加椒盐噪声
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/core/core.hpp"
#include<iostream>
usingnamespacecv;
usingnamespacestd;
int_tmain(intargc,_TCHAR*argv[])
{
Matsrc= imread("D:\\1.jpg");
intloop= 100000;
if(!src.data)
{
cout<<"Image loading failed"<<endl;
}
Matoutput;
src.copyTo(output);//注解1
if(output.channels()==1)
{
for(intk=0;k<loop;k++)
{
inti=rand()%output.cols;
intj=rand()%output.rows;
output.at<uchar>(j,i)=255;
}
}
if(output.channels()==3)
{
for(intk=0;k<loop;k++)
{
inti=rand()%output.cols;
intj=rand()%output.rows;
output.at<Vec3b>(j,i)[0]=255;//B
output.at<Vec3b>(j,i)[1]=255;//G
output.at<Vec3b>(j,i)[2]=255; //R
}
}
namedWindow("src",WINDOW_AUTOSIZE);
namedWindow("output",WINDOW_AUTOSIZE);
imshow("src",src);
imshow("output",output);
waitKey(0);
return0;
}
注解1:copyTo语句是值的传递,对复制后图像进行处理不会影响原始图像,程序运行结果如下:
如果将此行代码改为“output=src;”程序运行结果如下:
可以看出“output=src;”实现的数据的复制实际上是使得output和src两者均指向同一图像数据,对复制后图像进行处理会影响原始图像