降采样和上采样(图像)

https://blog.csdn.net/u013146742/article/details/51865522

降采样

又名 下采样或缩小图像。即是采样点数减少。对于一幅N*M的图像来说,如果降采样系数为k,则即是在原图中 每行每列每隔k个点取一个点组成一幅图像。降采样很容易实现. 

他的目的有两个(1)使得图像符合显示区域的大小。

                          (2)生成对应图像的缩略图

上采样

又名图像插值或放大图像 主要目的是放大原图像,从而可以显示在更高分辨率的显示设备上。升采样,也即插值。对于图像来说即是二维插值。如果升采样系数为k,即在原图n与n+1两点之间插入k-1个点,使其构成k分。二维插值即在每行插完之后对于每列也进行插值。 
插 值的方法分为很多种,一般主要从时域和频域两个角度考虑。对于时域插值,最为简单的是线性插值。除此之外,Hermite插值,样条插值等等均可以从有关 数值分析书中找到公式,直接代入运算即可。对于频域,根据傅里叶变换性质可知,在频域补零等价于时域插值。所以,可以通过在频域补零的多少实现插值运 算

对图像的缩放操作并不能带来更多关于该图像的信息,因此图像的质量将不可避免地收到影响。然而确实有一些缩放方法能够增加图像的信息,从而使得缩放后的图像质量超过原图质量。

2、实现 
其实在matlab中自带升采样函数(upsample)降采样函数(downsample),读者可以查找matlab的帮助文件详细了解这两个函数。在这里,我重新写如下: 
%======================================================== 
%   Name: usample.m 
%   功能:升采样 
%   输入:采样图片 I, 升采样系数N 
%   输出:采样后的图片Idown 
%   author:gengjiwen    date:2015/5/10 
%======================================================== 
function Iup = usample(I,N) 
[row,col] = size(I); 
upcol = col*N; 
upcolnum = upcol - col; 
uprow = row*N; 
uprownum = uprow -row; 

If = fft(fft(I).').';     %fft2变换 
Ifrow = [If(:,1:col/2) zeros(row,upcolnum) If(:,col/2 +1:col)];   %水平方向中间插零 
                                                                                                   %补零之后,Ifrow为 row*upcol                                                                
Ifcol = [Ifrow(1:row/2,:);zeros(uprownum,upcol);Ifrow(row/2 +1:row,:)];   %垂直方向补零 
Iup = ifft2(Ifcol); 
end 
%======================================================== 
%   Name: dsample.m 
%   功能:降采样 
%   输入:采样图片 I, 降采样系数N 
%   输出:采样后的图片Idown 
%   author:gengjiwen    date:2015/5/10 
%======================================================== 
function Idown = dsample(I,N) 
[row,col] = size(I); 
drow = round(row/N); 
dcol = round(col/N); 
Idown = zeros(drow,dcol); 
p =1; 
q =1; 
for i = 1:N:row 
    for j = 1:N:col 
         Idown(p,q) = I(i,j); 
         q = q+1; 
    end 
    q =1; 
    p = p+1; 
end 
end 
% =========================================== 
% 测试升采样和降采样的程序 
%  author:gengjiwen , date:2015/05/10 
%  备注:测试完毕! 
%============================================ 
clear; 
close all; 
I = imread('test1.jpg'); 
I = rgb2gray(I); 
figure(1); 
imagesc(I); 
title('原图像'); 
% 图像降采样 
 figure; 
for ii = 2:2:8 
 Idown = dsample(I,ii); 
 subplot(2,2,ii/2); 
 imagesc(Idown); 
 str = ['downsample at N = ' num2str(ii)]; 
 title(str); 
end 
% 图像升采样 
 figure; 
for ii = 2:2:8 
 Iup =usample(I,ii); 
 subplot(2,2,ii/2); 
 imagesc(abs(Iup)); 
 str = ['upsample at N = ' num2str(ii)]; 
 title(str); 
end