《数字图像处理-OpenCV/Python》第2章:图像的数据格式
本书京东优惠购书链接:https://item.jd.com/14098452.html
本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html
第2章 图像的数据格式
在Python语言中,OpenCV以Numpy数组存储图像,对图像的访问和处理都是通过Numpy数组的操作来实现的。
本章内容概要
- 介绍Python语言中OpenCV的数据结构,学习获取图像的基本属性。
- 学习使用Numpy数组实现图像的创建、复制、裁剪、拼接、拆分与合并的方法。
- 学习使用查找表(LUT)快速实现像素值的替换。
2.1 图像属性与数据类型
2.1.1 图像颜色分类
按照图像颜色分类,图像可以分为二值图像、灰度图像和彩色图像。
- 二值图像:只有黑色和白色两种颜色的图像。每个像素点的像素值可以用0/1或0/255表示,0表示黑色,1或255表示白色。
- 灰度图像:只有灰度的图像。每个像素点的像素值可以用8bit数字[0, 255]表示灰度级,如0表示纯黑,255表示纯白。
- 彩色图像:彩色图像可以采用蓝色(B)、绿色(G)和红色(R)三个颜色通道的组合来表示。每个像素点可以用3个 8bit 数字[0, 255]分别表示红色、绿色和蓝色的颜色分量,如(0,0,0) 表示黑色,(0,0,255) 表示红色,(255,255,255) 表示白色。
OpenCV使用BGR格式读取图像解码后,按B/G/R顺序存储为多维Numpy数组,而PIL、PyQt、Matplotlib等库使用的是RGB格式。
在数字图像处理中,可以根据需要对图像的颜色通道顺序进行转换,或将彩色图像转换为灰度图像和二值图像。
2.1.2 以Numpy数组表示数字图像
数字图像由像素点组成的矩阵来描述,以多维Numpy数组来表示和处理。
OpenCV在C++语言中定义的Mat类,是最基本的图像存储格式。在Python语言的API中则基于Numpy库来存储和处理多维数组,即以多维Numpy数组来存储和处理图像。在Python语言中,OpenCV对图像的任何操作,本质上都是对多维Numpy数组的操作和运算。
OpenCV中的二值图像和灰度图像用二维数组表示,数组的形状是(h,w),行与列分别表示图像的高度与宽度。数组中每个元素的值表示对应行/列像素点的灰度值。二值图像是特殊的灰度图像,像素值取0/1或0/255。
OpenCV中的彩色图像用三维数组(h,w,ch) 表示,ch=3表示通道数,数据组织形式如图2-1所示。数组中的每个元素对应像素点的某种颜色分量值。
OpenCV颜色通道的顺序为B/G/R,因此img[:,:,0]表示彩色图像img的B通道,img[:,:,1]表示G通道,img[:,:,2]表示R通道。
在OpenCV中,图像的数据结构是Numpy数组,因此Numpy数组的所有属性和操作方法都适用于OpenCV的图像对象。例如:
- img.ndim:查看图像的维数,彩色图像的维数为3,灰度图像的维数为2。
- img.shape:查看图像的形状(h,w,ch),即图像的行数(高度)、列数(宽度)和通道数。
- img.size:查看图像数组元素的总数,即图像像素的数量与通道数的乘积。
2.1.3 图像的数据类型
OpenCV函数对于数据类型有严格要求,错误的数据类型会导致语法错误。
OpenCV中图像数据类型的参数命名格式如下。
CV_{数字位数}{数字类型}C{通道数}
例如,CV_8UC3表示三通道8位无符号整型数据格式的矩阵。
OpenCV数据类型与Numpy数据类型的对照关系如表2-1所示。在图像处理中,最常用的数据类型是8位无符号整型数据CV_8U,对应的Numpy数据类型是uint8。
推荐在调用Numpy库函数时使用Numpy数据类型的名称,而在调用OpenCV函数时使用OpenCV数据类型的名称,以免发生错误。
使用img.dtype可以获得Numpy数组的数据类型,使用img.astype可以把图像的数据类型转换成指定的Numpy数据类型。
【例程0201】图像属性与数据类型转换
本例程使用Numpy数组的操作方法,获取图像属性和数据格式。
# 【0201】图像属性与数据类型转换
import cv2 as cv
import numpy as np
if __name__ == '__main__':
# 读取图像,支持 BMP、JPG、PNG、TIFF 等常用格式
filepath = "../images/imgLena.tif" # 读取文件的路径
img = cv.imread(filepath, flags=1) # flags=1 读取彩色图像(BGR)
gray = cv.imread(filepath, flags=0) # flags=0 读取为灰度图像
# 维数(Ndim)、形状(Shape)、元素总数(Size)、数据类型(Dtype)
print("Ndim of img(BGR): {}, gray: {}".format(img.ndim, gray.ndim))
print("Shape of img(BGR): {}, gray: {}".format(img.shape, gray.shape)) # number of rows, columns and channels
print("Size of img(BGR): {}, gray: {}".format(img.size, gray.size)) # size = rows × columns × channels
imgFloat = img.astype(np.float32) / 255
print("Dtype of img(BGR): {}, gray: {}".format(img.dtype, gray.dtype)) # uint8
print("Dtype of imgFloat: {}".format(imgFloat.dtype)) # float32
运行结果:
Ndim of img(BGR): 3, gray: 2
Shape of img(BGR): (512, 512, 3), gray: (512, 512)
Size of img(BGR): 786432, gray: 262144
Dtype of img(BGR): uint8, gray: uint8
Dtype of imgFloat: float32
程序说明:
(1) 彩色图像是三维Numpy数组,灰度图像是二维Numpy数组。因此,相同尺寸的彩色图像与灰度图像的像素数量相同,但数组元素的数量不同。
(2) 彩色图像的形状为(h, w, 3),灰度图像的形状为(h, w)。在查看图像高度和宽度时,推荐使用h, w=img.shape[:2],不推荐使用h, w=img.shape。
本书京东优惠购书链接:https://item.jd.com/14098452.html
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/133561857)
Copyright 2023 youcans, XUPT
Crated:2023-10-05
欢迎关注本书CSDN独家连载专栏
《数字图像处理-OpenCV/Python》连载: https://blog.csdn.net/youcans/category_12418787.html
文章评论