2016-11-19 78 views
0

我想使用大小爲3x3像素的滑動窗口以逐像素的方式遍歷圖像,並且在滑動窗口的每個位置處,我想計算最小值的最大值,平均值,標準偏差的像素值。在圖像中移動像素統計

你能告訴我如何做到這一點?另外,執行此操作的最快方法是什麼?

非常感謝提前!

+0

請顯示您已經嘗試的內容,包括您考慮使用的函數,您考慮採用的方法,其他語言的實現等。如果有關於MATLAB文檔的內容不清楚 - 您應該提及。如果你遇到了一些錯誤 - 你應該提到這一點。如果您擔心性能問題 - 您應該詢問相關問題(即「我做了X,您能否提出更有效的方法?」)。顯示一些努力來解決自己的問題,鼓勵他人回答。祝你好運! –

回答

2

如果可能,應始終使用內置功能。

nlfilter推薦用於滑動窗口操作。 colfilt是相同的,但通常更好的內存位置,你應該使用它。

neigh = [3,3]; 

I_mean = colfilt(I, neigh, 'sliding', @mean); 
I_max = colfilt(I, neigh, 'sliding', @max); 
I_min = colfilt(I, neigh, 'sliding', @min); 

標準偏差可以使用stdfilt計算。由於某種原因,colfilt(... @std)需要數據類型轉換,並且在我的機器上速度降低了約4倍。

I_std = stdfilt(I); 

返回使用3x3滑動窗口製作的標準偏差圖像。

如果通過公平比較你的意思是比較速度,請注意colfiltstdfilt是完全不同的。

I_std = colfilt(double(I), neigh, 'sliding', @std); 

您還可以通過imfilter計算平均圖像。這是更快數量級的訂單,但邊界像素的輸出是一個有點不同

tic; 
meanh = fspecial('average', neigh); 
I_mean = imfilter(I, meanh); 
toc 

Elapsed time is 0.024311 seconds. 

tic; 
I_mean2 = colfilt(I, neigh, 'sliding', @mean); 
toc 

Elapsed time is 0.649545 seconds. 

這裏的區別(double(I_mean)-double(I_mean2))的說明。只有邊界像素不同的:

Image of differences

的速度差變得更大和更大的鄰里越大。

+0

非常感謝您的幫助。事實上,時間複雜性是我想要衡量的。我的原始代碼是Java,它只掃描一次圖像。在掃描過程中,計算滑動窗口當前位置的四個值,即min,max,mean和stdev,並在進入下一個位置之前將其輸入函數。在您的代碼中,我認爲會生成四個圖像(矩陣),然後我需要重新掃描這些圖像以便在窗口的每個位置上進行操作。任何想法如何模仿我的java程序?你的欣賞感謝。 –

+0

對不起,但我不明白你想達到什麼目的。Matlab是關於向量化代碼和調用高度優化的例程。如果你使用for-loops來實現某些東西,並嘗試將速度與Java中類似的例程進行比較,那麼它會將蘋果與桔子進行比較。如果這是你的功能等待圖像計算,你擔心我可以保證這種方式更快。之後你可以循環播放圖像。或者甚至更好,將它們提供給矢量化函數。 – Tapio