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

图像在内存中的存储方式
注: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值