我正在用python中的opencv做一些簡單的程序。我想自己編寫一些算法,因此需要查看圖像中的「原始」圖像數據。例如,我不能只做圖像[i,j],我怎麼才能看到數字?Opencv ...獲取IPLImage或CvMat中的數據
感謝
我正在用python中的opencv做一些簡單的程序。我想自己編寫一些算法,因此需要查看圖像中的「原始」圖像數據。例如,我不能只做圖像[i,j],我怎麼才能看到數字?Opencv ...獲取IPLImage或CvMat中的數據
感謝
快速例子的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)
我不知道OpenCV的Python綁定,但在C或C++,你必須得到存儲在IplImage的緩衝區指針。該緩衝區根據圖像格式進行編碼(也存儲在IplImage中)。對於RGB,你有一個R的字節,G的一個字節,B的一個字節,等等。
看看python綁定的API,你會發現如何訪問緩衝區,然後你可以得到像素信息。
MY2C
CvMat中都和IplImage結構提供tostring
方法,返回表示的原始數據的字符串。使用圖像數據,您可以計算出如何將字符串數據解釋爲矩陣。
您應該可以使用fromarray
將數據字符串轉換回圖像對象。
要將字符串轉換爲數組,請考慮在Python中使用array
模塊。例如:
array.array('B', CvMat.tostring()) # 'B' is unsigned char, for rgb8 images
要獲得像素之間的 '步幅',使用方法:
stride = CvMat.step/CvMat.cols
然後典型的數組索引獲得單個像素。你可能想把所有這些都放在一個隱藏所有討厭複雜性的類中。使用LoadImageM
加載的圖像文件直接進入
很酷謝謝...是否有原因[y,x]的順序?另外如果我想說,將每個元素乘以0.5,我該如何實現? – Ferguzz 2011-05-25 18:43:42
當然。該矩陣由'row,col'索引,並且每個顏色元組被命令爲((B,G,R))用於彩色圖像。我將更新答案,向您展示如何將一個或多個顏色分量乘以0.5。 – samplebias 2011-05-25 18:56:51