zoukankan      html  css  js  c++  java
  • 图像处理之图像拼接

        图像拼接是图像处理中最为常见的一个功能,在不考虑旋转的情况下,也就是需要求取拼接亮就行了,然而当光源是点光源时,往往成像都是高斯性质,

    这样会导致中间亮,两边暗或者四周暗,在这种情况下拼接,图像会存在很明显的拼接痕迹。

        因此,本文针对上述拼接痕迹,设计了一种线性平滑的方法。

    上代码:

     1 CString leftimagepath;
     2                 CString rightimagepath;
     3                 leftimagepath.Format("0-%d-%d.jpg",i,j);
     4                 leftimagepath=pathIn+leftimagepath;
     5                 rightimagepath.Format("0-%d-%d.jpg",i,j+1);
     6                 rightimagepath=pathIn+rightimagepath;
     7                 IplImage* leftimg=cvLoadImage(leftimagepath,-1);
     8                 IplImage* rightimg=cvLoadImage(rightimagepath,-1);
     9                 sourewidth=rightimg->width;
    10                 soureheight=rightimg->height;
    11                 IplImage* rightresult=cvCreateImage(cvSize(sourewidth*2,soureheight),8,rightimg->nChannels);
    12                 cvZero(rightresult);
    13                 cvSetImageROI(rightresult,cvRect(sourewidth-xsum,0,sourewidth,soureheight));
    14                 cvCopy(rightimg,rightresult);
    15                 cvResetImageROI(rightresult);
    16                 IplImage* result=cvCreateImage(cvSize(sourewidth*2,soureheight),8,rightimg->nChannels);
    17                 cv::Mat imleft(leftimg,0); //左边的图像
    18                 cv::Mat imright(rightresult,0); //右边的图像,但是右边的有效区域开始于(左边的图像大小减去重合量)
    19                 cv::Mat dst(result,0); //结果图像
    20                 int channle = imright.channels();
    21                 for(int jx = 0;jx < imright.rows;jx++)
    22                 {   
    23                     // 行定位
    24                     uchar *data =dst.ptr<uchar>(jx);                // 最终要得到的拼接图
    25                     uchar *data2 = imleft.ptr<uchar>(jx);        // 左图
    26                     uchar *datar = imright.ptr<uchar>(jx);        // 单应变换后(右图)
    27                     for (int iy=0,q =0;iy < imright.cols;iy++)
    28                     {
    29 
    30                         if (iy<imleft.cols && datar[iy*channle+0]==0 && datar[iy*channle+1]==0 && datar[iy*channle+2]==0)
    31                         {    //只在左图部分
    32                             data[iy*channle+0] = data2[iy*channle+0];
    33                             data[iy*channle+1] = data2[iy*channle+1];
    34                             data[iy*channle+2] = data2[iy*channle+2];
    35                             q++;                                                 // 进入右图的标记
    36                         }
    37                         else if(iy<imleft.cols )
    38                         {    //在左图也在右图部分
    39                             float overlapwidth = float(imleft.cols - q);         // 重叠区域的宽度
    40                             float overlapratio = float(iy-q);                     // 当前位置的重叠比例
    41                             float thr = overlapratio/overlapwidth;                 // 阈值
    42                             data[iy*channle+0] = (1-thr) * data2[iy*channle+0] + thr * datar[iy*channle+0];
    43                             data[iy*channle+1] = (1-thr) * data2[iy*channle+1] + thr * datar[iy*channle+1];
    44                             data[iy*channle+2] = (1-thr) * data2[iy*channle+2] + thr * datar[iy*channle+2];
    45                         }
    46                         else if(iy>=imleft.cols)
    47                         {    //只在右图部分
    48                             data[iy*channle+0] = datar[iy*channle+0];
    49                             data[iy*channle+1] = datar[iy*channle+1];
    50                             data[iy*channle+2] = datar[iy*channle+2];
    51                         }
    52                     }//iy
    53                  }//jx
    54                     //保存图像
    55                     //保存当前拼接后的
    56                     cvSetImageROI(result,cvRect(0,0,rightimg->width-xsum,rightimg->height));
    57                     CString saveleftimagepath;
    58                     saveleftimagepath.Format("0-%d-%d.jpg",i,j);
    59                     saveleftimagepath=pathIn+saveleftimagepath;
    60                     cvSaveImage(saveleftimagepath,result);
    61                     cvResetImageROI(result);
    62                     //覆盖原始图像
    63                     CString saverigimagepath;
    64                     saverigimagepath.Format("0-%d-%d.jpg",i,j+1);
    65                     saverigimagepath=pathIn+saverigimagepath;
    66                     cvSetImageROI(result,cvRect(rightimg->width-xsum,0,rightimg->width,rightimg->height));
    67                     cvSaveImage(saverigimagepath,result);
    68                     cvResetImageROI(result);
    69                     /*cvNamedWindow("rs",0);
    70                     cvShowImage("rs",result);
    71                     cvWaitKey(0);*/

    没有采用上述拼接结果:

     采用上述过渡算法的结果:

  • 相关阅读:
    (C#)Windows Shell 外壳编程系列3 上下文菜单(iContextMenu)(一)右键菜单
    修改BlogEngine.NET:给摘要显示添加图片显示的另一种方法
    (C#)Windows Shell 外壳编程系列8 同后缀名不同图标?
    Win2k下isapi dll调试设置
    战争机器作弊码
    使用Windows系统提供的IP控件
    Delphi中TUDPSocket的使用
    Delphi字符串、PChar与字符数组之间的转换
    Delphi高效的字符串处理
    (C#)Windows Shell 外壳编程系列4 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令
  • 原文地址:https://www.cnblogs.com/love6tao/p/5974185.html
Copyright © 2011-2022 走看看