opencv学习之路(7)、访问图像像素

一、动态地址访问

 1 #include <opencv2/opencv.hpp>
 2 #include<iostream>
 3 using namespace cv;
 4 using namespace std;
 5 
 6 void main(){
 7     //动态地址访问
 8     Mat img=imread("E://green.png");
 9     imshow("src",img);
10     Mat dst=img.clone();
11     int rowNumber=img.rows;//获取行数
12     int colNumber=img.cols;//获取列数
13     for(int i=0;i<rowNumber;i++){
14         for (int j = 0; j <colNumber; j++)
15         {
16             dst.at<Vec3b>(i,j)[0]=255;//蓝色通道
17             dst.at<Vec3b>(i,j)[1]=0;//绿色通道
18             dst.at<Vec3b>(i,j)[2]=0;//红色通道
19             //dst.at<uchar>(i,j)=255;//灰度图像
20         }
21     }
22     imshow("dst",dst);
23     waitKey(0);
24 }

二、指针访问(速度快)

 1 #include <opencv2/opencv.hpp>
 2 #include<iostream>
 3 using namespace cv;
 4 using namespace std;
 5 
 6 void main(){
 7         Mat img=imread("E://green.png");
 8     imshow("src",img);
 9     Mat dst=img.clone();
10     int rowNumber=img.rows;//获取行数
11     int colNumber=img.cols*img.channels();//列数×通道数=每一行的元素个数
12     for(int i=0;i<rowNumber;i++){
13         uchar* data=dst.ptr<uchar>(i);//获取每一行首地址,ptr函数可以得到图像任意行的首地址
14         for (int j = 0; j <colNumber; j++)
15         {
16             //data[j]=255;//灰度图
17             switch (j%3)
18             {
19             case 0://蓝色通道
20                 data[j]=255;
21                 break;
22             case 1://绿色通道
23                 data[j]=0;
24                 break;
25             case 2://红色通道
26                 data[j]=255;
27                 break;
28             }
29         }
30     }
31     imshow("dst",dst);
32     waitKey(0);    
33 }

三、迭代器访问(了解)

 

四、减色效果

 1 Mat img=imread("E://1.jpg");
 2     imshow("src",img);
 3     Mat dst=img.clone();
 4     int rowNumber=img.rows;
 5     int colNumber=img.cols*img.channels();//获取每一行的元素
 6     for(int i=0;i<rowNumber;i++){
 7         uchar* data=dst.ptr<uchar>(i);//获取每一行首地址
 8         for (int j = 0; j <colNumber; j++)
 9         {
10             switch (j%3)
11             {
12             case 0://蓝色通道
13                 data[j]=data[j]/64*64+64/2;
14                 break;
15             case 1://绿色通道
16                 data[j]=data[j]/64*64+64/2;
17                 break;
18             case 2://红色通道
19                 data[j]=data[j]/64*64+64/2;
20                 break;
21             }
22         }
23     }
24     imshow("dst",dst);
25     waitKey(0);

减色原理   data[j]=data[j]/64*64+64/2  可参考http://blog.csdn.net/lanchunhui/article/details/51167153

五、随机产生椒盐噪声

 1 #include <opencv2/opencv.hpp>
 2 #include<iostream>
 3 using namespace cv;
 4 using namespace std;
 5 
 6 void main(){
 7     Mat img=imread("E://1.jpg");
 8     imshow("src",img);
 9     Mat dst=img.clone();
10     int rowNumber=img.rows;
11     int colNumber=img.cols;
12     int i,j;
13     for (int k = 0; k < 400; k++)//产生噪声的个数(此时为400)
14     {
15         i=rand()%rowNumber;//任意数对行数取余
16         j=rand()%colNumber;//任意数对列数取余
17         dst.at<Vec3b>(i,j)[0]=255;
18         dst.at<Vec3b>(i,j)[1]=255;
19         dst.at<Vec3b>(i,j)[2]=255;//将这三行的“255”设置为“0”即产生椒噪声
20     }
21     imshow("dst",dst);
22     waitKey(0);
23 }

 

原文地址:https://www.cnblogs.com/little-monkey/p/7197731.html