我正在使用python中的opencv做一些简单的程序。我想自己编写一些算法,因此需要获取图像中的“原始”图像数据。我不能只做图像[i,j],例如,我怎么能得到数字?
由于
答案 0 :(得分:5)
使用LoadImageM
将图片文件直接加载到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)
答案 1 :(得分:1)
CvMat和IplImage都提供tostring
方法,返回表示原始数据的字符串。使用图像数据,您可以弄清楚如何将字符串数据解释为矩阵。
您应该能够使用fromarray
将数据字符串转换回图像对象。
要将字符串转换为数组,请考虑在Python中使用array
模块。例如:
array.array('B', CvMat.tostring()) # 'B' is unsigned char, for rgb8 images
要获得像素之间的“步幅”,请使用:
stride = CvMat.step / CvMat.cols
然后典型的数组索引来获取单个像素。您可能希望将所有这些包含在隐藏所有令人讨厌的复杂性的类中。
答案 2 :(得分:0)
我不知道opencv python绑定,但是在C或C ++中你必须得到存储在IplImage中的缓冲区指针。该缓冲区根据图像格式编码(也存储在IplImage中)。对于RGB,你有一个R字节,一个G字节,一个B字节,依此类推。
查看python绑定的API,你会发现如何访问缓冲区然后你可以获得像素信息。
MY2C