- clear all;
- close all;
- clc;
-
- cenH=128; %波纹中心
- cenW=128;
- R=80; %扩散半径
- amplitude =3; %幅度
- wavelength=30; %波长
- phase =20; %相位
-
- img = double(imread('lena.jpg'));
- imshow(img,[])
- [H, W] = size(img);
-
- imgn=zeros(H,W);
- ii=1;
- jj=1;
- for i=1:H
- for j=1:W
- dy = i-cenH;
- dx = j-cenW;
- dis=dx*dx+dy*dy;
- if dis>R*R || dis==0
- pix=[i j];
- else
- dis=sqrt(dis);
- amount= amplitude * sin(dis/wavelength * 2*pi - phase);
- amount = amount*(R-dis)*wavelength/(R*dis);
- ii=(i+dy*amount);
- jj=(j+dx*amount);
-
- if ii<=1
- ii=1;
- end
- if jj<=1
- jj=1;
- end
- if ii>=H
- ii=H ;
- end
- if jj>=W
- jj=W;
- end
- pix=[ii jj];
- end
-
- float_Y=pix(1)-floor(pix(1));
- float_X=pix(2)-floor(pix(2));
-
- pix_up_left=[floor(pix(1)) floor(pix(2))]; %四个相邻的点
- pix_up_right=[floor(pix(1)) ceil(pix(2))];
- pix_down_left=[ceil(pix(1)) floor(pix(2))];
- pix_down_right=[ceil(pix(1)) ceil(pix(2))];
-
- value_up_left=(1-float_X)*(1-float_Y); %计算临近四个点的权重
- value_up_right=float_X*(1-float_Y);
- value_down_left=(1-float_X)*float_Y;
- value_down_right=float_X*float_Y;
-
- imgn(i,j)=value_up_left*img(pix_up_left(1),pix_up_left(2))+ ...
- value_up_right*img(pix_up_right(1),pix_up_right(2))+ ...
- value_down_left*img(pix_down_left(1),pix_down_left(2))+ ...
- value_down_right*img(pix_down_right(1),pix_down_right(2));
- end
- end
-
- figure;
- imshow(imgn,[])
- imwrite(mat2gray(imgn),'imgn.jpg')
关注公众号: MATLAB基于模型的设计 (ID:xaxymaker) ,每天推送MATLAB学习最常见的问题,每天进步一点点,业精于勤荒于嬉。

打开微信扫一扫哦!