【数字图像处理】模拟Matlab的imresize()写一个你自己的imresize()函数,至少应实现‘nearest’和‘bilinear’两种方法

  • Post author:
  • Post category:其他


作业要求:模拟Matlab的imresize()写一个你自己的imresize()函数,至少应实现‘nearest’和‘bilinear’两种方法。

首先理论方面主要参考了一下两个网址


https://blog.csdn.net/Bryan_QAQ/article/details/78774442


https://blog.csdn.net/ccblogger/article/details/72918354

这两个博客里面写的十分详细,也不用我多叙述了,下面简单贴一下Matlab的代码。(只能读入jpg和tif格式文件,不知道怎么实现Matlab那样什么都可以读入)。

写的很笨,非常不熟悉Matlab,有更好的方法请指出。

function [Img] = My_imresize(filename, rate, method)
%My_imresize为对Matlab中的imresize的简单模拟,实现了nearest和bilinear两种method
%   filename为文件路径,rate为图像缩放比例,method为插值方式,此处只实现最近邻插值和双线性插值法。
if strcmp('jpg',filename((length(filename)-2):(length(filename))))%检查为jpg或者tif
    Img_old = imread(filename);
else
    [X,map] = imread(filename);
    Img_old = ind2rgb(X,map);
end
% imshow(Img_old);
Size_old = size(Img_old);
% display(Size_old);
Size_new = ceil(Size_old * rate);
% display(Size_new);

for i = 1:Size_new(1)
    for j = 1:Size_new(2)
        %I = i/rate;
        I = (i + 0.5) / rate - 0.5;%这种方法处理效果会好一些,会合理利用到更多的像素点
        %J = j/rate;
        J = (j + 0.5) / rate - 0.5;
        if I < 1    %边界处理
            I = 1;
        end
        if I > Size_old(1) 
            I = Size_old(1);
        end
        if J < 1 
            J = 1;
        end
        if J > Size_old(2)
            J = Size_old(2);
        end
        if strcmp(method,'nearest')
            I = round(I);
            J = round(J);
            Img(i,j,:) = Img_old(I,J,:);
        else 
            pix00 = [floor(I),floor(J)]; %00 01 10 11分别表示相邻的左上右上左下右下整数点
            pix01 = [floor(I),ceil(J)];
            pix10 = [ceil(I),floor(J)];
            pix11 = [ceil(I),ceil(J)];
            dif_x = I - floor(I);
            dif_y = J - floor(J);
            v_00 = (1 - dif_x) * (1 - dif_y);%计算权重
            v_01 = (1 - dif_x) * dif_y;
            v_10 = dif_x * (1 - dif_y);
            v_11 = dif_x * dif_y;
            Img(i,j,1) =v_00 * Img_old(pix00(1),pix00(2),1) + ...
                        v_01 * Img_old(pix01(1),pix01(2),1) + ...
                        v_10 * Img_old(pix10(1),pix10(2),1) + ...
                        v_11 * Img_old(pix11(1),pix11(2),1);
            Img(i,j,2) =v_00 * Img_old(pix00(1),pix00(2),2) + ...
                        v_01 * Img_old(pix01(1),pix01(2),2) + ...
                        v_10 * Img_old(pix10(1),pix10(2),2) + ...
                        v_11 * Img_old(pix11(1),pix11(2),2);    
            Img(i,j,3) =v_00 * Img_old(pix00(1),pix00(2),3) + ...
                        v_01 * Img_old(pix01(1),pix01(2),3) + ...
                        v_10 * Img_old(pix10(1),pix10(2),3) + ...
                        v_11 * Img_old(pix11(1),pix11(2),3);            
        end
    end
end
imshow(Img);
end



版权声明:本文为yslcl12345原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。