OpenCV Gray2RGB[原创]

#include <iostream>
#include <cmath>
#include <opencv/cv.h>
#include <opencv/highgui.h>

using namespace cv;

struct Mapping
{
    int red;
    int green;
    int blue;
};

void gray2rgb(CvMat *src,CvMat *refer,CvMat **dest)
{
    CvMat *referG;
    Mapping mapping[256];

    int srcRows=src->rows;
    int srcCols=src->cols;
    *dest=cvCreateMat(srcRows,srcCols,CV_8UC3);

    int refRows=refer->rows;
    int refCols=refer->cols;
    referG=cvCreateMat(refRows,refCols,CV_8U);
    cvCvtColor(refer,referG,CV_RGB2GRAY);

    for (int i=0;i<256;i++)
    {
        int d=255,minD=255,minRow,minCol;
        for (int j=0;j<refRows;j++)
        {
            for (int k=0;k<refCols;k++)
            {
                CvScalar s=cvGet2D(referG,j,k);
                d=abs(s.val[0]-i);
                if (d<minD)
                {
                    minD=d;
                    minRow=j;
                    minCol=k;
                }
                if (!d) break;
            }
            if (!d) break;
        }
        CvScalar s=cvGet2D(refer,minRow,minCol);
        mapping[i].blue=s.val[0];
        mapping[i].green=s.val[1];
        mapping[i].red=s.val[2];
    }

    for (int i=0;i<srcRows;i++)
        for (int j=0;j<srcCols;j++)
        {
            CvScalar s=cvGet2D(src,i,j);
            int v=s.val[0];
            cvSet2D(*dest,i,j,cvScalar(mapping[v].red,mapping[v].green,mapping[v].blue));
        }
    cvReleaseMat(&referG);
}

int main()
{
    CvMat *src=cvLoadImageM("arnold.jpg",0);
    CvMat *refer=cvLoadImageM("road_trip.jpg",1);
    CvMat *dest;

    cvShowImage("src",src);
    cvShowImage("refer",refer);
    gray2rgb(src,refer,&dest);
    cvShowImage("dest",dest);
    while (cvWaitKey(0)!=27);
    cvReleaseMat(&src);
    cvReleaseMat(&refer);
    cvReleaseMat(&dest);
    cvDestroyAllWindows();
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容