需求说明:图像处理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');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
设计来自:时间的诗