• 跟我学Python图像处理丨获取图像属性、兴趣ROI区域及通道处理


    摘要:本篇文章主要讲解Python调用OpenCV获取图像属性,截取感兴趣ROI区域,处理图像通道。

    本文分享自华为云社区《[Python图像处理] 三.获取图像属性、兴趣ROI区域及通道处理 | 【生长吧!Python】》,作者: eastmount 。

    一.获取图像属性

    1.形状-shape

    通过shape关键字获取图像的形状,返回包含行数、列数、通道数的元祖。其中灰度图像返回行数和列数,彩色图像返回行数、列数和通道数。如下图所示:

    # -*- coding:utf-8 -*-
    import cv2
    import numpy
    
    #读取图片
    img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
    
    #获取图像形状
    print(img.shape)
    
    #显示图像
    cv2.imshow("Demo", img)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    输出结果如下图所示:(445L, 670L, 3L),该图共445行、670列像素,3个通道。

    2.像素数目-size

    通过size关键字获取图像的像素数目,其中灰度图像返回行数 * 列数,彩色图像返回行数 * 列数 * 通道数。代码如下:

    # -*- coding:utf-8 -*-
    import cv2
    import numpy
    
    #读取图片
    img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
    
    #获取图像形状
    print(img.shape)
    
    #获取像素数目
    print(img.size)

    输出结果:

    (445L, 670L, 3L)
    894450

    3.图像类型-dtype

    通过dtype关键字获取图像的数据类型,通常返回uint8。代码如下:

    # -*- coding:utf-8 -*-
    import cv2
    import numpy
    
    #读取图片
    img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
    
    #获取图像形状
    print(img.shape)
    
    #获取像素数目
    print(img.size)
    
    #获取图像类型
    print(img.dtype)

    输出结果:

    (445L, 670L, 3L)
    894450
    uint8

    二.获取感兴趣ROI区域

    ROI(Region of Interest)表示感兴趣区域。它是指从被处理图像以方框、圆形、椭圆、不规则多边形等方式勾勒出需要处理的区域。可以通过各种算子(Operator)和函数求得感兴趣ROI区域,并进行图像的下一步处理,被广泛应用于热点地图、人脸识别、图像分割等领域。

    通过像素矩阵可以直接获取ROI区域,如img[200:400, 200:400]。

    代码如下:

    # -*- coding:utf-8 -*-
    import cv2
    import numpy as np
    
    #读取图片
    img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
    
    #定义200*100矩阵 3对应BGR
    face = np.ones((200, 100, 3))
    
    #显示原始图像
    cv2.imshow("Demo", img)
    
    #显示ROI区域
    face = img[200:400, 200:300]
    cv2.imshow("face", face)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    输出结果如下图所示:

    下面将提取的ROI图像进行融合实验,代码如下:

    # -*- coding:utf-8 -*-
    import cv2
    import numpy as np
    
    #读取图片
    img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
    
    #定义300*100矩阵 3对应BGR
    face = np.ones((200, 200, 3))
    
    #显示原始图像
    cv2.imshow("Demo", img)
    
    #显示ROI区域
    face = img[100:300, 150:350]
    img[0:200,0:200] = face
    cv2.imshow("face", img)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    将提取的头部融合至图像左上角部分,如下图所示:

    如果想将两张图像进行融合,只需再读取一张图像即可,方法原理类似。 实现代码如下:

    # -*- coding:utf-8 -*-
    import cv2
    import numpy as np
    
    #读取图片
    img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
    test = cv2.imread("test3.jpg", cv2.IMREAD_UNCHANGED)
    
    #定义300*100矩阵 3对应BGR
    face = np.ones((200, 200, 3))
    
    #显示原始图像
    cv2.imshow("Demo", img)
    
    #显示ROI区域
    face = img[100:300, 150:350]
    test[400:600,400:600] = face
    cv2.imshow("Pic", test)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    输出结果如下图所示:

    三.图像通道处理

    1.通道拆分

    OpenCV读取的彩色图像由B、G、R三原色组成,可以通过下面代码获取不同的通道。

    b = img[:, :, 0]
    g = img[:, :, 1]
    r = img[:, :, 2]

    也可以使用split()函数拆分通道,下面是拆分不同通道再显示的代码。

    # -*- coding:utf-8 -*-
    import cv2
    import numpy as np
    
    #读取图片
    img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
    
    #拆分通道
    b, g, r = cv2.split(img)
    
    #显示原始图像
    cv2.imshow("B", b)
    cv2.imshow("G", g)
    cv2.imshow("R", r)
     
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    输出结果如下图所示:

    也可以获取不同的通道,核心代码如下所示: b = cv2.split(a)[0] g = cv2.split(a)[1] r = cv2.split(a)[2]

    2.通道合并

    图像通道合并主要调用merge()函数实现,核心代码如下:

    m = cv2.merge([b, g, r])

    # -*- coding:utf-8 -*-
    import cv2
    import numpy as np
    
    #读取图片
    img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
    
    #拆分通道
    b, g, r = cv2.split(img)
    
    #合并通道
    m = cv2.merge([b, g, r])
    cv2.imshow("Merge", m)
     
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    输出结果如下:

    注意,如果是合并[r,g,b]三通道,则显示如下所示,因OpenCV是按照BGR进行读取的。

    b, g, r = cv2.split(img)
    m = cv2.merge([r, g, b])
    cv2.imshow(“Merge”, m)

    同时,可以提取图像的不同颜色,提取B颜色通道,G、B通道设置为0,则显示蓝色。代码如下所示:

    # -*- coding:utf-8 -*-
    import cv2
    import numpy as np
    
    #读取图片
    img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
    rows, cols, chn = img.shape
    
    #拆分通道
    b = cv2.split(img)[0]
    g = np.zeros((rows,cols),dtype=img.dtype)
    r = np.zeros((rows,cols),dtype=img.dtype)
    
    #合并通道
    m = cv2.merge([b, g, r])
    cv2.imshow("Merge", m)
     
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    蓝色通道输出结果如下所示:

    绿色通道核心代码及输出结果如下所示:

    rows, cols, chn = img.shape
    b = np.zeros((rows,cols),dtype=img.dtype)
    g = cv2.split(img)[1]
    r = np.zeros((rows,cols),dtype=img.dtype)
    m = cv2.merge([b, g, r])

    红色通道修改方法与上面类似。希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。

    该系列在github所有源代码:

     

    点击关注,第一时间了解华为云新鲜技术~

  • 相关阅读:
    两个类重复属性值复制
    IIS请求筛选模块被配置为拒绝超过请求内容长度的请求
    System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本问题
    Oracle 查询表中字段里数据是否有重复
    JS 中如何将<br/> 替换成 /n
    JS 验证数组中是否包含重复元素
    [C#] 使用NPOI将Datatable保存到Excel
    [C#] 将 List 转 DataTable
    [C#] 图文解说调用WebServer实例
    bzoj 3489: A simple rmq problem
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/16223660.html
Copyright © 2020-2023  润新知