图像与原始字节之间的转换:
从概念上,一个字节能表示0到255的整数,通常一个像素每个通道由一个字节表示。
一个OpenCV图像是.array类型的二维或者三维数组。8位的灰度图像是一个含有字节值得二维数组。一个24位的BGR图像是一个三维数组,也包含了字节值,可以使用表达式访问这些值,如image[0,0]或者image[0,0,0]。第一个值表示y坐标,第二个值表示x坐标,第三个值为颜色通道。还可以使用image.item((0,0))或image.setitem((0,0),128)来访问像素和对像素进行操作。
若一幅图像的每个通道为8位,则可以将其显式转换为标准的移位Python bytearray格式:
byteArray=bytearray(image)
bytearray含有恰当顺序的字节,可以通过显式转换和重构,得到numpy.array形式的图像:
grayImage=numpy.array(grayByteArray).reshape(height,width)
bgrImage=numpy.array(bgrByteArray).reshape(height,width,3)
下面介绍一个将含有随机字节bytearray转换为灰度图像和BGR图像:
import cv2
import numpy as np
import os
randomByteArray=bytearray(os.urandom(120000))
flatNumpyArray=np.array(randomByteArray)
grayImage=flatNumpyArray.reshape(300,400)
cv2.imwrite('RandomGray.png',grayImage)
bgrImage=flatNumpyArray.reshape(100,400,3)
cv2.imwrite('RandomColor.png',bgrImage)
结果产生灰度图:
和彩色图像:
使用numpy.random.randint(0,256,120000).reshape(300,400)也可以并更加高效地生成Numpy数组。
使用numpy.array访问图像数据:
y.array结构针对数组操作有很好地优化,允许(bulk)操作。.array操作再OpenCV图像处理中会很方便使用,如对BGR图像的某一像素点进行操作,转换为白色像素点:
import cv2
import numpy as np
img=cv2.imread('time.jpg')
img[0,0]=[255,255,255]
cv2.imshow('1',img)
cv2.waitKey()
用numpy.array函数来转换数组比普通的Python数组转换要快得多。
方法:
import cv2
import numpy as np
img=cv2.imread('time.jpg')
print(img.item(150,120,0))
img.itemset((150,120,0),255)
print(img.item((150,120,0)))
使用numpy.array的原因:numpy.array处理这类问题进过很好地优化;通过Numpy的方法代码可读性更强。
下面是对通道的操作,指定某一通道的所有值置为0:
import cv2
import numpy as np
img=cv2.imread('time.jpg')
img[:,:,1]=0
cv2.imshow('1',img)
cv2.waitKey()
注意:通过循环操作来处理Python数组的效率非常低,尽量避免;使用数组索引可以高效地操作像素,像素操作是一个高代价的低效操作,特别是在处理视频图像时,可用索引来解决这个问题。
通过NumPy数组的索引访问原始图像:设置感兴趣区域(Region Of Interest ,ROI):
import cv2
import numpy as np
img=cv2.imread('time.jpg')
my_roi=img[0:100,0:100]
img[300:400,300:400]=my_roi
cv2.imshow('1',img)
cv2.waitKey()
要确保这两个区域大小相同。
numpy.array获取图像的属性:
import cv2
import numpy as np
img=cv2.imread('time.jpg')
print(img.shape)
print(img.size)
print(img.dtype)
结果:
(1080, 1920, 3)
6220800
uint8
其中三个属性为:
Shape:NumPy返回包含宽度,高度和通道数的数组,在调试图像类型调试时有用,如果图像是单色或灰度的,将不包含通道值。
Size:该属性是指图像像素的大小
Dtype:该属性会得到图像的数据类型(通常为一个无符号整数型的变量和该类型占的位数,比如uint8类型)