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