2015-10-16 48 views
1

我正在處理具有測量強度的圖像文件,基本上提取1x1x1像素大小的體素。圖像文件正在形成一個體積以避免峯值強度。我想找到一種平均超過3x3x3像素的方法。在192x192x24體積中的3x3x3體素的平均值

我的問題是要解決這個問題,因爲它是由零和其他值分隔的圖像中的形狀。所以,我首先考慮了一個for -loop與if -statement。這些是我迄今對for -loop和if-陳述所做的考慮。 MATLAB通過簡單的for循環將音量視爲一個長矩陣,應該很容易找到非零值及其相鄰值,並取這些值的平均值。問題出現在我必須考慮z維度的時候。

這顯然不是最佳工作,我覺得很難說明邊界效應。

回答

6

我希望我正在解釋你的問題,但是你想在輸入圖像中的每個體素中找到3 x 3 x 3體素體積的平均值,其中每個輸入體素充當每個3 x 3的中心x 3體素量被平均。如果您可以選擇使用MATLAB的內置函數,請考慮使用與convn的N-D卷積。不要在這裏使用循環,因爲它會非常慢。對於convn,第一個參數是3D圖像,第二個參數是3 x 3 x 3內核,其值均等於1/27。如果卷積核超出輸入圖像的範圍,您還可以選擇指定沿邊界發生的情況。通常,您想要返回與輸入大小相同的輸出圖像,因此您可能需要將'same'標誌指定爲第三個可選參數。該平均機制還假定外邊緣是零填充的。

因此,假設您的圖像存儲在im,做這樣的事情:

%// Create kernel of all 1/27 in a 3 x 3 x 3 matrix 
kernel = ones(3,3,3); 
kernel = kernel/numel(kernel); 

%// Perform N-D convolution 
out = convn(double(im), kernel, 'same'); %// Cast to double for precision 

out = cast(out, class(im)); %// Recast back to original data type 

或者,如果你有機會到圖像處理工具箱,用imfilter代替。這個和convn不同的是,imfilter使用Intel Integrated Performance Primitives (IIPP)寫的,所以性能肯定會更快:

%// Create kernel of all 1/27 in a 3 x 3 x 3 matrix 
kernel = ones(3,3,3); 
kernel = kernel/numel(kernel); 

%// Perform N-D convolution 
out = imfilter(im, kernel); 

的好處是,你是不是需要改變輸入類型。 imfilter自動推斷此,輸入圖像的原始類型的處理和imfilter的輸出類型是否與輸入類型相同。使用convn時,您必須確保您的數據在使用前處於浮點狀態。