• OpenCV学习(五)——图像基本操作(访问图像像素值、图像属性、感兴趣区域ROI和图像边框)


    5. 图像基本操作

    • 访问像素值并修改
    • 访问图像属性
    • 设置感兴趣区域(ROI)
    • 分割和合并图像

    5.1 访问像素值并修改

    访问像素值

    import cv2
    
    # 读取图像
    # img——>(h, w, c),c为通道数
    img = cv2.imread('lena.jpg')
    
    # 访问像素值
    px = img[100, 100]
    print("像素值:", px)
    # img——>(b, g, r)
    # 蓝色像素值——>对应通道b
    blue = img[100, 100, 0]
    print("蓝色像素值:", blue)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    请添加图片描述

    修改像素值

    img[100, 100] = [255,255,255]
    print(img[100,100])
    
    • 1
    • 2

    请添加图片描述
    简单访问每个像素值并修改比较缓慢,一般不使用。

    Numpy数组方法array.item()array.itemset()被认为更好,但是它们始终返回标量。

    更好的像素访问和编辑方法:

    # 访问蓝色像素值
    print(img.item(100, 100, 0))
    
    # 修改蓝色像素值
    img.itemset((100,100,0), 255)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    请添加图片描述

    修改B通道像素值为255,区间[200:400, 200:400]

    import cv2
    
    # 读取图像
    # img——>(h, w, c),c为通道数
    img = cv2.imread('lena.jpg')
    
    # 修改B通道像素值为255,区间[200:400, 200:400]
    for i in range(200, 400):
        for j in range(200, 400):
            img.itemset((i, j, 0), 255)
    
    # 显示图像
    cv2.imshow('image', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    请添加图片描述

    5.2 访问图像属性

    属性属性包括行数、列数和通道数,图像数据类型,像素数等。

    import cv2
    
    # 读取图像
    # img——>(h, w, c),c为通道数
    img = cv2.imread('lena.jpg')
    
    # 图像形状
    print('图像形状', img.shape)
    # 像素总数
    print('像素总数', img.size)
    
    # 图像数据类型
    print('图像数据类型', img.dtype)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    请添加图片描述

    5.2 图像感兴趣区域ROI

    对于人物图像,我们感兴趣的一般是人脸区域。使用Numpy索引再次获得ROI,并将脸复制到图像中的另一个区域:

    import cv2
    
    # 读取图像
    img = cv2.imread('lena.jpg')
    
    # 获取脸的区域
    face = img[200:400, 200:400]
    
    # 将脸复制到另一区域
    img[200:400, 0:200] = face
    
    # 显示图像
    cv2.imshow('image', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    请添加图片描述

    5.3 拆分和合并图像通道

    将图像的通道进行分离,并分开展示。同时实现OpenCV在一个窗口显示多张图像。

    import cv2
    import numpy as np
    
    # 读取图像
    img = cv2.imread('lena.jpg')
    
    # 分离通道
    b, g, r = cv2.split(img)
    
    # 合并通道
    img_m = cv2.merge((b, g, r))
    
    # 改变各通道图像的尺寸
    b = cv2.resize(b, (200, 200))
    g = cv2.resize(g, (200, 200))
    r = cv2.resize(r, (200, 200))
    img = cv2.resize(img, (200, 200))
    
    
    # 将单通道图像转换为3通道
    b = cv2.cvtColor(b, cv2.COLOR_GRAY2RGB)
    g = cv2.cvtColor(g, cv2.COLOR_GRAY2RGB)
    r = cv2.cvtColor(r, cv2.COLOR_GRAY2RGB)
    
    # 同一窗口显示多张图像
    # 拼接需要图像的形状及通道一样
    hmerge = np.hstack((b, g, r, img)) # 水平拼接
    vmerge = np.vstack((b, g, r)) # 垂直拼接
    
    # 显示图像
    cv2.imshow('image', hmerge)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    请添加图片描述

    5.4 为图像设置边框(填充)

    cv2.copyMakeBorder(src, top, bottom, left, right, borderType, dst=None, value=None)函数在卷积运算,零填充等方面有很多应用。

    • src:输入图像

    • top,bottom,left,right:边界宽度(以相应方向上的像素数为单位)

    • borderType:定义要添加哪种边框的标志,可以是以下类型

      • cv2.BORDER_CONSTANT :添加恒定的彩色边框
      • cv2.BORDER_REFLECT : 边框将是边框元素的镜像
      • cv2.BORDER_REPLICATE:最后一个元素被复制
      • cv2.BORDER_WRAP:包裹
    • dst:目标图像

    • value:边框的颜色

    import cv2
    import numpy as np
    
    # 读取图像
    img = cv2.imread('lena.jpg')
    img = cv2.resize(img, (200, 200))
    
    # 设置边框
    constant = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_CONSTANT)
    reflect = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_REFLECT)
    replicate = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_REPLICATE)
    wrap = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_WRAP)
    
    # 图像拼接,水平
    hmerge = np.hstack((constant, reflect, replicate, wrap)) # 水平拼接
    
    
    # 显示图像
    cv2.imshow('image', hmerge)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    请添加图片描述

  • 相关阅读:
    Python150题day07
    全志V853芯片 如何在Tina V85x平台切换sensor?
    常见网络编程面试题以及答案(网络面试30题)
    苹果开发者防关联开新号自查清单
    在 JavaScript 中访问对象属性的 3 种方法
    Spring Boot全面总结(超详细,建议收藏)
    JCE cannot authenticate the provider BC
    【每日一题Day327】LCP 50. 宝石补给 | 模拟
    设计模式之美——单一职责原则和开闭原则
    GPU -- 图形处理器(显卡)
  • 原文地址:https://blog.csdn.net/qq_38473254/article/details/134095141