2013-12-14 45 views
0

我最近不得不實現一些必須應用於2D矩陣的函數,例如滑動窗口平均器。用於對矩陣元素進行運算的拐角和邊緣檢測

對於上述每一件事,我必須考慮到,如果我正在治療的元素位於矩陣的角落或邊緣,我所做的手術是不一樣的。爲了繼續我的例子,我不能取(0,0)中元素周圍值的平均值,因爲它會讓我離開矩陣。

每次我面對這個時,我的方法都是不同的:我使用鱗片狀的ifs或者做不在邊緣開始的循環,然後單獨處理它們,但是我的印象並不是「最好的方式」 」。

我試圖搜索是否有一個廣泛採用的方法來解決這個問題,但找不到這就是爲什麼我要求在這裏輸入一些信息。

我主要使用C,C++,matlab和python,所以如果你在這些語言中有這樣的優雅方式,我也很感興趣!

謝謝。

回答

0

對於一些額外的內存的成本,就可以「圍繞」用零(或者,或任何適合你的算法)這樣的矩陣:

000000 
0abcd0 
0efhg0 
000000 

和運行像環:

for (size_t i = 1; i < N - 1; ++i) 
    for (size_t j = 1; j < M - 1; ++j) 
     ... 

N-1M-1是你原來的矩陣尺寸。

0

所以我認爲你說的是卷積過濾器。之前我必須處理這個問題,而我的解決方案是爲您的滑動窗口遍歷的2D網格創建我自己的類。在這種情況下,我重載了查找方法,即在C++ operator[]()中,讓它檢查超出邊界的值並返回一些值。

一些常見的解決方案是:

  • 返回一些常數(如min或網格中的最大可能值)。
  • 平鋪網格(即您的網格只是一個窗口進入同一個網格的無限域)。
  • 鉗位電網(例如,以便(0,y)的所有值都取值(0,y))。

您選擇哪個選項取決於您的應用程序(您使用哪個過濾器)。例如,如果使用Sobel濾波器執行邊緣檢測,則可能需要使用鉗位,以便圖像的邊緣不會在圖像中顯示爲假邊緣,但是,如果應用平均濾波器,您將希望返回窗口中真實值的均值,以確定超出範圍的任何值(因此超出範圍的值不會影響均值)。

短回答沒有人回答,這是非常具體的上下文。