2011-05-25 74 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加载的图像文件直接进入