首页 > 技术文章 > Matlab实现imresize函数功能

Vicky1361 2020-11-03 19:04 原文

图像放缩

算法分析

  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,:) 处理

推荐阅读