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 }