1. 程式人生 > >圖像的降采樣與升采樣(二維插值)----轉自LOFTER-gengjiwen

圖像的降采樣與升采樣(二維插值)----轉自LOFTER-gengjiwen

sample esc text arch 均可 分享 lose earch 測試

圖像的降采樣與升采樣(二維插值)

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函數的旁瓣比較大,故在升采樣後的圖像中會存在振鈴現象。讀者可以觀察上面的實現結果圖片。如果想減小這種情況,則可以對其進行頻域加窗。 轉自:http://www.lofter.com/postentry?from=search&permalink=1cb3111d_6ee9587

圖像的降采樣與升采樣(二維插值)----轉自LOFTER-gengjiwen