• 图像处理之图像拼接四


    1 亮度校正的代码

    实际上就是把图像im1 和图像im2 的重合部分转换到hsv颜色空间中,计算两个重合部分亮度和的比值,用这个比值去校正图像im2

    void colorjust(cv::Mat &im1,cv::Mat &im2, int stitchlength)
    {
        int soureheight=im1.rows;
        int sourewidth=im1.cols;
        int xsum=stitchlength;
        /////////////////////////////////////////
        int channle = im1.channels();
        float v2=0;
        for (int jx=0;jx<soureheight;jx++)
        {
            uchar *data =im2.ptr<uchar>(jx);
            for (int iy=0;iy<xsum;iy++)
            {
                float I2=0.59*data[iy*channle+0]+0.11*data[iy*channle+1]+0.3*data[iy*channle+2];
                v2=v2+I2;
            }
        }
    
        float v1=0;
        for (int jx=0;jx<soureheight;jx++)
        {
            uchar *data =im1.ptr<uchar>(jx);
            for (int iy=sourewidth-xsum;iy<sourewidth;iy++)
            {
                float I1=0.59*data[iy*channle+0]+0.11*data[iy*channle+1]+0.3*data[iy*channle+2];
                v1=v1+I1;
            }
        }
        float k=v1/v2;
        for (int jx=0;jx<soureheight;jx++)
        {
            uchar *data =im2.ptr<uchar>(jx);
            for (int iy=0;iy<sourewidth;iy++)
            {
                data[iy*channle+0]=k*data[iy*channle+0];
                data[iy*channle+1]=k*data[iy*channle+1];
                data[iy*channle+2]=k*data[iy*channle+2];
            }
        }
    }

    2  弄出背景,转到lab空间,分离处L,根据这个L建立一个模板,求解L到L模板的映射。来一个图像,将这个图像分离处L,利用映射去校正,然后回到RGB空间中

    void newbackground(IplImage *image1, cv::Mat& listtable)
    {
    
        //读取背景图像,分离出l分量放入testimg
        IplImage *testimg=cvCreateImage(cvGetSize(image1),8,1);
        IplImage *newtestimg=cvCreateImage(cvGetSize(image1),8,1);
        cvZero(testimg);
        cvZero(newtestimg);
        cv::Mat ming1(image1,0); 
        cv::cvtColor(ming1, ming1, CV_BGR2Lab);
        uchar *data1;
        int channle = ming1.channels();
        for(int x=0;x<image1->height;x++)
        {
            data1 =ming1.ptr<uchar>(x);
            for(int y=0;y<image1->width;y++)
            {
                BYTE vb=ming1.at<cv::Vec3b>(x,y)[0];
                BYTE vg=ming1.at<cv::Vec3b>(x,y)[1];
                BYTE vr=ming1.at<cv::Vec3b>(x,y)[2];
                float vm11=vb;
                cvSet2D(testimg,x,y,cvScalar(vm11));
    
            }
        }
        //背景建模
        int time=4;
        cv::Mat mingt(testimg,0); 
        cv::Mat mingnt(newtestimg,0); 
        uchar *datan=mingt.ptr<uchar>(testimg->height/2);
        int centervalue=datan[testimg->width/2];
        for (int i=1;i<=time;i++)
        {
            if (i==1)
            {
                for(int x=0;x<testimg->height;x++)
                {
                    uchar *datant=mingnt.ptr<uchar>(x);
                    for(int y=0;y<testimg->width;y++)
                    {
                        datant[y]=centervalue-3;
                    }
                }
            }else if (i==2)
            {
                for(int x=testimg->height/4;x<testimg->height*0.75;x++)
                {
                    uchar *datant=mingnt.ptr<uchar>(x);
                    for(int y=testimg->width/4;y<testimg->width*0.75;y++)
                    {
                        datant[y]=centervalue-2;
                    }
                }
            }else if (i==3)
            {
                for(int x=3*testimg->height/8;x<5*testimg->height/8;x++)
                {
                    uchar *datant=mingnt.ptr<uchar>(x);
                    for(int y=3*testimg->width/8;y<5*testimg->width/8;y++)
                    {
                        datant[y]=centervalue-1;
                    }
                }
            }else if (i==4)
            {
                for(int x=7*testimg->height/16;x<9*testimg->height/16;x++)
                {
                    uchar *datant=mingnt.ptr<uchar>(x);
                    for(int y=7*testimg->width/16;y<9*testimg->width/16;y++)
                    {
                        datant[y]=centervalue;
                    }
                }
            }
        }
        //计算list 
        for(int x=0;x<testimg->height;x++)
        {
            uchar *datat=mingt.ptr<uchar>(x);
            uchar *datant=mingnt.ptr<uchar>(x);
            for(int y=0;y<testimg->width;y++)
            {
                if (datat[y]!=0)
                {
                    float value=(float)datant[y]/(float)datat[y];
                    listtable.ptr<float>(x)[y]=value;
                }
    
            }
        }
        //释放
        cvReleaseImage(&testimg);
        cvReleaseImage(&newtestimg);
    
    }
  • 相关阅读:
    面向对象程序设计(JAVA) 第14周学习指导及要求
    面向对象程序设计(JAVA) 第13周学习指导及要求
    面向对象程序设计(JAVA) 第12周学习指导及要求
    让小球做圆周运动,你有几种办法?
    💥2020面试准备系列(一):JS
    秒懂js的垃圾回收
    jqgrid计算表单
    CSS揭秘实用技巧总结
    利用css 实现 视觉差效果
    前端经典面试题解密:JS的new关键字都干了什么?
  • 原文地址:https://www.cnblogs.com/love6tao/p/6090219.html
Copyright © 2020-2023  润新知