2013-10-14 18 views
3

圖像處理算法通常需要各個圖像位置的鄰域內的像素值。但是,邊界點的鄰域不完整,需要使用各種方法進行特殊處理,例如鏡像反射,週期性等。在Python中實現任意圖像算法時處理邊界像素的有效方法

對於線性運算,有效的方法是將算法轉換爲內核並進行二維卷積。卷積程序通常有內置的邊界處理方法。

任意(非線性)算法,一種可能性是pad圖像首先,收集所有的街區一次(例如,pad + neighbor),並做你的以矢量化的方式操作。但是,這可能會像文檔所建議的那樣令人記憶沉重。

循環遍歷像素和處理邊界的情況是另一種方式。但在Python中這可能會很慢(儘管在C/C++中是可行的),並且提供所有這些鏡像/週期性的東西似乎很麻煩......

如何在執行您自己的操作時有效地(也許是Pythonic)在Python中的算法?

是否有一些函數返回specified pixel的鄰域,並指定邊界處理方法?

回答

1

PIL是最着名的圖像處理庫之一。你可能也想看看ImageMagick,我認爲它有很多很酷的圖像轉換功能。

2

圖像處理過程中處理邊界條件的最pythonic和有效的方法是使用現有的庫。在PIL和ImageMagick之上,我也推薦OpenCV

Python本身並不提供任何圖像處理功能,因此有關特定像素的鄰域的任何問題都是特定於圖庫的。選擇一個你喜歡的圖書館,並與它一起玩耍 - 如果你無法弄清楚圖書館如何處理邊界條件,請回來再問一次。

+1

我完全同意這一點。只需添加一個註釋 - 如果你真的想自己做一些事情,你可以使用[numpy](http://www.numpy.org/),這是OpenCV for python的基礎,也是它的先決條件。在進行數組操作和處理時,它幾乎和C一樣快。 – KobeJohn

+0

我只是想知道當人們試圖在Python中實現基於像素的鄰域算法時,關於邊界處理的一般策略是什麼。該算法可能無法在現有庫中直接使用。我知道numpy,scipy,PIL,以及opencv和ImageMagick的Python綁定。但通常情況下,相關的實現不是用Python編寫的。我發現一個鼓舞人心的軟件包是在問題中鏈接的scikit-image。 – herrlich10

+0

您已經有了正確的想法:常用策略是複製圖像的某些部分,或者包含條件邏輯來處理邊界條件。他們都有缺點(內存使用,效率),但如果你真的擔心這樣的事情,那麼你可能不應該首先在Python中實現它(即使用現有的圖像處理庫)。 – misha