2011-05-25 76 views
4

我正在用python中的opencv做一些簡單的程序。我想自己編寫一些算法,因此需要查看圖像中的「原始」圖像數據。例如,我不能只做圖像[i,j],我怎麼才能看到數字?Opencv ...獲取IPLImage或CvMat中的數據

感謝

回答

5

快速例子的cvmat

import cv 

path = 'stack.png' 
mat = cv.LoadImageM(path, cv.CV_LOAD_IMAGE_UNCHANGED) 
x, y = 42, 6 
print type(mat) 
print mat[y, x] 

輸出:

<type 'cv.cvmat'> 
(21.0, 122.0, 254.0) 

快速示例示出如何將多個的一個或多個顏色通道通過0.5

for x in xrange(mat.cols): 
    for y in xrange(mat.rows): 
     # multiply all 3 components by 0.5 
     mat[y, x] = tuple(c*0.5 for c in mat[y, x]) 

     # or multiply only the red component by 0.5 
     b, g, r = mat[y, x] 
     mat[y, x] = (b, g, r * 0.5) 
+0

很酷謝謝...是否有原因[y,x]的順序?另外如果我想說,將每個元素乘以0.5,我該如何實現? – Ferguzz 2011-05-25 18:43:42

+0

當然。該矩陣由'row,col'索引,並且每個顏色元組被命令爲((B,G,R))用於彩色圖像。我將更新答案,向您展示如何將一個或多個顏色分量乘以0.5。 – samplebias 2011-05-25 18:56:51

0

我不知道OpenCV的Python綁定,但在C或C++,你必須得到存儲在IplImage的緩衝區指針。該緩衝區根據圖像格式進行編碼(也存儲在IplImage中)。對於RGB,你有一個R的字節,G的一個字節,B的一個字節,等等。

看看python綁定的API,你會發現如何訪問緩衝區,然後你可以得到像素信息。

MY2C

1

CvMat中都和IplImage結構提供tostring方法,返回表示的原始數據的字符串。使用圖像數據,您可以計算出如何將字符串數據解釋爲矩陣。

您應該可以使用fromarray將數據字符串轉換回圖像對象。

要將字符串轉換爲數組,請考慮在Python中使用array模塊。例如:

array.array('B', CvMat.tostring()) # 'B' is unsigned char, for rgb8 images 

要獲得像素之間的 '步幅',使用方法:

stride = CvMat.step/CvMat.cols 

然後典型的數組索引獲得單個像素。你可能想把所有這些都放在一個隱藏所有討厭複雜性的類中。使用LoadImageM加載的圖像文件直接進入