matlab练习程序(径向模糊1)

注:新方法移步这里  html

  之因此要加1是由于这个尚未作完,这个只是按照本身的想法实现的,结果。。。果真是不行啊。算法

  photoshop中的径向模糊算法我也不清楚,不过下面的对话框大体能够让人猜到一些:post

  看那个小方框就能够了,我感受是photoshop只在黑色像素对应的地方进行模糊,其余的地方则不处理。我暂时只实现缩放的效果,如何改变品质也还不清楚。优化

  个人算法是对每个像素分别计算他的卷积模板,卷积模板就靠卷积半径r和当前像素与图像中心像素的斜率肯定。spa

  下面是代码:3d

main.mcode

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   
end

imgn=imgn(r+1:m+r,r+1:n+r);
figure;
imshow(mat2gray(imgn));

create_mk.mhtm

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

效果:blog

原图ip

这里的效果,半径为30

photoshop数量取61结果

  看到这两张图,我忽然明白了屌丝与白富美、国产山寨机与国外智能机的区别。总之,效果差距仍是很大的,其实速度差距也很大,算法还要优化。暂时记录到这里。

转载于:https://www.cnblogs.com/tiandsp/archive/2012/11/26/2789881.html