0

我試圖找到一個離散近似高斯平滑操作,如圖所示鏈接:離散逼近高斯平滑

http://bit.ly/1cSgkwt

一些離散平滑核,高斯在這種情況下,*是卷積運算。基本上,我想對圖像中的每個像素應用平滑內核。我在MATLAB這樣做的,使用下面的代碼來創建矩陣,這是天真的,因此十分緩慢:

z = rgb2gray(imread('train_02463_1.bmp')); 
im_sz = size(z); 
ksize = 5; 

% Gaussian kernel of size ksize*ksize 
gw_mat = g_sigma(1,2*ksize+1)'*g_sigma(1,2*ksize+1); 

G = sparse(length(ksize+1:im_sz(1)-ksize),prod(im_sz)); 
for i = ksize+1:im_sz(1)-ksize 
    for j = ksize+1:im_sz(2)-ksize 

    [x,y] = meshgrid(i-ksize:i+ksize,j-ksize:j+ksize); 
    row_num = sub2ind(im_sz,i,j); 
    colnums = sub2ind(im_sz,x,y); 
    G(row_num,colnums(:)) = gw_mat(:)'; 

    end 
end 

有沒有更有效的方式來做到這一點?

編輯:我應該爲未完成指定問題而道歉。以下大多數答案都是有效的,但這裏的問題是上述近似值是優化目標的一部分,其中變量是z。整個問題看起來是這樣的:

http://goo.gl/rEE02y

因此,我要預先生成的矩陣ģ其中爲了這個目標饋送到解算器近似的平滑函數。我正在使用cvx,如果有幫助。

+0

爲什麼不只是使用'conv2'(或其中一個更有用的變體,比如'imfilter')? – Notlikethat

+0

請參閱編輯。使用外部函數在這裏是不可能的,因爲我把這個提供給一個求解器,所以我需要生成一個矩陣來平滑整個向量。 – Swami

+0

你是否稱過你的矩陣G,因爲它是巨大的?它是4 * ksize^2 =比你的圖像大100倍,然後你用2個循環來填充它,這在Matlab中是非常慢的。哪一個問題會帶來一個關於你的求解器如何做的問題,它需要這麼大的東西?如果你只是尋找一個加速與meshgrid()做一個預先生成的,而不是一直生成它。只需打印出來看看如何轉移。 – Vlad

回答

1

通常,人們通過依次應用兩個1D高斯函數而不是一個2D函數(可分離濾波器的想法)來完成它。您可以將一維水平高斯近似快速地應用到每個像素,將結果保存在溫度中,然後將垂直高斯應用於溫度。預期加速是相當顯著:O(ksize * ksize) - > O(ksize + ksize)

+0

同意。如果你注意到我的代碼,我通過取兩個一維高斯的外積來生成二維高斯核。不過,我已經更新了這個問題,應該早些時候完成。對於那個很抱歉。 – Swami

+0

從兩個1D Gaussians創建二維高斯內核與使用可分離濾波器不同。 您應該在一個方向上用一維高斯濾波它,然後在另一個方向上用另一個一維高斯濾波結果。這將導致顯着降低計算價格的相同結果。 – Milan

0

您可以通過框過濾器中使用近似的高斯平滑,如見integgaussfilt.m

此功能近似高斯通過重複應用平均濾波器來過濾。平均值通過integral images執行,其中 導致固定且非常低的計算成本,其獨立於高斯尺寸的 。

+0

如果在同一圖像上以多個內核大小執行過濾(即,如果計算積分圖像的成本可以在多個過濾操作中攤銷),則代價較低。但是,如果您以固定的內核大小過濾一次,那麼整體圖像路徑就是一個淨輸家。 –

+0

盒式過濾器的計算速度比「積分圖像」快,並且可以並行計算。 – minorlogic

0

使用MATLAB將圖像上的空間不變過濾器應用到圖像上的最快方法是使用imfilter
imfilter會自動注意到「Seperable」內核,並將分兩步應用(Vertically/Horizo​​ntally)。

要創建一些已知和有用的內核,您可以看看fspecial