如果這是你來計算各個子圖像中的平均值,一旦你與高斯內核過濾你的形象的願望,只要你的卷積圖像與mean or average filter。這將收集您的原始圖像和每個輸出位置的子圖像,您將計算平均值。
在初始假設屏幕尺寸爲3 x 3的情況下,只需將conv2
與具有全部1/9係數的3 x 3屏蔽結合使用即可。換句話說:
%// Your code
%% Given Image I,Defined a Gaussian Kernel
sigma=3;
K=fspecial('gaussian',round(2*sigma)*2+1,sigma);
KI=conv2(I,K,'same');
%// New code
mask = (1/9)*ones(3,3);
out = conv2(KI, mask, 'same');
在out
每個位置會給你什麼樣的平均值是在您的高斯濾波結果每個3×3子圖像。
您還可以使用fspecial
與標記average
並指定掩碼的大小/寬度來創建平均掩碼。鑑於你已經在你的代碼中使用它,你已經知道它的存在。同樣,你也可以這樣做:
mask = fspecial('average', 3);
上面的代碼假定寬度和麪罩的高度是一樣的,所以它會創造一切1/9係數的3×3面具。
除了
conv2
被設計用於一般的2D信號。如果您想要過濾圖片,我建議您改用imfilter
。您應該可以訪問它,因爲fspecial
是圖像處理工具箱的一部分,所以imfilter
也是如此。 imfilter
已知比conv2
效率更高,並且如果可用的話也使用Intel Integrated Performance Primitives (Intel IPP)(基本上,如果您在具有支持IPP的Intel處理器的計算機上運行MATLAB)。因此,你應該執行你的過濾是這樣的:
%// Your code
%% Given Image I,Defined a Gaussian Kernel
sigma=3;
K=fspecial('gaussian',round(2*sigma)*2+1,sigma);
KI=imfilter(I,K,'replicate'); %// CHANGE
%// New code
mask = fspecial('average', 3);
out = imfilter(KI, mask, 'replicate'); %// CHANGE
的replicate
標誌是處理邊界條件。當您的蒙版超出原始圖像的邊界時,replicate
只會複製圖像每一邊的邊框,以便在執行濾鏡時蒙版可以舒適地適合圖像。
編輯
鑑於你的評論,你想提取見於KI
子圖像。您可以使用功能強大的im2col
功能,它是圖像處理工具箱的一部分。你怎麼稱呼它,像這樣:
B = im2col(A,[m n]);
A
將是你的輸入圖像,並B
將是一個矩陣是大小mn x L
的地方L
是存在於你的形象和m
可能的子圖像的總數量,n
分別是每個子圖像的高度和寬度。 im2col
的工作原理是,對於圖像中存在的每個子圖像,它會對它們進行扭曲,以使其適合於B
中的單個列。因此,B
中的每一列都會生成一個單獨的子圖像,該子圖像被翹曲成一列。然後,您可以使用B
中的每列進行GMM建模。
但是,im2col
只返回不超出邊界的有效子圖像。如果你想要處理邊緣和角落的情況下,你需要墊第一個圖像。使用padarray
來方便填充。因此,你要問什麼,我們只是做:
Apad = padarray(KI, [1 1], 'replicate');
B = im2col(Apad, [3 3]);
第一行代碼將墊的圖像,讓您有包圍圖像的1個像素的邊界。這將允許您在邊界位置提取3 x 3個子圖像。我使用replicate
標誌,以便您可以簡單地複製邊框像素。接下來,我們使用im2col
,以便獲得3 x 3個子圖像,然後將其存儲在B
中。因此,B
將成爲9 x L
矩陣,其中每列爲您提供3 x 3的子圖像。
請注意im2col
翹曲列專業格式的這些列。這意味着對於您所擁有的每個子圖像而言,它會將子圖像中的每一列都疊加在一起,從而爲您提供9 x 1
列。您將有L
全部子圖像,並且它們水平連接以產生9 x L
矩陣。此外,請記住,子圖像從頂部到底部被讀取爲,然後從左到右被讀取爲,因爲這是以列主要順序操作的MATLAB的性質。
對於2D矩陣/信號,「平均值(KI)」將給出單個行向量,其中每個元素是位於該KI處索引處的**列**的均值。根據你的描述,這當然不是你想要的。無論哪種方式,我都提供了一個答案。 – rayryeng 2015-02-05 18:59:20
是的,我錯誤地使用函數意味着(KI) – Jame 2015-02-05 19:04:28