opencv访问图像像素及简单应用

xiaoxiao2021-02-28  132

图像在内存中的存储方式 注:opencv 的通道顺序是BGR 而不是RGB

可以用isCountinous()判断矩阵是否连续存储 访问图像中像素方法 1)动态地址计算访问

Mat img=imread("1.jpg"); Mat dst=img.clone(); imshow("src",img); int rowNumber=img.rows;//行数 int colNumber=img。cols;//列数 for(int i=0;i<rowNumber;i++) { for(int j=0;j<rowNumber;j++) { dat.at<Vec3b>(i,j)[0]=0;//访问第i行,第j列像素蓝色通道 dat.at<Vec3b>(i,j)[1]=0;//访问第i行,第j列像素绿色通道 dat.at<Vec3b>(i,j)[2]=255;//红色通道 } } imshow("dst",dst); waitKey(0); dastroyAllWindows(); //dst.at<uchar>(i,j)=255;//灰度图像

成员函数at用来读取像素,image.at(i,j)[channel]=value; at方法不会进行类型转换,所以需要制定图像元素类型,并且要和矩阵内类型一致 2)指针访问

int rowNUmber=img.rows;//行数 int colNUmber=img.cols*img.channels();//列数*通道数=每一行的元素个数 for(int i=0;i<rowNumber;i++) { uchar*data=dst.ptr<uchar>(i);//获取每一行的首地址 for(int j=0;j<colNumber;j++)//列循环 { switch(j%3//RGB图像通道区分 { case 0://蓝色通道 data[j]=0; break; case 1://绿色通道 data[j]=255; break; case 2://红色通道 data[j]=0; break; default: break; } } } //data[j]=255//灰度图像 Mat类提供了ptr函数可以得到图像任意行的首地址

3)迭代器访问

Mat img=imread("1.jpg"); Mat dst=img.clone(); imshow("src",img); Mat_<Vec3b>::iterator it=dst.begin<Vec3b>();//初始位置 Mat_<Vec3b>::iterator itend=dst.end<Vec3b>();//终止位置 for(;it!=itend;i++) { (*it)[0]=0;//蓝色通道 (*it)[1]=255;//绿色通道 (*it)[2]=0;//红色通道 } imshow("dat",dst); waitKey(0); dastroyZWindows(); //Mat_类是Mat的模板子类,beginend模板方法可以获得迭代器的开始和结束位置

减少效果 data[j]=data[j]/64*64+64/2; 雪花效果 : 随机选取来 int i,j; for(int k=0,k<200;k++) { i=rand()%rowNumber; j=rand()%colNumber; dst.at(i,j)[0]=255; dst.at(i,j)[1]=255; dst.at(i,j)[2]=255; }

转载请注明原文地址: https://www.6miu.com/read-63970.html

最新回复(0)