學習OpenCV:濾鏡系列(10)——懷舊色 & 連環畫 & 熔鑄 & 冰凍

查志強發表於2014-11-25

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

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

版權所有:小熊不去實驗室CSDN部落格

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


懷舊色調色原理



  1. #include <opencv/cv.h>  
  2. #include <opencv/highgui.h>  
  3.   
  4. using namespace cv;  
  5. using namespace std;  
  6.   
  7.   
  8. int main()  
  9. {  
  10.     Mat src = imread("D:/scene04.jpg",1);  
  11.     int width=src.cols;  
  12.     int heigh=src.rows;  
  13.     RNG rng;  
  14.     Mat img(src.size(),CV_8UC3);  
  15.     for (int y=0; y<heigh; y++)  
  16.     {  
  17.         uchar* P0  = src.ptr<uchar>(y);  
  18.         uchar* P1  = img.ptr<uchar>(y);  
  19.         for (int x=0; x<width; x++)  
  20.         {  
  21.             float B=P0[3*x];  
  22.             float G=P0[3*x+1];  
  23.             float R=P0[3*x+2];  
  24.             float newB=0.272*R+0.534*G+0.131*B;  
  25.             float newG=0.349*R+0.686*G+0.168*B;  
  26.             float newR=0.393*R+0.769*G+0.189*B;  
  27.             if(newB<0)newB=0;  
  28.             if(newB>255)newB=255;  
  29.             if(newG<0)newG=0;  
  30.             if(newG>255)newG=255;  
  31.             if(newR<0)newR=0;  
  32.             if(newR>255)newR=255;  
  33.             P1[3*x] = (uchar)newB;  
  34.             P1[3*x+1] = (uchar)newG;  
  35.             P1[3*x+2] = (uchar)newR;  
  36.         }  
  37.   
  38.     }  
  39.     imshow("懷舊色",img);  
  40.     waitKey();  
  41.     imwrite("D:/懷舊色.jpg",img);  
  42. }  

原圖:



懷舊色:





連環畫原理:

連環畫的效果與影象灰度化後的效果相似,它們都是灰度圖,但連環畫增大了影象的對比度,使整體明暗效果更強.
演算法:

R = |g – b + g + r| * r / 256

G = |b – g + b + r| * r / 256;

B = |b – g + b + r| * g / 256;

  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.   
  9. int main()  
  10. {  
  11.     Mat src = imread("D:/scene04.jpg",1);  
  12.     int width=src.cols;  
  13.     int heigh=src.rows;  
  14.     RNG rng;  
  15.     Mat img(src.size(),CV_8UC3);  
  16.     for (int y=0; y<heigh; y++)  
  17.     {  
  18.         uchar* P0  = src.ptr<uchar>(y);  
  19.         uchar* P1  = img.ptr<uchar>(y);  
  20.         for (int x=0; x<width; x++)  
  21.         {  
  22.             float B=P0[3*x];  
  23.             float G=P0[3*x+1];  
  24.             float R=P0[3*x+2];  
  25.             float newB=abs(B-G+B+R)*G/256;  
  26.             float newG=abs(B-G+B+R)*R/256;  
  27.             float newR=abs(G-B+G+R)*R/256;  
  28.             if(newB<0)newB=0;  
  29.             if(newB>255)newB=255;  
  30.             if(newG<0)newG=0;  
  31.             if(newG>255)newG=255;  
  32.             if(newR<0)newR=0;  
  33.             if(newR>255)newR=255;  
  34.             P1[3*x] = (uchar)newB;  
  35.             P1[3*x+1] = (uchar)newG;  
  36.             P1[3*x+2] = (uchar)newR;  
  37.         }  
  38.   
  39.     }  
  40.     Mat gray;  
  41.     cvtColor(img,gray,CV_BGR2GRAY);  
  42.     normalize(gray,gray,255,0,CV_MINMAX);  
  43.     imshow("連環畫",gray);  
  44.     waitKey();  
  45.     imwrite("D:/連環畫.jpg",gray);  
  46. }  

