注:
之所以要加1是因为这个还没有做完,这个只是按照自己的想法实现的,结果。。。果然是不行啊。
photoshop中的径向模糊算法我也不清楚,不过下面的对话框大致可以让人猜到一些:
看那个小方框就可以了,我感觉是photoshop只在黑色像素对应的地方进行模糊,其他的地方则不处理。我暂时只实现缩放的效果,如何改变品质也还不清楚。
我的算法是对每一个像素分别计算他的卷积模板,卷积模板就靠卷积半径r和当前像素与图像中心像素的斜率确定。
下面是代码:
main.m
clear all;close all;clc;r=30;img=imread('lena.jpg');[m n]=size(img);imshow(img)imgn=zeros(m+2*r+1,n+2*r+1);imgn(r+1:m+r,r+1:n+r)=img;imgn(1:r,r+1:n+r)=img(1:r,1:n); %扩展上边界imgn(1:m+r,n+r+1:n+2*r+1)=imgn(1:m+r,n:n+r); %扩展右边界imgn(m+r+1:m+2*r+1,r+1:n+2*r+1)=imgn(m:m+r,r+1:n+2*r+1); %扩展下边界imgn(1:m+2*r+1,1:r)=imgn(1:m+2*r+1,r+1:2*r); %扩展左边界cen_y=floor(m/2+r);cen_x=floor(n/2+r);for i=r+1:m+r for j=r+1:n+r w=create_mk(i,j,cen_y,cen_x,r); %制造卷积模板 [H W]=size(w); HH=floor(H/2); WW=floor(W/2); s=imgn(i-HH:i+HH,j-WW:j+WW).*w; imgn(i,j)=sum(sum(s))/sum(sum(w)); end endimgn=imgn(r+1:m+r,r+1:n+r);figure;imshow(mat2gray(imgn));
create_mk.m
function w=create_mk(i,j,cen_y,cen_x,r) if j ~=cen_x k=(i-cen_y)/(j-cen_x); theta=atan(k); jiaodu=theta*180/pi; %不用弧度是知道tan(pi/2)是多少 else jiaodu=90; end jiaodu=mod(jiaodu,360); flag=0; %%下面是确定卷积模板的宽和高。 if jiaodu>=0 && jiaodu<90 % jiaodu=jiaodu; flag=1; end if jiaodu>=90 && jiaodu<180 jiaodu=180-jiaodu; flag=2; end if jiaodu>=180 && jiaodu<270 jiaodu=jiaodu-180; flag=3; end if jiaodu>=270 && jiaodu<360 jiaodu=360-jiaodu; flag=4; end H=floor(r*sin(jiaodu*pi/180)); W=floor(r*cos(jiaodu*pi/180)); if mod(H,2)==0 H=H+1; end if mod(W,2)==0 W=W+1; end w=zeros(H,W); %%为卷积模板赋值 pre_tmp_y=1; pre_tmp_x=1; if W~=1 && H~=1 for i=1:H for j=1:W tmp_y=floor(j*tan(jiaodu*pi/180)); if tmp_y==i w(pre_tmp_y:tmp_y,j)=r; w(pre_tmp_y,pre_tmp_x:j)=r; pre_tmp_y=tmp_y; pre_tmp_x=j; end end end w(H,W)=r; end if W==1 for i=1:H w(i,1)=r; end end if H==1 for j=1:W w(1,j)=r; end end w=w/sum(sum(w)); if flag==2 || flag==4 %如果角度在2,4象限,卷积矩阵上下翻转 w=flipud(w); end end
效果:
原图
这里的效果,半径为30
photoshop数量取61结果
看到这两张图,我突然明白了屌丝与白富美、国产山寨机与国外智能机的区别。总之,效果差距还是很大的,其实速度差距也很大,算法还要优化。暂时记录到这里。