基本图像容器Mat,访问图像元素方式

创建一个Mat对象的多种方法:

1:使用Mat()构造函数

Mat(2,2,CV_8UC3,Scalar(0,0,255));

对于二维多通道图像,首先要定义的是其尺寸,即行数和列数。然后需要指定存储元素的数据类型以及每个矩阵点的通道数。为此,依据下面的规则有多种定义:

即:cv_[位数]【带符号与否】【类型前缀】c【通道数】

2:方法二在c\c++中通过构造函数进行初始化

示范代码:

int sz[3]={2,2,2};

Mat L(3,sz,CV_8UC,Scalar::all(0));

上面的例子演示了如何创建一个超过两维的矩阵:指定维数,然后传递一个指向数组的指针,这个数组包括每个维度的尺寸;

3:为已存在的IplImage指针创建信息头。

示范代码:

IplImage* img=cvLoadImage("1.jpg",0);

Mat mac(img);

4:利用Create()函数

利用Mat类中的Create()成员函数进行Mat类的初始化操作,示范代码如下。

M.create(4,4,CV_8UC(2));

5:采用MATLAB式的初始化方式

方法五采用MATLAB形式的初始化方式:zeros(),ones(),eyes().使用一下方式指定尺寸和数据类型:

Mat E=Mat::eye(4,4,CV_64F);

Mat O=Mat::ones(2,2,CV_32F);

Mat Z =Mat::zeros(3,3,CV_8UC1);

6:对小矩阵使用逗号分割式初始化函数

Mat C=(Mat_double>(3,3)<<0,0,1,3,34,56,2,3,4);

7:为已存在的对象创建新信息头

Mat RowClone=C.row(1).clone();

访问图像元素的方式

1:用指针访问元素

用指针访问元素的这种方法利用的是c语言中的操作符【】;这种方法最快,但是略有点抽象。

范例代码:

int rowNumber=inputImage.rows;

int colNumber=inputImage.cols;

for(int i=0;i<rowNumber;i++)

{

     uchar * data=inputImage.ptr<uchar>(i);//获取第i行的首地址

    for(int j=0;j<colNumber;j++)

    {

        cout<<data[j]<<endl;

     }

}

2:用迭代器操作像素

在迭代法中,我们需要做的仅仅是获得图像矩阵的begin和end,然后增加迭代直至从begin到end。将*操作符添加在迭代指针前,即可访问当前指向的内容。

相比用指针直接访问可能出现越界的问题,迭代器绝对是非常安全的方法。

//获取迭代器

Mat_<Vec3b>::iterator it=inputImage.begin<Vec3b>();//初始位置的迭代器

Mat_<Vec3b>::iterator itend=inputImage.end<Vec3b>();//初始位置的迭代器

//存取彩色图像像素

for(;it!=itend;it++)

{

    cout<<(*it)[0]<<""<<(*it)[1]<<""<<(*it)[2]<<endl;

}

3:动态地址计算

    第三中方法为用动态地址    计算来操作像素。下面是用动态地址运算配合at来实现访问像素的功能。

int rowNumber=inputImage.rows;

int colNumber=inputImage.cols;

for(int i=0;i<rowNumber;i++)

{

    

    for(int j=0;j<colNumber;j++)

    {

    cout<<inputImage.at<Vec3b>(i,j)[0]<<endl;

    cout<<inputImage.at<Vec3b>(i,j)[1]<<endl;

    cout<<inputImage.at<Vec3b>(i,j)[2]<<endl;

     }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/3019709/blog/884502

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值