我試圖找到一個離散近似高斯平滑操作,如圖所示鏈接:離散逼近高斯平滑
摹一些離散平滑核,高斯在這種情況下,*是卷積運算。基本上,我想對圖像中的每個像素應用平滑內核。我在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。整個問題看起來是這樣的:
因此,我要預先生成的矩陣ģ其中爲了這個目標饋送到解算器近似的平滑函數。我正在使用cvx,如果有幫助。
爲什麼不只是使用'conv2'(或其中一個更有用的變體,比如'imfilter')? – Notlikethat
請參閱編輯。使用外部函數在這裏是不可能的,因爲我把這個提供給一個求解器,所以我需要生成一個矩陣來平滑整個向量。 – Swami
你是否稱過你的矩陣G,因爲它是巨大的?它是4 * ksize^2 =比你的圖像大100倍,然後你用2個循環來填充它,這在Matlab中是非常慢的。哪一個問題會帶來一個關於你的求解器如何做的問題,它需要這麼大的東西?如果你只是尋找一個加速與meshgrid()做一個預先生成的,而不是一直生成它。只需打印出來看看如何轉移。 – Vlad