您的位置:首页 > 其它

MAT型图像的像素操作

2013-07-17 10:58 232 查看
看了很多奖图像操作的文章,个人认为这篇是最好的,我最喜欢。

转自:http://blog.csdn.net/a390641326/article/details/8686501  

1. at方法

使用at模板函数能访问某行某列的像素

例如:

img1.at(j,i)

 

访问其各个通道:

img1.at(j,i)[0]   b通道

img1.at(j,i)[1]   g通道

img1.at(j,i)[2]    r通道

2.ptr方法

使用ptr模板可以得到行数据的头指针

uchar * data=img1.ptr(j);//得到j行指针(储存行数据的地址)

访问第i个像素各个通道:

本质是根据指针移步实现,根据图像结构来移步

data[i*img1.nchanles+0]

data[i*img1.nchanles+1]

data[i*img1.nchanles+2]

3.iterator方法(迭代器)

迭代器方法,类似一维数组的模式,利用迭代器操作,方便操作像素

cv::Mat_::iterator it=img1.begin();cv::Mat_::iterator it_end=img1.end();

访问像素:

(*it)[0] b通道

(*it)[1] g通道

(*it)[2] r通道

it++

下面用代码来演示以上3中方法对读取图像所有数据,更利于理解,

为显示数据少,特自己制作了一个9×8的图像

图像和代码打包发到资源,有兴趣可以下载来看(1分),点击打开链接

 

[cpp] view plaincopy

Mat img1=imread("d:\\demo1.bmp");//9*8  

    namedWindow("demo");  

    imshow("demo",img1);  

    int i,j;  

    //方法1:at方法  

    cout<<"方法1:at方法"<<endl;  

    cout<<"-----------------------------------------------"<<endl;  

    for(j=0;j//按照图像布局打印数值  

    {  

        for(i=0;i//注意J和I的参数顺序,表示第I行J列  

        {  

            cout<<(int)img1.at(j,i)[0];//b通道  

            //cout<<" ";  

            cout<<(int)img1.at(j,i)[1];//g通道  

            //cout<<" ";  

            cout<<(int)img1.at(j,i)[2];//r通道  

            //cout<<" ";  

            cout<<"\t";  

  

        }  

        cout<<endl;  

    }  

    ////////////////////////////////////////////////////////  

    cout<<"-----------------------------------------------"<<endl;  

    //方法2:ptr方法  

    cout<<"方法2:ptr方法"<<endl;  

    cout<<"-----------------------------------------------"<<endl;  

    for(j=0;j

    {  

        uchar * data=img1.ptr(j);//得到行指针(储存行数据的地址)  

        for (i=0;i//行数据的长度为 列数*通道数  

        {  

            //仿照方式格式打印出来  

            cout<<(int)data[i];////b通道  

            i++;  

            cout<<(int)data[i];//g通道  

            i++;  

            cout<<(int)data[i];//r通道  

            cout<<"\t";  

  

  

        }  

        cout<<endl;  

    }  

    cout<<"-----------------------------------------------"<<endl;  

    cout<<"方法3:iterator方法"<<endl;//  

    cout<<"-----------------------------------------------"<<endl;  

    cv::Mat_::iterator it=img1.begin();  

    cv::Mat_::iterator it_end=img1.end();  

    for (i=0;it!=it_end;it++)//类似一维数组了  

    {  

        cout<<(int)(*it)[0];//b  

        cout<<(int)(*it)[1];//g  

        cout<<(int)(*it)[2];//r  

        cout<<"\t";  

        i++;  

        if (i>0&&i%img1.cols==0)  

        {  

            cout<<endl;//  

        }  

  

    }  

  

    cout<<"-----------------------------------------------"<<endl;  

    waitKey(0);  

    return 0;
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: