1、安装
如果你是第一次使用OpenCV Python开发包,想要安装OpenCV Python只要执行如下命令行即可:
pip install opencv-python
如果你还想使用OpenCV Python的扩展模块,执行如下命令行即可:
pip install opencv-contrib-python
如果你已经安装了OpenCV以前的3.x版本只需要执行对应的升级安装命令行如下(假设你已经安装opencv-python 3.x)
pip install –upgrade opencv-python
如果在安装的时候遇到python命令不识别或者pip命令行不识别,请执行如下的命令行实现安装:
python –m pip install opencv-python
或者
python –m pip install opencv-contrib-python
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) # 将数组转换为400 x 300的灰度图像 garyImage = flatNumpyArray.reshape(300, 400) cv2.imwrite('randomGary.png', garyImage) # 将数组转换为400 x 300的彩色图像 bgrImage = flatNumpyArray.reshape(100, 400, 3) cv2.imwrite('randomColor.png', bgrImage)
运行该程序,将会在程序所在目录中生成两张灰度图像(如下所示)。尺寸分别为400 x 100,400 x 400
使用Python标准的os.urandom()函数可随机生成原始字节,随后会把该字节转换为NumPy数组。需要注意的是,诸如numpy.random.randint(0, 256, 120000).reshape(400, 300)
语句也能直接(并且更高效地)随机生成NumPy数组。使用os.urandom()函数的原因是该语句有助于展示原始字节的转换。
3、 使用numpy.array访问图像数据
加载OpenCV图像最简单的方式是使用imread()函数,该函数会返回一幅图像,这幅图像是一个数组(根据imread()函数输入参数的不同,该图像可能是二维数组,也可能是三维数组)。
y.array结构针对数组操作有很好的优化,它允许某些块(bulk)操作,这些操作在通常的Python中不可用这些特定的.array操作在OpenCV的图像处理中会很方便。利用numpy.array
函数来转换数组比用普通的Python数组转换要快得多。
waitKey()的参数为等待键盘触发的时间,单位为毫秒,其返回值为-1(表示没有键被按下)
img = cv2.imread('flower.png') img[0,0] = [255, 255, 255] cv2.imshow('flower', img) cv2.waitKey()
在图像左上方会出现一个白点。
假设想要改变一个特定像素的蓝色值,numpy.array提供了item()方法。该函数有3个参数:x(或左)位置,y(或顶部)位置以及(x,y)位置的数组索引(注意,
在BGR图像中,某一位置的数据是按B,G,R的顺序保存的三元数组),该函数能返回索引函数的值。另一个方法是通过itemset()函数可设置指定像素在指定通道的值(
itemset()有两个参数:一个三元组(x,y和索引)和要设定的值)。如下例子将坐标(150,120)的当前蓝色值127变为255
img = cv2.imread('flower.png') print(img.item(150, 120, 0)) # 206 打印当前坐标点的蓝色值 img.itemset((150, 120, 0), 255) print(img.item(150, 120, 0)) #255
建议使用内置的滤波器和方法来处理整个图像,上述方法只适合于处理特定的小区域。
下面介绍操作通道:将指定通道(B,G,R)的所有值置为0.(注:通过循环来处理Python数组的效率非常低,应该尽量避免这样的操作。使用数组索引可以高效地操作像素。
像素操作是一个高代价的低效操作,特别是在视频数据处理时,会发现要等很久才能得到结果。可用索引(indexing)来解决该问题)
以下代码可将图像所有的G(绿色)值设为0
通过NumPy数组的索引访问原始像素,还可设定感兴趣区域(Region Of Interest, ROI)。一旦设定了该区域,就可以执行许多操作,例如,将该区域与变量绑定,
然后设定第二个区域,并将第一个区域的值分配给第二个区域(将图像的一部分拷贝到该图像的另一个位置):
此外,还可使用numpy.array来获得图像其他属性。
shape:NumPy返回包含宽度、高度和通道数(如果图像是彩色的)数组,这在调试图像类型时很有用;如果图像是单色或灰度的,将不包含通道值;
size:该属性是指图像像素的大小;
datatype:该属性会得到图像的数据类型(通常为一个无符号整数类型的变量和该类型占的位数,比如unit8类型)
img = cv2.imread('flower.png') print(img.shape) print(img.size) print(img.dtype)
运行结果:
(332, 332, 3)
330672
uint8