学习OpenCV:滤镜系列(2)——扩张&挤压

【原文:http://blog.csdn.net/yangtrees/article/details/9095731

==============================================

版权所有:小熊不去实验室CSDN博客

==============================================


原理:凸透镜效果算法


  1. #include <math.h>  
  2. #include <opencv/cv.h>  
  3. #include <opencv/highgui.h>  
  4.   
  5. using namespace cv;  
  6. using namespace std;  
  7.   
  8. int main()  
  9. {  
  10.     Mat src = imread("D:/img/face02.jpg",1);  
  11.     int width = src.cols;  
  12.     int heigh = src.rows;  
  13.     Point center(width/2,heigh/2);  
  14.     Mat img1(src.size(),CV_8UC3);  
  15.     Mat img2(src.size(),CV_8UC3);  
  16.     src.copyTo(img1);  
  17.     src.copyTo(img2);  
  18.   
  19.     //【1】放大  
  20.     int R1 = sqrtf(width*width+heigh*heigh)/2; //直接关系到放大的力度,与R1成正比;  
  21.       
  22.     for (int y=0; y<heigh; y++)  
  23.     {  
  24.         uchar *img1_p = img1.ptr<uchar>(y);  
  25.         for (int x=0; x<width; x++)  
  26.         {  
  27.             int dis = norm(Point(x,y)-center);  
  28.             if (dis<R1)  
  29.             {  
  30.                 int newX = (x-center.x)*dis/R1+center.x;  
  31.                 int newY = (y-center.y)*dis/R1+center.y;  
  32.   
  33.                 img1_p[3*x]=src.at<uchar>(newY,newX*3);  
  34.                 img1_p[3*x+1]=src.at<uchar>(newY,newX*3+1);  
  35.                 img1_p[3*x+2]=src.at<uchar>(newY,newX*3+2);  
  36.             }  
  37.         }  
  38.     }  
  39.   
  40.     //【2】挤压  
  41.     for (int y=0; y<heigh; y++)  
  42.     {  
  43.         uchar *img2_p = img2.ptr<uchar>(y);  
  44.         for (int x=0; x<width; x++)  
  45.         {  
  46.             double theta = atan2((double)(y-center.y),(double)(x-center.x));//使用atan出现问题~  
  47.   
  48.   
  49.             int R2 = sqrtf(norm(Point(x,y)-center))*8; //直接关系到挤压的力度,与R2成反比;  
  50.               
  51.             int newX = center.x+(int)(R2*cos(theta));  
  52.   
  53.             int newY = center.y+(int)(R2*sin(theta));  
  54.   
  55.             if(newX<0) newX=0;  
  56.             else if(newX>=width) newX=width-1;  
  57.             if(newY<0) newY=0;  
  58.             else if(newY>=heigh) newY=heigh-1;  
  59.                       
  60.   
  61.             img2_p[3*x]=src.at<uchar>(newY,newX*3);  
  62.             img2_p[3*x+1]=src.at<uchar>(newY,newX*3+1);  
  63.             img2_p[3*x+2]=src.at<uchar>(newY,newX*3+2);  
  64.         }  
  65.     }  
  66.     imshow("src",src);  
  67.     imshow("img1",img1);  
  68.     imshow("img2",img2);  
  69.     waitKey();  
  70.     imwrite("D:/img/扩张.jpg",img1);  
  71.     imwrite("D:/img/挤压.jpg",img2);  
  72. }  

原图:


扩张:


挤压:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值