連環畫效果:




熔鑄演算法

r = r*128/(g+b +1);
g = g*128/(r+b +1);
b = b*128/(g+r +1);

冰凍演算法

r = (r-g-b)*3/2;
g = (g-r-b)*3/2;
b = (b-g-r)*3/2;


  1. #include <math.h>  
  2. #include <opencv/cv.h>  
  3. #include <opencv/highgui.h>  
  4. #define MAXSIZE (32768)  
  5. using namespace cv;  
  6. using namespace std;  
  7.   
  8. void casting(const Mat& src)  
  9. {  
  10.     Mat img;  
  11.     src.copyTo(img);  
  12.     int width=src.cols;  
  13.     int heigh=src.rows;  
  14.     Mat dst(img.size(),CV_8UC3);  
  15.     for (int y=0;y<heigh;y++)  
  16.     {  
  17.         uchar* imgP=img.ptr<uchar>(y);  
  18.         uchar* dstP=dst.ptr<uchar>(y);  
  19.         for (int x=0;x<width;x++)  
  20.         {  
  21.             float b0=imgP[3*x];  
  22.             float g0=imgP[3*x+1];  
  23.             float r0=imgP[3*x+2];  
  24.   
  25.             float b = b0*255/(g0+r0+1);  
  26.             float g = g0*255/(b0+r0+1);  
  27.             float r = r0*255/(g0+b0+1);  
  28.   
  29.             r = (r>255 ? 255 : (r<0? 0 : r));  
  30.             g = (g>255 ? 255 : (g<0? 0 : g));  
  31.             b = (b>255 ? 255 : (b<0? 0 : b));  
  32.   
  33.             dstP[3*x] = (uchar)b;  
  34.             dstP[3*x+1] = (uchar)g;  
  35.             dstP[3*x+2] = (uchar)r;  
  36.         }  
  37.     }  
  38.     imshow("熔鑄",dst);  
  39.     imwrite("D:/img/熔鑄.jpg",dst);  
  40.       
  41. }  
  42.   
  43. void freezing(const Mat& src)  
  44. {  
  45.     Mat img;  
  46.     src.copyTo(img);  
  47.     int width=src.cols;  
  48.     int heigh=src.rows;  
  49.     Mat dst(img.size(),CV_8UC3);  
  50.     for (int y=0;y<heigh;y++)  
  51.     {  
  52.         uchar* imgP=img.ptr<uchar>(y);  
  53.         uchar* dstP=dst.ptr<uchar>(y);  
  54.         for (int x=0;x<width;x++)  
  55.         {  
  56.             float b0=imgP[3*x];  
  57.             float g0=imgP[3*x+1];  
  58.             float r0=imgP[3*x+2];  
  59.   
  60.             float b = (b0-g0-r0)*3/2;  
  61.             float g = (g0-b0-r0)*3/2;  
  62.             float r = (r0-g0-b0)*3/2;  
  63.   
  64.             r = (r>255 ? 255 : (r<0? -r : r));  
  65.             g = (g>255 ? 255 : (g<0? -g : g));  
  66.             b = (b>255 ? 255 : (b<0? -b : b));  
  67. //          r = (r>255 ? 255 : (r<0? 0 : r));  
  68. //          g = (g>255 ? 255 : (g<0? 0 : g));  
  69. //          b = (b>255 ? 255 : (b<0? 0 : b));  
  70.             dstP[3*x] = (uchar)b;  
  71.             dstP[3*x+1] = (uchar)g;  
  72.             dstP[3*x+2] = (uchar)r;  
  73.         }  
  74.     }  
  75.     imwrite("D:/img/冰凍.jpg",dst);  
  76. }  
  77.   
  78. int main()  
  79. {  
  80.     Mat src = imread("D:/img/scene04.jpg",1);  
  81.     imshow("src",src);  
  82.     casting(src);  
  83.     freezing(src);  
  84.       
  85.     waitKey();  
  86.   
  87. }  


熔鑄:



冰凍:



相關文章