1、先說說這兩個詞的概念:
降采樣,即是采樣點數減少。對于一幅N*M的圖像來說,如果降采樣系數為k,則即是在原圖中 每行每列每隔k個點取一個點組成一幅圖像。降采樣很容易實作.
升采樣,也即插值。對于圖像來說即是二維插值。如果升采樣系數為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
function Idown = dsample(I,N)
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;
% ===========================================
% 測試升采樣和降采樣的程式
% 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);
% 圖像升采樣
Iup =usample(I,ii);
imagesc(abs(Iup));
str = ['upsample at N = ' num2str(ii)];
測試結果如下:

3、結果分析
降采樣沒什麼可說的,其實在matlab中可以很友善的用冒号運算符實作,具體可以檢視下matlab自帶函數downsample的實作。
對于升采樣,這裡用了頻域方法實作。将原圖像進行二維傅裡葉變換,之後在變換後的中間補零插值,再反變換回時域。根據傅裡葉變換性質可知,此時的時域插值核
sinc函數的形式,對于二維,應是
二維sinc()函數。由于sinc函數的旁瓣比較大,故在升采樣後的圖像中會存在振鈴現象。讀者可以觀察上面的實作結果圖檔。如果想減小這種情況,則可
以對其進行頻域加窗。