圖像降采樣和升采樣


轉自:http://www.lofter.com/postentry?from=search&permalink=1cb3111d_6ee9587

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 
%   輸出:采樣后的圖片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 
測試結果如下: 

  

  

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM