zoukankan      html  css  js  c++  java
  • Matlab实现imresize函数功能

    图像放缩

    算法分析

    1. 根据放缩倍数,开辟一个新矩阵存放放缩后的图像
    2. 利用双线性插值公式, 计算新图像中的每个点映射回原图像中的灰度值(注意边界处理)

    双线性插值代码

    function outputimg = my_imresize(A,n)
    %  A 是图像矩阵,n是放缩的倍数
    % 返回值outputimg是一个放缩后的图像矩阵
    
    if n <= 0
        error('缩放倍数n的值应该大于0!');
    end
    
    %四舍五入计算放大后图像矩阵
    [H,W,CH] = size(A);
    DH = round(H * n);
    DW = round(W * n);
    outputimg = zeros(DH,DW,CH);
    
    %利用双线性插值公式,从新矩阵映射回原图像
    for di = 1:DH
        for dj = 1:DW
            ii = di / n;jj = dj / n;
            i = floor(ii);j = floor(jj);
            u = ii - i;v = jj - j;
            i = i + 1;j = j + 1;
            %边界处理
            if (i < 1)
                i = 1;
            end
            if (j < 1)
                j = 1;
            end
            if((i + 1) > H)
                i = H - 1;
            end
            if((j + 1) > W);
                j = W -1;
            end
            %线性插值公式
            outputimg(di,dj,:) = (1 - u) * (1 - v) * A(i,j,:) + (1 - u) * v * A(i,j + 1,:) 
            + u * (1 - v) * A(i + 1,j,:) + u * v * A(i + 1,j + 1,:);
        end
    end
    
     %转化成uint8才能正常显示
    outputimg = uint8(outputimg); 
    

    实验结果

    灰度图放大2倍

    %调用示例:
    A = imread('cameraman.tif');
    B = my_imresize(A,2);
    figure,imshow(A),title('原图');
    figure,imshow(B),title('放大两倍后的图像');
    


    彩色图缩小1/2

     % 调用示例:
     A = imread('pears.png');
     B = my_imresize(A,0.5);
     figure,imshow(A),title('原图');
     figure,imshow(B),title('缩小1/2后的图像');
    

    实验分析

    • 计算新的图像在原图上对应的位置,而不是原图对应到新图的位置

    • 为这些位置赋相应的灰度值,考虑求得的位置是整数或者不是整数。原图像中只有整数点坐标的像素值,但是放缩后的图像的坐标包含小数,像(66.7,66.7)这个位置在原图像中是不存在的,这时候可以采用插值来给这个位置赋值,所以实际是将放大后的图像矩阵,压缩到原图中找到值

    • 对边界越界的处理,当超过边界的坐标都变成边界坐标

    • 输出要记得将数据类型改为uint8

    • 彩色图像可以看成三张单通道的灰度图的组合,每一个通道都和灰度图像的放缩同样处理,在Matlab中可以直接用以下形式:A(i,j,:) 处理

  • 相关阅读:
    串字符串下沙的沙粒
    格式返回jquery js 获取获得时间差,时间格式为
    类型数组perl6学习
    安装文件win7,ubuntu双系统的安装——准备工作
    下标注意【算法】冒泡排序与选择排序的递归实现
    容器结构Thrift的数据类型系统
    linux初次入门学习小结
    sata拷贝文件时候framebuffer 闪烁问题
    switch_root 到nfs根文件
    Linux内核中64 bit division
  • 原文地址:https://www.cnblogs.com/Vicky1361/p/13921926.html
Copyright © 2011-2022 走看看