打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
OPENCV2学习(1)

        这段时间在用OPENCV2实现图像运动模糊图像复原功能,其中需要合成不同模糊长度和模糊角度的运动模糊图像,由于没有直接可用的函数,于是自己编了一个,采用OPENCV2,代码如下: 

  1. <pre class="cpp" name="code">void genaratePsf(Mat &psf, double len,double angle)  
  2. {  
  3.     double half=len/2;                                            
  4.     double alpha = (angle-floor(angle/ 180) *180) /180* PI;  
  5.     double cosalpha = cos(alpha);  
  6.     double sinalpha = sin(alpha);  
  7.     int xsign;  
  8.     if (cosalpha < 0)  
  9.     {  
  10.         xsign = -1;  
  11.     }  
  12.     else  
  13.     {  
  14.         if (angle == 90)  
  15.         {  
  16.             xsign = 0;  
  17.         }  
  18.         else  
  19.         {  
  20.             xsign = 1;  
  21.         }  
  22.     }  
  23.     int psfwdt = 1;  
  24.     int sx = (int)fabs(half*cosalpha + psfwdt*xsign - len*EPS);  
  25.     int sy = (int)fabs(half*sinalpha + psfwdt - len*EPS);  
  26.     Mat_<double> psf1(sy, sx, CV_64F);  
  27.     Mat_<double> psf2(sy * 2, sx * 2, CV_64F);  
  28.     int row = 2 * sy;  
  29.     int col = 2 * sx;  
  30.     /*为减小运算量,先计算一半大小的PSF*/  
  31.     for (int i = 0; i < sy; i++)  
  32.     {  
  33.         double* pvalue = psf1.ptr<double>(i);  
  34.         for (int j = 0; j < sx; j++)  
  35.         {  
  36.             pvalue[j] = i*fabs(cosalpha) - j*sinalpha;  
  37.   
  38.             double rad = sqrt(i*i + j*j);  
  39.             if (rad >= half && fabs(pvalue[j]) <= psfwdt)  
  40.             {  
  41.                 double temp = half - fabs((j + pvalue[j] * sinalpha) / cosalpha);  
  42.                 pvalue[j] = sqrt(pvalue[j] * pvalue[j] + temp*temp);  
  43.             }  
  44.             pvalue[j] = psfwdt + EPS - fabs(pvalue[j]);  
  45.             if (pvalue[j] < 0)  
  46.             {  
  47.                 pvalue[j] = 0;  
  48.             }  
  49.         }  
  50.     }  
  51.     /*将模糊核矩阵扩展至实际大小*/  
  52.     for (int i = 0; i < sy; i++)  
  53.     {  
  54.         double* pvalue1 = psf1.ptr<double>(i);  
  55.         double* pvalue2 = psf2.ptr<double>(i);  
  56.         for (int j = 0; j < sx; j++)  
  57.         {  
  58.             pvalue2[j] = pvalue1[j];  
  59.         }  
  60.     }  
  61.   
  62.     for (int i = 0; i < sy; i++)  
  63.     {  
  64.         for (int j = 0; j < sx; j++)  
  65.         {  
  66.             psf2[2 * sy -1 - i][2 * sx -1 - j] = psf1[i][j];  
  67.             psf2[sy + i][j] = 0;  
  68.             psf2[i][sx + j] = 0;  
  69.         }  
  70.     }  
  71.     /*保持图像总能量不变,归一化矩阵*/  
  72.     double sum = 0;  
  73.     for (int i = 0; i < row; i++)  
  74.     {  
  75.         for (int j = 0; j < col; j++)  
  76.         {  
  77.             sum+= psf2[i][j];  
  78.         }  
  79.     }  
  80.     psf2 = psf2 / sum;  
  81.     if (cosalpha>0)  
  82.     {  
  83.         flip(psf2, psf2, 0);  
  84.     }  
  85.   
  86.     //cout << "psf2=" << psf2 << endl;  
  87.     psf = psf2;  

 模糊长度为20,模糊角度为40的模糊核,效果如下图:

       

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【OpenCV】绘制直方图
一种细化算法及其与opencv的实现
02_OpenCv学习笔记(69)
20120419-opencv2.3绘制抛物线
OpenCV学习笔记(五十一)——imge stitching图像拼接stitching
OpenCV矩形检测
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服