《OpenCV3 计算机视觉 Python语言实现》——处理文件、摄像头和图形用户界面

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,结果如下:

《OpenCV3 计算机视觉 Python语言实现》——处理文件、摄像头和图形用户界面_第1张图片

《OpenCV3 计算机视觉 Python语言实现》——处理文件、摄像头和图形用户界面_第2张图片

《OpenCV3 计算机视觉 Python语言实现》——处理文件、摄像头和图形用户界面_第3张图片

使用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)





你可能感兴趣的:(OpenCV学习笔记,计算机视觉,OpenCV学习及实用demo)