• 《数字图像处理-OpenCV/Python》连载(10)图像属性与数据类型


    《数字图像处理-OpenCV/Python》连载(10)图像属性与数据类型


    本书京东优惠购书链接: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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    运行结果:

    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
    • 2
    • 3
    • 4
    • 5

    程序说明:
    (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

  • 相关阅读:
    java for循环嵌套示例分享
    【juc】countdownlatch实现游戏进度
    网络安全设备默认密码
    shell编程01_Shell基础
    并查集专题
    dragonfly数据库
    C# 异步编程async/await
    MySQL的21个SQL经验
    408考研科目《数据结构》第三章第三节:特殊矩阵的压缩存储
    DAY38:内网信息搜集
  • 原文地址:https://blog.csdn.net/youcans/article/details/133561857