天天看點

圖像降采樣和升采樣

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函數的旁瓣比較大,故在升采樣後的圖像中會存在振鈴現象。讀者可以觀察上面的實作結果圖檔。如果想減小這種情況,則可

以對其進行頻域加窗。

上一篇: 采樣錯誤

繼續閱讀