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

需求说明:图像处理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');


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


设计来自:时间的诗


你可能感兴趣的:(算法,matlab,图像处理)