作业要求:模拟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 版权协议,转载请附上原文出处链接和本声明。