2010-08-26 54 views
3

我有一個應用程序,它接收來自包裝有ctypes的相機API的JPEG數據指針,將其轉換爲wx.Image,並將圖像顯示爲電影。Python中的圖像位操作

其中一個需要的功能是設置一個像素的兩個分量等於第三個。例如,RGB格式的像素是(100,200,255),我想將R和B值設置爲等於G或(200,200,200)。我需要爲圖像中的每個像素做他 ,同時保持一個體面的幀率。

我可以通過調用Image.GetData來訪問我的wx.Image中的RGB值,它將以下列格式返回一個包含像素值的字符串:RGBRGBRGB ...我通過遍歷該RGBRGBRGB串。

然而,這種幼稚的做法實在太慢,實現體面的FPS,因爲(我認爲):

一)我通過圖像中的每個像素迭代。

b)我正在做太多的數據複製。

我已經考慮將RGB數據轉換爲numpy,執行操作(我假設numpy會有更快的方式做這種事情),然後轉換回wx.Image。不幸的是,我不能直接從原始數據轉換爲numpy,因爲數據以JPEG形式出現,而不是以RGB位圖形式出現。所以我需要從data-> wx.Image-> numpy array-> wx.Image。

我還考慮實現我自己的python緩衝區,它將在讀取時返回例如G像素值而不是R和B值。我認爲這將是理想的解決方案,因爲它不需要數據複製或迭代過多,但我不知道如何去做這件事。我需要用C寫這個緩衝區嗎?是否有可能在純Python中實現緩衝區並仍然處理原始內存?

所以,你認爲我應該改善我的表現嗎?我應該嘗試numpy還是緩衝解決方案,還是有更簡單的解決方案,我錯過了?

我主要尋找創意/鏈接到相關的文檔或實例,但是,如果某人想要寫一些代碼,然後這很好:)

感謝

回答

1

你可以嘗試使用Python Imaging Library(PIL) - 這是一個操作圖像的庫。

您可以在wxPython圖像和PIL圖像here之間找到有關轉換的信息,或者您可以直接將jpeg加載到PIL圖像中。

一旦你已經將您的WX圖像轉化爲PIL圖像我認爲這會做你想做的(但我沒有測試過):

r, g, b = im.split()    # split the image into separate color planes 
im = Image.merge("RGB", (g, g, g)) # merge them back, using the green plane for each 

然後將其轉換回一個wxPython的圖像。

由於PIL是在C中實現的,並且爲圖像處理進行了優化,所以這應該比在Python中執行要快幾個數量級。

1

如果您需要真正快速的圖像處理,我建議您編寫GLSL pixel shader並通過OpenGL和PyGame進行連接。 沒有什麼比像素着色器的處理速度快,因爲每個像素都由視頻卡上的GPU並行處理。 如果您需要測試像素着色器代碼(用C的子集編寫),最好使用RenderMonkey這樣做 - 它是體面着色器開發IDE!

祝你好運!