PS 滤镜算法原理 ——马赛克

% method : 利用邻域的任意一点代替当前邻域所有像素点

%%%% mosaic

clc;
clear all;
addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorithm');
Image=imread('4.jpg');
Image=double(Image);
size_info=size(Image);  
height=size_info(1);  
width=size_info(2);  

N=11;   % 控制邻域大小
Image_out=Image;  
for i=1+N:N:height-N  
    for j=1+N:N:width-N
       k1=rand()-0.5;
       k2=rand()-0.5;
       m=(k1*(N*2-1));  
       n=(k2*(N*2-1));
       h=floor(mod(i+m,height));  
       w=floor(mod(j+n,width));  
       if w==0;  
           w=width;  
       end  
       if h==0  
            h=height;  
       end     
      Image_out(i-N:i+N,j-N:j+N,1)=Image(h,w,1);
      Image_out(i-N:i+N,j-N:j+N,2)=Image(h,w,2);
      Image_out(i-N:i+N,j-N:j+N,3)=Image(h,w,3);
    end  
end  

imshow(Image_out/255);


原图



效果图



具体的算法可以参考:

PS 滤镜 马赛克

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // define head function  
  2. #ifndef PS_ALGORITHM_H_INCLUDED  
  3. #define PS_ALGORITHM_H_INCLUDED  
  4.   
  5. #include <iostream>  
  6. #include <string>  
  7. #include "cv.h"  
  8. #include "highgui.h"  
  9. #include "cxmat.hpp"  
  10. #include "cxcore.hpp"  
  11.   
  12. using namespace std;  
  13. using namespace cv;  
  14.   
  15.   
  16. void Show_Image(Mat&, const string &);  
  17.   
  18.   
  19. #endif // PS_ALGORITHM_H_INCLUDED  
  20.   
  21. /*  
  22. This program will generate  
  23.  "Mosaic" effect.  
  24.   
  25. */  
  26.   
  27. #include "PS_Algorithm.h"  
  28. #include <time.h>  
  29.   
  30. using namespace std;  
  31. using namespace cv;  
  32.   
  33. int main(void)  
  34. {  
  35.     string Img_name("4.jpg");  
  36.     Mat Image_in;  
  37.     Image_in=imread(Img_name);  
  38.     // Show_Image(Image_in, Img_name);  
  39.   
  40.     Mat Image_out(Image_in.size(), CV_32FC3);  
  41.     Image_in.convertTo(Image_out, CV_32FC3);  
  42.   
  43.     int P_size=9;  
  44.     float k1, k2;  
  45.   
  46.     int n_row;  
  47.     int n_col;  
  48.   
  49.     float m, n;  
  50.   
  51.     int h,w;  
  52.   
  53.     n_row=Image_in.rows;  
  54.     n_col=Image_in.cols;  
  55.   
  56.     Mat sub_mat;  
  57.   
  58.     srand( (unsigned)time(NULL) );  
  59.   
  60.     for (int i=P_size; i<Image_in.rows-P_size-1i=i+P_size)  
  61.     {  
  62.         for (int j=P_size; j<Image_in.cols-1-P_sizej=j+P_size)  
  63.         {  
  64.             k1=(double)((rand() % 100))/100.0-0.5;  
  65.             k2=(double)((rand() % 100))/100.0-0.5;  
  66.   
  67.             m=(k1*(P_size*2-1));  
  68.             n=(k2*(P_size*2-1));  
  69.   
  70.             h=(int)(i+m)% n_row;  
  71.             w=(int)(j+n)% n_col;  
  72.   
  73.             sub_mat=Image_out.operator()(Range(i-P_size,i+P_size), Range(j-P_size,j+P_size));  
  74.   
  75.             sub_mat.setTo(Scalar(Image_in.at<Vec3b>(h,w)));  
  76.   
  77.         }  
  78.     }  
  79.   
  80.     Image_out=Image_out/255.0;  
  81.   
  82.     Show_Image(Image_out, "out");  
  83.   
  84.     imwrite("out.jpg", Image_out*255);  
  85.   
  86.     waitKey();  
  87.     cout<<"All is well."<<endl;  
  88.   
  89. }  
  90.   
  91.   
  92. // define the show image  
  93. #include "PS_Algorithm.h"  
  94. #include <iostream>  
  95. #include <string>  
  96.   
  97. using namespace std;  
  98. using namespace cv;  
  99.   
  100. void Show_Image(Mat& Image, const string& str)  
  101. {  
  102.     namedWindow(str.c_str(),CV_WINDOW_AUTOSIZE);  
  103.     imshow(str.c_str(), Image);  
  104.   
  105. }  


原图 



效果图


0


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值