我希望我正在解釋你的問題,但是你想在輸入圖像中的每個體素中找到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
時,您必須確保您的數據在使用前處於浮點狀態。