2014-10-19 82 views
0

我試圖通過使用colfilt函數的圖像運行自定義的過濾器。該濾鏡基本上在圖像中運行一個窗口nxn,並將中心像素替換爲其最小和最大總和的一半。這是代碼的樣子:在MatLab/Octave中使用colfilt函數的錯誤

colfilt(image, 3, "sliding", @(x) (min(x(:))+max(x(:)))/2) 

不過,我得到這個錯誤:

error: col2im: can't resize B in matrix sized (A_SIZE - BLOCK_SIZE +1) 
error: called from: 
error: /usr/share/octave/packages/image-2.2.1/col2im.m at line 143, column 9 
error: /usr/share/octave/packages/image-2.2.1/colfilt.m at line 152, column 9 

如果我被nfilter更換功能,如下面

nlfilter(image, [n n], @(x) (min(x(:))+max(x(:)))/2) 

它工作正常,但速度太慢,所以我認爲第一個選項必須更好地工作。

有誰知道如何使它工作?

在此先感謝。

+0

它看起來像你分配colfilt結果的矩陣的大小應該是A的大小 - blocks_size(在你的情況下是3)+ 1 = A-2的大小,它沒有這樣的大小尺寸。 – Cheery 2014-10-19 04:12:11

+0

但是我沒有把結果賦值給任何變量 – gcolucci 2014-10-19 04:15:01

+0

你 - 不是,但col2im是由colfilt調用的。原始圖像的尺寸是多少?嘗試使用不僅是'3',而是'[3 3]' – Cheery 2014-10-19 04:16:59

回答

2

您需要仔細閱讀colfilt的文檔。下面是它說什麼關於sliding選項:

B = colfilt(A,[M N],'sliding',FUN) rearranges each M-by-N sliding 
neighborhood of A into a column in a temporary matrix, and then applies 
the function FUN to this matrix. FUN must return a row vector containing 
a single value for each column in the temporary matrix. (Column 
compression functions such as SUM return the appropriate type of 
output.) colfilt then rearranges the vector returned by FUN into a 
matrix of the same size as A. 

關鍵的一句話是:FUN必須在臨時矩陣返回包含單個值的行向量爲每列。colfilt的功能在於它將每個像素鄰域轉換爲單個列,並將所有這些列連接成一個臨時矩陣。因此,每列代表一個像素鄰域。因此,您需要編寫匿名函數,以便輸出爲單行向量,其中該行向量中的每個元素都是輸出結果,如果將函數應用於位於每個像素鄰域中的每個像素鄰域這個臨時矩陣的列。因此,你只需要修改你的匿名函數來做到這一點,而不是:

out = colfilt(image, [3 3], 'sliding', @(x) ((min(x)+max(x))/2)); 

請注意,您需要指定第二個輸入作爲[3 3],而不僅僅是3的單號在評論注意到你的帖子。現在,這應該可以獨立地找到每列的最小值,並將其與每列的最大值相加,然後除以2.此行向量現在應該輸出結果對於您已處理的每個像素鄰域的結果。

+0

感謝您的澄清! – gcolucci 2014-10-19 14:51:13