2011-04-23 77 views
5

使用Python界面,用於OpenCV的,可以很容易地使用[]操作符訪問的圖像的像素,如下:處理的OpenCV圖像像素迅速使用python接口

img = cv.LoadImage('test.jpg') 
pixel = img[10,10] 

可變像素這裏是一個蟒元組對象如(10,20,30)(例如3個通道),由於元組類型不支持運算符' - '或'+',因此處理計算不是很方便。如果我希望做一個子結構上像255像素 - (10,20,30),我必須 這樣的代碼:

import numpy as np 
pixel = tuple(np.array([255,255,255]) - np.array(pixel)) 

是有一個更快,更容易的解決方案?
另一個qustion:有沒有辦法做一個減法上的所有像素,就像在Matlab使用矩陣減法:255 - IMG(不要使用OpenCV的內建功能)。

回答

3

您可以使用opencv源碼分發版中的adaptors.py中的cv2array()/array2cv()函數,並使用numpy陣列執行所有計算。 255 - imgarr適用於這種情況。例(cv2array()爲只讀陣列簡裝版):

assert isinstance(img, cv.iplimage) and img.depth == cv.IPL_DEPTH_8U 
a = np.frombuffer(img.tostring(), dtype=np.uint8) 
a.shape = img.height, img.width, img.nChannels 
print 255 - a 
+0

我OpenCV的版本是2.1,我發現adaptors.py在\ OpenCV2.1 \接口\痛飲\ python和沒有一個功能所謂cv2array()或array2cv() – PinkyJie 2011-04-24 14:03:34

+0

@PinkyJie:http://www.google.com/codesearch?q=function%3Acv2array+file%3Aadaptors.py+lang%3Apython&hl=en&btnG=Search+Code – jfs 2011-04-24 16:04:23

+0

@PinkyJie:在另一方面上述方法可能已經過時。你的版本是否有'cv.fromarray()'函數?你對'numpy.asarray(img)'有什麼看法? http://opencv.willowgarage.com/documentation/python/cookbook.html#numpy-and-opencv – jfs 2011-04-24 16:09:33