一、动态地址访问
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std; void main(){
//动态地址访问
Mat img=imread("E://green.png");
imshow("src",img);
Mat dst=img.clone();
int rowNumber=img.rows;//获取行数
int colNumber=img.cols;//获取列数
for(int i=;i<rowNumber;i++){
for (int j = ; j <colNumber; j++)
{
dst.at<Vec3b>(i,j)[]=;//蓝色通道
dst.at<Vec3b>(i,j)[]=;//绿色通道
dst.at<Vec3b>(i,j)[]=;//红色通道
//dst.at<uchar>(i,j)=255;//灰度图像
}
}
imshow("dst",dst);
waitKey();
}
二、指针访问(速度快)
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std; void main(){
Mat img=imread("E://green.png");
imshow("src",img);
Mat dst=img.clone();
int rowNumber=img.rows;//获取行数
int colNumber=img.cols*img.channels();//列数×通道数=每一行的元素个数
for(int i=;i<rowNumber;i++){
uchar* data=dst.ptr<uchar>(i);//获取每一行首地址,ptr函数可以得到图像任意行的首地址
for (int j = ; j <colNumber; j++)
{
//data[j]=255;//灰度图
switch (j%)
{
case ://蓝色通道
data[j]=;
break;
case ://绿色通道
data[j]=;
break;
case ://红色通道
data[j]=;
break;
}
}
}
imshow("dst",dst);
waitKey();
}
三、迭代器访问(了解)
四、减色效果
Mat img=imread("E://1.jpg");
imshow("src",img);
Mat dst=img.clone();
int rowNumber=img.rows;
int colNumber=img.cols*img.channels();//获取每一行的元素
for(int i=;i<rowNumber;i++){
uchar* data=dst.ptr<uchar>(i);//获取每一行首地址
for (int j = ; j <colNumber; j++)
{
switch (j%)
{
case ://蓝色通道
data[j]=data[j]/*+/;
break;
case ://绿色通道
data[j]=data[j]/*+/;
break;
case ://红色通道
data[j]=data[j]/*+/;
break;
}
}
}
imshow("dst",dst);
waitKey();
减色原理 data[j]=data[j]/64*64+64/2 可参考http://blog.csdn.net/lanchunhui/article/details/51167153
五、随机产生椒盐噪声
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std; void main(){
Mat img=imread("E://1.jpg");
imshow("src",img);
Mat dst=img.clone();
int rowNumber=img.rows;
int colNumber=img.cols;
int i,j;
for (int k = ; k < ; k++)//产生噪声的个数(此时为400)
{
i=rand()%rowNumber;//任意数对行数取余
j=rand()%colNumber;//任意数对列数取余
dst.at<Vec3b>(i,j)[]=;
dst.at<Vec3b>(i,j)[]=;
dst.at<Vec3b>(i,j)[]=;//将这三行的“255”设置为“0”即产生椒噪声
}
imshow("dst",dst);
waitKey();
}