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

matlab图像处理基础知识0(双线性插值matlab实现--调整水平和垂直放大倍数)

2016-05-25 16:53 761 查看
需求说明:图像处理FPGA实现前期算法准备

当前算法:已通过matlab验证成功

function scaler_bilinear()

%-----------------------------0:配置输入输出--------------------------------

m=2; %放大或缩小的高度

n=2; %放大或缩小的宽度

I=imread('F:\book\Digital image processing and machine vision\640480\plane.jpg');

[height,width,l]=size(I); %输入分辨率 640*480

O=zeros(height*m,width*n,l); %输出分辨率 1920*1080

%-----------------------------1:开始输出计算--------------------------------

rot=[m,0,0;0,n,0;0,0,1]; %变换矩阵

for i=1:height*m

for j=1:width*n

pix=[i,j,1]/rot;

float_Y=pix(1)-floor(pix(1)); %水平宽度小数部分 floor 向下取整

float_X=pix(2)-floor(pix(2)); %垂直高度小数部分 floor 向下取整

%-----------------------------2:边界处理--------------------------------

if pix(1)<1 %边界处理

pix(1)=1;

end

if pix(1)>height %边界处理

pix(2)=height;

end

if pix(2)<1 %边界处理

pix(2)=1;

end

if pix(2)>width %边界处理

pix(2)=width;

end

%-----------------------------3:原坐标四个相邻点----------------------------

%四个相邻的点

pix_up_left = [floor(pix(1)) , floor(pix(2))];

pix_up_right = [floor(pix(1)) , ceil(pix(2))]; %floor 向下取整 ceil 向上取整

pix_down_left = [ceil(pix(1)) , floor(pix(2))];

pix_down_right= [ceil(pix(1)) , ceil(pix(2))];

%-----------------------------4:权重计算-----------------------------------

%计算临近四个点的权重

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;

%按权重进行双线性插值

% O(i,j,:) = value_up_left * I(pix_up_left(1) ,pix_up_left(2),:) +...

% value_up_right * I(pix_up_right(1) ,pix_up_right(2),:) +...

% value_down_left * I(pix_down_left(1) ,pix_down_left(2),:) +...

% value_down_right* I(pix_down_right(1),pix_down_right(2),:);

%-----------------------------5:计算输出图像数值----------------------------

O(i,j,1) = value_up_left * I(pix_up_left(1), pix_up_left(2) ,1) +...

value_up_right * I(pix_up_right(1), pix_up_right(2) ,1) +...

value_down_left * I(pix_down_left(1), pix_down_left(2) ,1) +...

value_down_right* I(pix_down_right(1),pix_down_right(2),1);

O(i,j,2) = value_up_left * I(pix_up_left(1), pix_up_left(2) ,2) +...

value_up_right * I(pix_up_right(1), pix_up_right(2) ,2) +...

value_down_left * I(pix_down_left(1), pix_down_left(2) ,2) +...

value_down_right* I(pix_down_right(1),pix_down_right(2),2);

O(i,j,3) = value_up_left * I(pix_up_left(1), pix_up_left(2) ,3) +...

value_up_right * I(pix_up_right(1), pix_up_right(2) ,3) +...

value_down_left * I(pix_down_left(1), pix_down_left(2) ,3) +...

value_down_right* I(pix_down_right(1),pix_down_right(2),3);

end

end

% figure,imshow(uOt8(O))

%-----------------------------6:输出显示------------------------------------

figure,imshow(I); title('输入图像640*480');

figure,imshow(uint8(O));title('输出图像1920*1080');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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