1 基本I/O脚本
1.1 读/写图像
OpenCV的imread函数()和imwrite函数()能支持各种静态图像文件格式。无论哪种格式,每一个像素都会有一个值,但不同格式表示像素的方式有所不同。例如,可以通过二维Numpy数组来简单创建一个黑色的正方形图像:
import cv2 import numpy as np img = np.zeros((3,3)) print(img) cv2.imwrite('blackblock.jpg', img) img打印结果: [[0. 0. 0.] [0. 0. 0.] [0. 0. 0.]]
保存的结果如下(3*3的黑色方块):
每个像素都由一个8位的整数表示,即每一个像素值的范围是0~255。
在默认情况下,即使图像文件为灰度图片格式,imread()函数也会返回BGR格式的图像。BGR与red-green-blue(RGB)所表示的色彩空间相同,但是字节顺序相反。
例如,重新加载blackblock.jpg图片,打印其结果:
1 import cv2 2 import numpy as np 3 4 img = cv2.imread("blackblock.jpg") 5 print("img.shape ", img.shape)
img.shape = (3,3,3)
1.2 图像与原始字节之间的转换
从概念上讲,一个字节能表示0到255的整数。一个像素通常由每一个通道的一个字节表示。
一个OpenCV图像是.array类型的二维或三维数组。其中,image[0,0]或image[0,0,0],数组的第一个值代表了像素的y坐标或行,0表示顶部;第二个值表示像素的x坐标或列,0表示最左边;第三个值(如果有的话)表示颜色通道。
例如,对于一个左上角有白色像素的8位灰度图像而言,image[0,0]=255。对于一个左上角有蓝色像素的24位BGR图像而言,image[0,0]=[255,0,0]。
用随机数生成BGR图像:
1 import cv2 2 import numpy as np 3 4 random_value = np.random.randint(0,high=255,size=1200) 5 random_array = random_value.reshape(20,20,3) 6 cv2.imwrite('randImage.jpg',random_array)
生成的randImage.jpg图像如下:
1.3 使用numpy.array访问图像数据
想要获取一个指定位置的像素值:通过numpy.array提供的item()方法非常方便,该函数有三个参数:x(或左)位置,y(或顶部)位置以及通道索引。该函数返回了指定位置(x,y,z(通道))处的像素大小。
修改指定位置的像素:可以通过itemset(),该函数有两个参数:(x,y,通道索引)和要设定的值。
例如,对上生成的randImage.jpg进行操作:
1 import cv2 2 import numpy as np 3 4 5 img = cv2.imread("dog.jpg") 6 print(img.item(0, 0, 1)) # 打印结果为:102 7 img.itemset((0,0,1),255) 8 print(img.item(0, 0, 1)) # 打印结果为:255
参考文献:[1]Joe Minichino, Joseph Howse(著); 刘波, 苗贝贝(译). OpenCV 3计算机视觉:Python语言实现[M]. 北京:机械工业出版社,2016.6