《OpenCV 4 计算机视觉:Python 语言实现(原书第 3 版)》阅读札记

第 1 章 安装 OpenCV

为何 OpenCV 的 Python 模块命名为 cv2?

在 cv2 中的 2 与 OpenCV 的版本号无关,我们使用的是 OpenCV 4。历史上,有一个名为 cv 的 Python 模块封装了 OpenCV 的一个已经过时的 C 版本。在 OpenCV 4 中已经不存在任何 cv 模块。但是 OpenCV 文档有时会错误地将模块命名为 cv(而不是 cv2)。请记住,在 OpenCV 4 中,正确的 Python 模块名称始终是 cv2。

第 2 章 处理文件、摄像头和 GUI

img = numpy.zeros((3, 3), dtype=numpy.uint8)

按:

(3, 3) 中前一个 3 表示 3 行,后一个 3 表示 3 列(如果把它想象成矩阵的话);uint8 表示无符号整数,范围是 0~255
这里,使用 8 位整数来表示像素,所以像素的值的范围是 0~255,其中 0 表示 黑色,255 表示白色,中间的值表示灰色。

img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)

按:使用 cv2.cvtColor 函数将上面的图像转换成蓝-绿-红(Blue-Green-Red,BGR)格式。

图像的变化过程如下:

array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]], dtype=uint8)

==>

array([[[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]]], dtype=uint8)

按:转换后的图像每个像素都用一个三元数组表示,每个整数分别表示三个颜色通道(B、G 和 R)中的一个。

shape 属性返回行、列和通道数(如果有多个通道的话)。

img = numpy.zeros((5, 3), dtype=numpy.uint8)
print(img.shape)

output:

(5, 3)

按:输出 (5, 3),表示我们有一幅 5 行 3 列的灰度图像,如果将该图像转换成 BGR 格式,shape 将是 (5, 3, 3),表示每个像素有 3 个通道。

import cv2

image = cv2.imread('MyPic.png')
cv2.imwrite('MyPic.jpg', image)

按:从 png 格式加载并保存为 jpg 格式。

默认情况下,imread 返回 BGR 格式的图像,即使该文件使用的是灰度格式。 BGR 表示与红-绿-蓝(Red-Green-Blue,RGB)相同的颜色模型,只是字节顺序相反。

imread 支持的模式选项有哪些?

  • cv2.IMREAD_COLOR:该模式是默认选项,提供 3 通道的 BGR 图像,每个通道一个 8 位值(0~255)。
  • cv2.IMREAD_GRAYSCALE:该模式提供 8 位灰度图像。
  • cv2.IMREAD_ANYCOLOR:该模式提供每个通道 8 位的 BGR 图像或者 8 位灰度图像,具体取决于文件中的元数据。
  • cv2.IMREAD_UNCHANGED:该模式读取所有的图像数据,包括作为第 4 通道的 α 或透明度通道(如果有的话)。
  • cv2.IMREAD_ANYDEPTH:该模式加载原始位深度的灰度图像。例如,如果文件以这种格式表示一幅图像,那么它提供每个通道 16 位的一幅灰度图像。
  • cv2.IMREAD_ANYDEPTH|cv2.IMREAD_COLOR:该组合模式加载原始位深度的 BGR 彩色图像。
  • cv2.IMREAD_REDUCED_GRAYSCALE_2:该模式加载的灰度图像的分辨率是原始分辨率的 1/2。例如,如果文件包括一幅 640×480 的图像,那么它加载的是一幅 320×240 的图像。
  • cv2.IMREAD_REDUCED_COLOR_2:该模式加载每个通道 8 位的 BGR 彩色图像,分辨率是原始图像的 1/2。
  • cv2.IMREAD_REDUCED_GRAYSCALE_4:该模式加载灰度图像,分辨率是原始图像的 1/4。
  • cv2.IMREAD_REDUCED_COLOR_4:该模式加载每个通道 8 位的彩色图像,分辨率是原始图像的 1/4。
  • cv2.IMREAD_REDUCED_GRAYSCALE_8:该模式加载灰度图像,分辨率是原始图像的 1/8。
  • cv2.IMREAD_REDUCED_COLOR_8:该模式加载每个通道 8 位的彩色图像,分辨率为原始图像的 1/8。
import cv2

grayImage = cv2.imread('MyPic.png', cv2.IMREAD_GRAYSCALE)
cv2.imwrite('MyPicGray.png', grayImage)

按:将一个 PNG 文件加载为灰度图像(在此过程中会丢失所有的颜色信息),再将其保存为一个灰度 PNG 图像。

imreadimwrite 操作文件时,对文件的路径有什么要求?

  • 如果希望直接使用文件名来读取文件,那么,图片文件必须和当前的 Python 脚本位于同一目录。这时用的是相对路径;
  • 使用绝对路径。

imwrite 函数对图像有什么要求?

imwrite() 函数要求图像为 BGR 格式或者灰度格式,每个通道具有输出格式可以支持的特定位数。例如,BMP 文件格式要求每个通道 8 位,而 PNG 允许每个通道 8 位或 16 位。

我们可以通过使用类似于 image[0, 0] 或者 image[0, 0, 0] 的表达式来访问 numpy.array 类型的数据中的值。第一个索引是像素的 y 坐标或者行,第二个索引是像素的 x 坐标或列,第三个索引(如果有的话)表示一个颜色通道。

一个例子?

在左上角为白色像素的 8 位灰度图像中,image[0,0] 是 255。在左上角为蓝色像素的 24 位(每个通道 8 位)BGR 图像中,image[0,0][255,0,0]

byteArray = bytearray(image)

按:假设图像的每个通道有 8 位,我们可以将其强制转换为标准的 Python bytearray 对象(一维的)。


《OpenCV 4 计算机视觉:Python 语言实现(原书第 3 版)》阅读札记
http://fanyfull.github.io/2021/10/30/《OpenCV-4-计算机视觉:Python-语言实现(原书第-3-版)》阅读札记/
作者
Fany Full
发布于
2021年10月30日
许可协议