我正在python中用opencv做一些简单的程序。我想自己写一些算法,所以需要获取图像中的"原始"图像数据。例如,我不能只做图像[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)
tostring
方法。使用图像数据,您可以了解如何将字符串数据解释为矩阵。
您应该能够使用fromarray
将数据字符串转换回图像对象。
要将字符串转换为数组,请考虑在Python中使用array
模块。例如:
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