《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
按:
(3, 3)
中前一个 3 表示 3 行,后一个 3 表示 3
列(如果把它想象成矩阵的话);uint8
表示无符号整数,范围是
0~255
。
这里,使用 8 位整数来表示像素,所以像素的值的范围是
0~255
,其中 0 表示 黑色,255
表示白色,中间的值表示灰色。
按:使用 cv2.cvtColor
函数将上面的图像转换成蓝-绿-红(Blue-Green-Red,BGR)格式。
图像的变化过程如下:
==>
按:转换后的图像每个像素都用一个三元数组表示,每个整数分别表示三个颜色通道(B、G 和 R)中的一个。
shape 属性返回行、列和通道数(如果有多个通道的话)。
output:
按:输出 (5, 3)
,表示我们有一幅 5 行 3
列的灰度图像,如果将该图像转换成 BGR 格式,shape 将是
(5, 3, 3)
,表示每个像素有 3 个通道。
按:从 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。
按:将一个 PNG 文件加载为灰度图像(在此过程中会丢失所有的颜色信息),再将其保存为一个灰度 PNG 图像。
imread
和imwrite
操作文件时,对文件的路径有什么要求?
- 如果希望直接使用文件名来读取文件,那么,图片文件必须和当前的 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]
。
按:假设图像的每个通道有 8 位,我们可以将其强制转换为标准的 Python bytearray 对象(一维的)。