學習OpenCV:濾鏡系列(2)——擴張&擠壓

查志強發表於2014-11-25

【原文: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. }  

原圖:


擴張:


擠壓:


相關文章