⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linear.m

📁 双线性插值与最近领域插值的matlab源程序
💻 M
字号:
% 双线性插值与最近邻域插值的图像放大
% Copyright by luoyuanhong: 2009-3-27

% 读图
[filename, pathname, filterindex] = uigetfile('*.bmp;*.jpg','打开图像!');
RGB = imread(filename);
R = RGB(:,:,1);
G = RGB(:,:,2);
B = RGB(:,:,3);
[nrows,ncols,ncoms]=size(RGB);

% 放大的尺度,从1到9
K = str2double(inputdlg('please input scale factor (must between 1.0 - 8.0)', 'INPUT scale factor', 1, {'2.0'}));

if (K < 1.0) | (K > 9.0)
    errordlg('scale factor beyond permitted range(1.0 - 8.0)', 'ERROR');
    error('please input scale factor (must between 1.0 - 8.0)');
end

% 原图
figure,imshow(RGB),title('原图');

% 输出图像的尺寸
width = K * ncols;
height = K * nrows;
RR = uint8(zeros(height,width));
GG = uint8(zeros(height,width));
BB = uint8(zeros(height,width));
OUT = uint8(zeros(height,width,ncoms));
RR2 = uint8(zeros(height,width));
GG2 = uint8(zeros(height,width));
BB2 = uint8(zeros(height,width));
OUT2 = uint8(zeros(height,width,ncoms));

widthScale = 1/K;
heightScale = 1/K;

% 双线性插值
for x = K:width-K                                   
   for y = K:height-K
       xx = x * widthScale;                         
       yy = y * heightScale;
       if (xx <= 1.0e-8)
          xx = 1;
       end
       if (xx > ncols - 1)
          xx = ncols - 1;
       end
       if (yy <= 1.0e-8)
          yy = 1;
       end
       if (yy > nrows - 1)
          yy = nrows - 1;
       end
       
       if (xx/double(uint16(xx)) == 1.0) && (yy/double(uint16(yy)) == 1.0)      % 放大后的象素坐标为整数
           RR(y,x) = R(int16(yy),int16(xx));
           GG(y,x) = G(int16(yy),int16(xx));
           BB(y,x) = B(int16(yy),int16(xx));
       else                                                                     % 放大后的象素坐标不为整数
           a = double(fix(yy));                     
           b = double(fix(xx));
           
           r11 = double(R(a,b));
           r12 = double(R(a,b+1));
           r21 = double(R(a+1,b));
           r22 = double(R(a+1,b+1));
           RR(y,x) = uint8( (b+1-xx) * ((yy-a)*r21 + (a+1-yy)*r11) + (xx-b) * ((yy-a)*r22 +(a+1-yy) * r12) );
           
           g11 = double(G(a,b));
           g12 = double(G(a,b+1));
           g21 = double(G(a+1,b));
           g22 = double(G(a+1,b+1));
           GG(y,x) = uint8( (b+1-xx) * ((yy-a)*g21 + (a+1-yy)*g11) + (xx-b) * ((yy-a)*g22 +(a+1-yy) * g12) );
           
           b11 = double(B(a,b));
           b12 = double(B(a,b+1));
           b21 = double(B(a+1,b));
           b22 = double(B(a+1,b+1));
           BB(y,x) = uint8( (b+1-xx) * ((yy-a)*b21 + (a+1-yy)*b11) + (xx-b) * ((yy-a)*b22 +(a+1-yy) * b12) );
       end
    end
end

% 最近邻域插值
for x = K:width-K
    for y = K:height-K
       xx = x * widthScale;                           
       yy = y * heightScale;
       if (xx <= 1.0e-8)
          xx = 1;
       end
       if (xx > ncols - 1)
          xx = ncols - 1;
       end
       if (yy <= 1.0e-8)
          yy = 1;
       end
       if (yy > nrows - 1)
          yy = nrows - 1;
       end   
       
       if (xx/double(uint16(xx)) == 1.0) && (yy/double(uint16(yy)) == 1.0)      % 放大后的象素坐标为整数
           RR2(y,x) = R(int16(yy),int16(xx));
           GG2(y,x) = G(int16(yy),int16(xx));
           BB2(y,x) = B(int16(yy),int16(xx));
       else                                                                     % 放大后的象素坐标不为整数
           a = double(fix(yy));                     
           b = double(fix(xx));
           xl = x-a;
           yl = y-b;
           
           r11 = double(R(a,b));
           r12 = double(R(a,b+1));
           r21 = double(R(a+1,b));
           r22 = double(R(a+1,b+1));
           
           g11 = double(G(a,b));
           g12 = double(G(a,b+1));
           g21 = double(G(a+1,b));
           g22 = double(G(a+1,b+1));
           
           b11 = double(B(a,b));
           b12 = double(B(a,b+1));
           b21 = double(B(a+1,b));
           b22 = double(B(a+1,b+1));
           
           if(xl<=0.5 && yl<=0.5)
                RR2(y,x) = uint8(r11);
                GG2(y,x) = uint8(g11);
                BB2(y,x) = uint8(b11);
           elseif(xl>0.5 && yl<=0.5)
                RR2(y,x) = uint8(r21);
                GG2(y,x) = uint8(g21);
                BB2(y,x) = uint8(b21);
           elseif(xl<=0.5 && yl>0.5)
                RR2(y,x) = uint8(r12);
                GG2(y,x) = uint8(g12);
                BB2(y,x) = uint8(b12);
           else
                RR2(y,x) = uint8(r22); 
                GG2(y,x) = uint8(g22);  
                BB2(y,x) = uint8(b22);  
           end        
       end
    end
end

OUT(:,:,1) = RR;
OUT(:,:,2) = GG;
OUT(:,:,3) = BB;

OUT2(:,:,1) = RR2;
OUT2(:,:,2) = GG2;
OUT2(:,:,3) = BB2;

imwrite(OUT, 'linear.bmp', 'bmp');
imwrite(OUT2,'near.bmp','bmp');
figure,imshow(OUT),title('放大后的双线性插值图像');
figure,imshow(OUT2),title('放大后的最近邻域插值图像');

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -