图像缩放

原创 2013年12月04日 22:15:16
实验要求:实现一个图像缩放函数,可以对输入图像进行任意倍数的缩放;
                  1.采用双线性插值进行重采样;
                  2.X,Y方向的缩放倍数参函数参数的形式传入;
                  3.可以只考虑输入图像为3通道,8位深度的情况;
                  4.不能调用图像处理库的缩放函数来完成;


RGB = imread('H:/数字图像处理/ipe_data/009.jpg');
R = RGB(:,:,1);
G = RGB(:,:,2);
B = RGB(:,:,3);
[nrows,ncols,ncoms]=size(RGB);
% Next line is the scale-factor,the range is 1.0-9.0
K1 = str2double(inputdlg('请输入行缩放倍数', 'INPUT scale factor', 1, {'0.5'}));%行默认变为原来的0.5倍  
K2 = str2double(inputdlg('请输入列缩放倍数', 'INPUT scale factor', 1, {'0.4'}));%列默认变为原来的0.4倍 
width = K1 * ncols;                   
height = K2 * nrows;  
OUT = uint8(zeros(height,width,ncoms));
RR = uint8(zeros(height,width));
GG = uint8(zeros(height,width));
BB = uint8(zeros(height,width));
% width scalor and height scalor
widthScale = ncols/width;
heightScale = nrows/height;
% bilinear interpolate
for y = 1:height
   for x =1:width % this index range is to avoid exceeding the permitted matrix index
       xx = x * widthScale; % xx and yy are the source ordinate,while x and y are the destinate ordinate
       yy = y * heightScale;
       if (xx <= 1)
          xx = 1;
       end
       if (xx > ncols-1)
          xx = ncols-1;
       end
       if (yy <= 1)
          yy = 1;
       end
       if (yy > nrows-1)
          yy = nrows-1;
       end
       
       if (xx/double(uint16(xx)) == 1.0) && (yy/double(uint16(yy)) == 1.0) % if a and b is integer,then J(x,y) <- I(x,y)
           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 or b is not integer
           a = double(uint16(yy)); % (a,b) is the base-dot
           b = double(uint16(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
OUT(:,:,1) = RR;
OUT(:,:,2) = GG;
OUT(:,:,3) = BB;
imshow(RGB),title('原图');
figure;
imshow(OUT),title('修改图');


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

插值实现图像缩放

  • 2017年04月09日 17:40
  • 1KB
  • 下载

图像缩放算法

  • 2013年09月07日 14:33
  • 16.29MB
  • 下载

图像缩放——双线性插值算法

在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。如果选择一个坐标系统使得  的四个已知点坐标分别为 (0, 0)、(0, 1)、(1, 0) 和...

实用的jquery插件--图像缩放插件

  • 2014年05月03日 12:18
  • 589KB
  • 下载

通过pyrUp和pyrDown实现图像缩放的简单程序

原文地址:http://blog.csdn.net/yuzeze/article/details/51434202 #include "stdafx.h" #include #includ...
  • roslei
  • roslei
  • 2016年08月10日 11:28
  • 360

简单的图像缩放

  • 2008年08月02日 10:56
  • 28KB
  • 下载

图像缩放

#include #include #include int main(int argc, char* argv[]) { IplImage *src = 0; //源图像指针 ...

双线性插值进行图像缩放

  • 2017年08月14日 20:17
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图像缩放
举报原因:
原因补充:

(最多只允许输入30个字)