• OpenCV-Python学习(4)—— OpenCV 图像对象的创建与赋值


    1. 学习目标

    1. 图像对象的属性;
    2. 图像对象的创建与赋值。

    2. 图像对象的属性

    1. 通过 image.shape 获取图像的宽、高、通道数;
    2. 通过 image.dtype 获取图像数据类型;
    3. 通过 image.size 获取图像的像素总数。

    3. 代码演示

    1. 默认使用三通道读取图片;
    2. 获取图片的宽、高、通道数;
    3. 三通道模式下图像的像素总数;
    4. 图像的数据类型;
    5. 使用灰度模式读取图片;
    6. 重复第二步到第四步的打印。
    import cv2 as cv
    
    def get_image_shape():
      # 彩色模式读取(三通道)
      image = cv.imread("./images/butterfly.jpg")
      print('shape:', image.shape)
      print('size:', image.size)
      print('dtype:', image.dtype)
      # 灰度模式读取(单通道)
      gary_image = cv.imread("./images/butterfly.jpg",0)
      print('shape:', gary_image.shape)
      print('size:', gary_image.size)
      print('dtype:', gary_image.dtype)
    
    if __name__ == "__main__":
      get_image_shape()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4. 演示结果

    在这里插入图片描述

    5. OpenCV 和 NumPy 的关系

    1. OpenCV-Python 中一切图像数据皆 numpy.array;
    2. 创建图像就是创建 numpy.array。

    6. NumPy 数据包函数

    1. 在 OpenCV 中 NumPy 的常用函数
    函数名说明
    numpy.array最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
    numpy.zeros创建指定大小的数组,数组元素以 0 来填充。
    numpy.zeros_like输出为形状和输入的numpy.array一致的矩阵,数组元素以 0 来填充。
    numpy.asarray从已有的数组创建数组,numpy.asarray 类似 numpy.array,但 numpy.asarray 参数只有三个,比 numpy.array 少两个。
    numpy.copy返回给定 numpy.array 的深拷贝。
    numpy.reshape不改变数据的条件下修改形状。

    7. OpenCV 中 NumPy 的常用函数的解释

    7.1 numpy.array
    7.1.1 实例
    numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
    
    • 1
    7.1.2 参数说明
    名称说明
    object数组或嵌套的数列。
    dtype数组元素的数据类型,可选。
    copy对象是否需要复制,可选。
    order创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)。
    subok默认返回一个与基类类型一致的数组。
    ndmin指定生成数组的最小维度。
    7.2 numpy.zeros
    7.2.1 实例
    numpy.zeros(shape, dtype = float, order = 'C')
    
    • 1
    7.2.2 参数说明
    名称说明
    shape数组形状。
    dtype数据类型,可选。
    order可选,‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘k’ – 元素在内存中的出现顺序。
    7.3 numpy.zeros_like
    7.3.1 实例
    numpy.zeros_like(a, dtype = None, order = 'K', subok=Ture)
    
    • 1
    7.3.2 参数说明
    名称说明
    a任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组。
    dtype数据类型,可选。
    order可选,‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘k’ – 元素在内存中的出现顺序。
    subok如果是True,新创建的数组使用a的子类类型。
    7.4 numpy.asarray
    7.4.1 实例
    numpy.asarray(a, dtype = None, order = None)
    
    • 1
    7.4.2 参数说明
    名称说明
    a任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组。
    dtype数据类型,可选。
    order可选,‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘k’ – 元素在内存中的出现顺序。
    7.5 numpy.copy
    7.5.1 实例
    numpy.copy(a, order=‘K’)
    
    • 1
    7.5.2 参数说明
    名称说明
    a任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组。
    order可选,‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘k’ – 元素在内存中的出现顺序。
    7.6 numpy.reshape
    7.6.1 实例
    numpy.reshape(a, newshape, order='C')
    
    • 1
    7.6.2 参数说明
    名称说明
    a任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组。
    newshape整数或者整数数组,新的形状应当兼容原有形状。
    order可选,‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘k’ – 元素在内存中的出现顺序。

    8. 创建图像

    8.1 创建图像最常用的函数
    函数名说明
    numpy.zeros创建一个黑色背景图像。
    numpy.zeros_like创建一个与输入图像大小一致的黑色背景图像。
    numpy.ones创建一个全部像素值是1的图像。
    8.2 图像赋值
    8.2.1 创建图像
    1. 图像赋值就是给 numpy array 数组赋值。
    2. 创建一个 500*500 的三通道的黑色图片
    image = np.zeros((500,500,3))
    
    • 1
    1. 创建一个 500*500 的三通道的白色图片
    image = np.zeros((500,500,3))
    image[:] = 255
    
    • 1
    • 2
    1. 创建一个 500*500 的三通道的蓝色图片
    image = np.zeros((500,500,3))
    image[:] = (255,0,0)
    
    • 1
    • 2
    8.2.2 创建图像代码
    1. 创建一个500*500的三通道黑色图像;
    2. 深度拷贝一个numpy array;
    3. 然后赋值为255(白色);
    4. 深度拷贝一个numpy array;
    5. 然后赋值为 (255,0,0)(蓝色)。
    import cv2 as cv
    import numpy as np
    
    def create_image():
      # 创建一个500*500的三通道黑色图像
      image = np.zeros((500,500,3))
      cv.imshow("zeros", image)
      # 创建一个500*500的三通道白色图像
      white_image = np.copy(image)
      white_image[:] = 255
      cv.imshow("white_image", white_image)
      # 创建一个500*500的三通道蓝色图像
      blue_image = np.copy(image)
      blue_image[:] = (255,0,0)
      cv.imshow("blue_image", blue_image)
      cv.waitKey(0)
      cv.destroyAllWindows()
    
    if __name__ == "__main__":
      create_image()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    8.2.3 演示结果

    在这里插入图片描述

    8.2.4 创建上半蓝色下半红色图像演示代码
    import cv2 as cv
    import numpy as np
    
    def create_many_color():
      image = np.zeros((300,300,3))
      image[0:150] = (255,0,0)
      image[150:300] = (0,0,255)
      cv.imshow("image", image)
      cv.waitKey(0)
      cv.destroyAllWindows()
    
    if __name__ == "__main__":
      create_many_color()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    8.2.5 创建上半蓝色下半红色图像演示结果

    在这里插入图片描述

    9. 总结

    1. OpenCV-Python 中一切图像数据皆 numpy.array;
    2. 创建图像就是创建 numpy.array;
    3. OpenCV-Python 支持的常用数据类型:np.uint8、np.float32、np.int32、np.int64。
  • 相关阅读:
    2022华为杯研究生数学建模解题思路和代码思路
    1、服务的注册与发现-Eureka
    SpringBoot配置外部Tomcat项目启动流程源码分析(上)
    2023湖南省赛游记/题解
    从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 编写服务器
    java计算机毕业设计山西农谷企业产品推广展网源码+系统+数据库+lw文档+mybatis+运行部署
    刷题记录:HDU - 3001Travelling
    Centos7 yum方式安装mysql8
    自动化工具-文件清单对比
    为什么C++11要搞出一个nullptr?nullptr存在的意义是是什么?
  • 原文地址:https://blog.csdn.net/m0_38082783/article/details/127123068