一、动态地址访问
【示例】
1 //使用动态地址访问图像的每个像素 2 #include <opencv2/opencv.hpp> 3 #include<iostream> 4 using namespace cv; 5 using namespace std; 6 7 int main(){ 8 //动态地址访问 9 Mat img=imread("green.png"); 10 imshow("src",img); 11 Mat dst=img.clone(); 12 13 int rowNumber=img.rows;//获取行数 14 int colNumber=img.cols;//获取列数 15 16 for(int i=0;i<rowNumber;i++){ 17 for (int j = 0; j <colNumber; j++) 18 { 19 //将图像每个像素的蓝色通道置为255,红色通道和绿色通道置位0 20 dst.at<Vec3b>(i,j)[0]=255;//蓝色通道 21 dst.at<Vec3b>(i,j)[1]=0;//绿色通道 22 dst.at<Vec3b>(i,j)[2]=0;//红色通道 23 //dst.at<uchar>(i,j)=255;//灰度图像 24 } 25 } 26 imshow("dst",dst); 27 waitKey(0); 28 return 0; 29 }
二、通过指针访问图像的每个像素
【示例】
1 //通过指针访问图像的每个像素 2 #include <opencv2/opencv.hpp> 3 #include<iostream> 4 5 using namespace cv; 6 using namespace std; 7 8 int main(){ 9 Mat img=imread("green.png"); 10 imshow("src",img); 11 Mat dst=img.clone(); 12 int rowNumber=img.rows;//获取行数 13 int colNumber=img.cols*img.channels();//列数×通道数=每一行的元素个数 14 for(int i=0;i<rowNumber;i++){ 15 uchar* data=dst.ptr<uchar>(i);//获取每一行首地址,ptr函数可以得到图像任意行的首地址 16 for (int j = 0; j <colNumber; j++) 17 { 18 //data[j]=255;//灰度图 19 switch (j%3) 20 { 21 case 0://蓝色通道 22 data[j]=255; 23 break; 24 case 1://绿色通道 25 data[j]=0; 26 break; 27 case 2://红色通道 28 data[j]=255; 29 break; 30 } 31 } 32 } 33 imshow("dst",dst); 34 waitKey(0); 35 return 0; 36 }
三、通过迭代器访问图像的每个像素
1 Mat img = imread("1.png"); 2 Mat dst = img.clone(); 3 4 imshow("src", img); 5 6 Mat <Vec3b>::iterator it = dst.begin<Vec3b>();//初始位置 7 Mat <Vec3b>::iterator itend = dst.end<Vec3b>();//终止位置 8 9 for(; it != itend; ++it) 10 { 11 (*it)[0] = 0;//蓝色通道 12 (*it)[1] = 255;//绿色通道 13 (*it)[2] = 0;//红色通道 14 } 15 16 imshow("dst", dst); 17 waitKey(0); 18 destroyAllWindows();
【示例】
1 //通过迭代器范围图像的每个像素 2 #include <opencv2/opencv.hpp> 3 #include<iostream> 4 5 using namespace cv; 6 using namespace std; 7 8 int main(){ 9 Mat img=imread("green.png"); 10 imshow("src",img); 11 Mat dst=img.clone(); 12 Mat_<Vec3b>::iterator it = dst.begin<Vec3b>();//初始位置 13 Mat_<Vec3b>::iterator itend = dst.end<Vec3b>();//终止位置 14 15 for(; it != itend; ++it) 16 { 17 (*it)[0] = 0;//蓝色通道 18 (*it)[1] = 255;//绿色通道 19 (*it)[2] = 255;//红色通道 20 } 21 imshow("dst",dst); 22 waitKey(0); 23 return 0; 24 }
四、减色效果(通过指针访问图像的每个像素)
【示例】
1 //减色效果 2 3 #include <opencv2/core/core.hpp> 4 #include <opencv2/highgui/highgui.hpp> 5 #include <opencv2/imgproc/imgproc.hpp> 6 #include <iostream> 7 8 using namespace std; 9 using namespace cv; 10 11 int main() 12 { 13 Mat img=imread("green.png"); 14 imshow("src",img); 15 Mat dst=img.clone(); 16 int rowNumber=img.rows; 17 int colNumber=img.cols*img.channels();//获取每一行的元素 18 for(int i=0;i<rowNumber;i++){ 19 uchar* data=dst.ptr<uchar>(i);//获取每一行首地址 20 for (int j = 0; j <colNumber; j++) 21 { 22 switch (j%3) 23 { 24 case 0://蓝色通道 25 data[j]=data[j]/4+64/2; 26 break; 27 case 1://绿色通道 28 data[j]=data[j]/4+64/2; 29 break; 30 case 2://红色通道 31 data[j]=data[j]/4+64/2; 32 break; 33 } 34 } 35 } 36 imshow("dst",dst); 37 waitKey(0); 38 }
1 减色原理 data[j]=data[j]/64*64+64/2 可参考http://blog.csdn.net/lanchunhui/article/details/51167153
五、随机产生椒盐噪声
【示例】
1 //随机产生椒盐噪声 2 //通过动态地址访问图像的每个像素 3 #include <opencv2/opencv.hpp> 4 #include<iostream> 5 6 using namespace cv; 7 using namespace std; 8 9 int main(){ 10 Mat img=imread("1.jpg"); 11 imshow("src",img); 12 Mat dst=img.clone(); 13 int rowNumber=img.rows; 14 int colNumber=img.cols; 15 int i,j; 16 for (int k = 0; k < 400; k++)//产生噪声的个数(此时为400) 17 { 18 i=rand()%rowNumber;//任意数对行数取余 19 j=rand()%colNumber;//任意数对列数取余 20 dst.at<Vec3b>(i,j)[0]=255; 21 dst.at<Vec3b>(i,j)[1]=255; 22 dst.at<Vec3b>(i,j)[2]=255;//将这三行的“255”设置为“0”即产生椒噪声 23 } 24 imshow("dst",dst); 25 waitKey(0); 26 return 0; 27 }