• matlab练习程序(图像放大/缩小,双立方插值)


      我主要参考了这里,不过他推导的系数我感觉有问题,用他的公式直接套用放大的图像会有网格,也许是我理解的有偏差。

      所以我自己重新推导了这四个系数

      

      用这个就没问题了。他的那些代码还是很有参考价值的。

      程序代码:

    main.m

    clear all;
    close all;
    clc;
    w=2;            %放大或缩小的宽度
    h=2;            %放大或缩小的高度
    img=imread('lena.jpg');
    %imshow(img);
    [m n]=size(img);
    imgn=zeros(h*m,w*n);
    
    rot=[h 0 0;0 w 0;0 0 1];                                    %变换矩阵x=h*u,y=w*v
    
    for i=1:h*m
        for j=1:w*n
            pix=[i j 1]/rot;   
            float_Y=pix(1)-floor(pix(1)); 
            float_X=pix(2)-floor(pix(2));
    
            if pix(1) < 2               %边界处理,也可以用卷积时常用的边界扩展防止越界
                pix(1) = 2;
            end
    
            if pix(1) > m-2
                pix(1) = m-2;
            end
    
            if pix(2) < 2
                pix(2) =2;
            end
    
            if pix(2) > n-2
                pix(2) =n-2;
            end
    
            pix_up=floor(pix(1));
            pix_left=floor(pix(2));
            
            p=img(pix_up-1:pix_up+2,pix_left-1:pix_left+2);
    
            imgn(i,j)=bicubicInterpolate(p,float_X+1,float_Y+1);       
    
        end
    end
    
    figure,imshow(uint8(imgn))

    bicubicInterpolate.m

    function re=bicubicInterpolate(p,x,y)    %先行插值,再列插值
        arr=zeros(4,1);
        for i=1:4
            arr(i)=cubicInterpolate(p(i,1:4),x);
        end
        re= cubicInterpolate(arr,y);
    end

    cubicInterpolate.m

    function re=cubicInterpolate(p,x)
        p=double(p);
    %     re=p(2) + 0.5 * x*(p(3) - p(1) + x*(2.0*p(1) - 5.0*p(2) + 4.0*p(3) - p(4) + x*(3.0*(p(2) - p(3)) + p(4) - p(1))));
    
        a=(p(4)-3*p(1)+3*p(2)-p(1))/10;
        b=(p(3)-2*p(2)+p(1))/2-2*a;
        c=p(2)-p(1)-a-b;
        d=p(1);
        re=a*x^3+b*x^2+c*x+d;
    
    end

    效果图:

    原图

    双立方插值效果

    双线性插值效果

    区别不大,不过认真看双立方还是效果好些。

      

  • 相关阅读:
    php 扩展编译linux
    PHP 单态设计模式
    Apache 支持.htaccess
    Apache 禁止访问目录
    jQuery 获取父元素、子元素、同级元素
    CentOS 配置防火墙操作实例(启、停、开、闭端口):
    CentOS 安装 lamp(转)
    火狐浏览器 js 1到9月份 new DATE不返回时间
    web 打开子窗口提交数据或其他操作后 关闭子窗口且刷新父窗口实现
    jquery on 绑定多个事件 多个元素
  • 原文地址:https://www.cnblogs.com/tiandsp/p/2807848.html
Copyright © 2020-2023  润新知