zoukankan      html  css  js  c++  java
  • matlab练习程序(径向模糊1)

    注:新方法移步这里  

      之所以要加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   
    end
    
    imgn=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结果

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

  • 相关阅读:
    这次安装不太一样
    解惑C#不用释放内存(4)C#为何不用释放内存
    解惑C#不用释放内存(3)C++如何分配内存
    解惑C#不用释放内存(2)分配内存
    解惑C#不用释放内存(1)章节重点
    学习Java异常理解运行期异常
    学习Java声明异常throws
    学习java异常理解编译期异常
    学习java异常-前不久出现的问题
    学习java异常
  • 原文地址:https://www.cnblogs.com/tiandsp/p/2789881.html
Copyright © 2011-2022 走看看