2015-07-13有关opencv 中三通道图像赋值问题

来源:互联网 发布:软件运营工资待遇 编辑:程序博客网 时间:2024/05/22 23:59

最近想把直线写的博客都整理到一起, 并且加注正确标签,便于以后管理及回顾

原文地址

今天 本来是想将RGB图像转成Lab图像,并且存储在ColorLab中,但是花了好大的力气最终转换出来的L,a,b值都存不到ColorLab中,
最终:初始化ColorLab为:

Mat ColorLab;ColorLab.create(GassionImg.size(),CV_32FC3);   //将图像转到L a b 空间

在逐个访问该Mat型矩阵时,用

ColorLab.at<Vec3f>(i,j)[0]=l;ColorLab.at<Vec3f>(i,j)[1]=a;ColorLab.at<Vec3f>(i,j)[2]=b;

而不要使用先初始化一个指针p指向该ColorLab的一行,再用p[3*i]=l ;p[3*i+1]=a;p[3*i+2]=b的方式,因为这时候cout出来的都是乱码,根本与求得的L a b的值不一样。
最终存储ColorLab的程序:

uchar *pa,*pb,*pc,*p;    for (int i=0;i<Imgbgr[0].rows;i++)    {        pa=Imgbgr[0].ptr<uchar>(i);        pb=Imgbgr[1].ptr<uchar>(i);        pc=Imgbgr[2].ptr<uchar>(i);        //p=ColorLab.ptr<uchar>(i);        for (int j=0;j<Imgbgr[0].cols;j++)        {            float l,a,b;            rgb2lab (pa[j],pb[j],pc[j], l,a,b);            ColorLab.at<Vec3f>(i,j)[0]=l;            ColorLab.at<Vec3f>(i,j)[1]=a;            ColorLab.at<Vec3f>(i,j)[2]=b;            //p[3*j]=l;            //p[3*j+1]=a;                 //p[3*j+2]=b; //将图像转到Lab空间            cout<< l<< " "<< ColorLab.at<Vec3f>(i,j)[0]<<endl;            cout<<a<<" "<< ColorLab.at<Vec3f>(i,j)[1]<< endl;            cout<< b<<" "<< ColorLab.at<Vec3f>(i,j)[2]<< endl;            /*pa[j]=l;            pb[j]=a;            pc[j]=b;            */        }    }

哇塞!!花了一下午的时间就搞定一个这!!!!!!!!!!!!!真是气死人了。

原创粉丝点击