阿牧路泽

哪有那么多坚强,无非是死扛罢了
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

8、【opencv入门】访问图像的像素

Posted on 2018-09-17 15:56  阿牧路泽  阅读(195)  评论(0编辑  收藏  举报

一、动态地址访问

【示例】

 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 }