2.1.1 读/写图像文件
>>import cv2
>>image = cv2.imread('MyPic.png')
>>cv2.imwrite('MyPic.jpg', image)
imread()函数的参数:
IMREAD_ANYCOLOR=4;
IMREAD_ANYDEPTH=2;
IMREAD_COLOR=1;
IMREAD_GRAYSCALE=0;
IMREAD_LOAD_GDAL=8;
IMREAD_UNCHANGE=-1;
2.1.2 图像与原始字节之间的转换
一个字节能表示0到255的整数。一个像素通常由每个通道的一个字节表示。
一个OpenCV图像是.array类型的二维或三维数组。8位的灰度图像是一个含有字节值的二维数组。一个24位的BGR图像是一个三维数组,它也包含了字节值。可使用表达式访问这些值,如image[0,0]或image[0,0,0]。第一个值代表像素的y坐标啊或行,0表示顶部;第二个值是像素的x坐标或列,0表示最左边;第三个值(如果可用的话)表示颜色通道。如,对于一个左上角有白色像素的8位灰度图像而言,image[0,0]的值为255. 对于一个左上角有蓝色像素的24位BGR图像而言,image[0,0]是[255,0,0]。
可以用另外一个表示,如image[0,0]或image[0,0]=128,还可表示成image.item((0,0))或image.setitem((0,0),128)。对于单像素操作,第二种表示方式更有效。
若一幅图像的每个通道为8位,则可将其显示转换为标准的一维Python bytearray格式:
byteArray = bytearray(image)
反之,bytearray含有恰当顺序的字节,可以通过显示转换和重构,得到numpy.array形式的图像:
garyImage = numpy.array(garyByteArray ).reshape(height, width)
bgrImage = numpy.array(bgrByteArray ).reshape(height, width, 3)
下面介绍将含有随机字节的bytearray转换为灰度图像和BGR图像:
import cv2
import numpy as np
import os
# 创建一个120000个随机字节的数组
randomByteArray = bytearray(os.urandom(120000)) #os.urandom(n) 返回n个随机byte值的string,作为加密使用
flatNumpyArray = np.array(randomByteArray) #将随机字节转换为NumPy数组
# 将数组转换为400 x 300的灰度图像
garyImage = flatNumpyArray.reshape(300, 400)
cv2.imwrite('randomGary.png', garyImage)
# 将数组转换为100 x 400 x 3 的彩色图像
bgrImage = flatNumpyArray.reshape(100, 400, 3)
cv2.imwrite('randomColor.png', bgrImage)
我用的Anaconda的python,结果如下:
使用Python标准的os.urandom()函数可随机生成原始字节,随后会把该字节转换为NumPy数组。需要注意的是,诸如numpy.random.randint(0, 256, 120000).reshape(400, 300)语句也能直接(并且更高效地)随机生成NumPy数组。使用os.urandom()函数的原因是该语句有助于展示原始字节的转换。
2.1.3 使用numpy.array访问图像数据
加载OpenCV图像最简单的方式是使用imread()函数,该函数会返回一幅图像,这幅图像是一个数组(根据imread()函数输入参数的不同,该图像可能是二维数组,也可能是三维数组)。
y.array结构针对数组操作有很好的优化,它允许某些块(bulk)操作,这些操作在通常的Python中不可用这些特定的.array操作在OpenCV的图像处理中会很方便。利用numpy.array函数来转换数组比用普通的Python数组转换要快得多。
import cv2
import numpy as np
img = cv2.imread('MyPic.png')
img[0,0] = [255, 255, 255]
cv2.imshow('my image', img)