您的位置:首页 > 编程语言 > MATLAB

matlab练习程序(图像放大/缩小,双线性插值)

2012-12-03 19:40 225 查看
  半年前写过matlab最邻近插值的图像缩放,没怎么考虑边界问题。更早之前用Opencv写过双线性插值图像放大,不过写的比较混乱。所以这里用matlab重新再清楚的写一遍。

close all;
clear all;
clc;

m=1.8;              %放大或缩小的高度
n=2.3;              %放大或缩小的宽度
img=imread('lena.jpg');
imshow(img);
[h w]=size(img);
imgn=zeros(h*m,w*n);
rot=[m 0 0;0 n 0;0 0 1];                                   %变换矩阵

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) < 1        %边界处理
pix(1) = 1;
end

if pix(1) > h
pix(1) = h;
end

if pix(2) < 1
pix(2) =1;
end

if pix(2) > w
pix(2) =w;
end

pix_up_left=[floor(pix(1)) floor(pix(2))];    %四个相邻的点
pix_up_right=[floor(pix(1)) ceil(pix(2))];
pix_down_left=[ceil(pix(1)) floor(pix(2))];
pix_down_right=[ceil(pix(1)) ceil(pix(2))];

value_up_left=(1-float_X)*(1-float_Y);      %计算临近四个点的权重
value_up_right=float_X*(1-float_Y);
value_down_left=(1-float_X)*float_Y;
value_down_right=float_X*float_Y;
                                    %按权重进行双线性插值
imgn(i,j)=value_up_left*img(pix_up_left(1),pix_up_left(2))+ ...
value_up_right*img(pix_up_right(1),pix_up_right(2))+ ...
value_down_left*img(pix_down_left(1),pix_down_left(2))+ ...
value_down_right*img(pix_down_right(1),pix_down_right(2));
end
end

figure,imshow(uint8(imgn))



原图


放大后的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: