OpenCV-Python图像颜色空间转换和图像的创建

图像颜色空间转换

在使用OpenCV读去图像文件时,我们得到的图像通道顺序是BGR,每个通道的数值是0~255之间。由于对图像操作的需要,我们会将图像进行颜色空间转换处理,通常是将图像从RGB颜色空间转换到其他颜色空间,比如HSV颜色空间。这个过程需要用到两个opencv函数。

  1. 图像读取函数cv2.imread()
    这个函数有两个参数,第一个是图像文件名,即输入图像的文件所在路径和名称;第二个参数是flag,指定读取图像文件的类型,常见的三种读取图像类型的标志为:
    (1) cv2.IMREAD_COLOR: 默认参数,读入彩色图像,忽略alpha通道,数字1;
    (2) cv2.IMREAD_GRAYSCALE:读入灰度图片,数字0;
    (3) cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道,数字-1

  2. 转换图像的颜色空间函数cv2.cvtColor()
    这个函数同样是两个参数,一个是读入的图像image,一个是指定图像要转换的类型,比如灰度类型,HSV颜色空间,BGR转RGB通道等

具体实例代码。
以下面图片读取为例:


实验图片
# -*-coding:utf-8-*-
"""
File Name: color_space_conversion.py
Program IDE: PyCharm
Create File By Author: Hong
"""
import cv2 as cv


def color_space_conversion(image_path: str):
    img = cv.imread(image_path)  # BGR读取图像,0~255,苹果手机上颜色是用sRGB,DCI-P3
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)  # 转为灰度图
    hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)  # 转为HSV颜色空间,H 0~180, S,V 0~255
    bgr = cv.cvtColor(img, cv.COLOR_HSV2BGR)

    cv.imshow('img', img)
    cv.imshow('gray', gray)
    cv.imshow('hsv', hsv)
    cv.imshow('bgr', bgr)
    cv.waitKey(0)
    cv.destroyAllWindows()


if __name__ == '__main__':
    path = 'images/2.png'
    color_space_conversion(path) 

图像转换展示的效果分别是:


图像转换结果

图像的创建和复制

在opencv-python中创建图像和复制图像都是numpy数组的操作,本文介绍两种创建图像和两种复制图像的方法。两种创建图像的方式是:

  1. 使用np.zeros_like()函数
    该函数是将已读取的图片image作为参数传入函数,就可以创建一个和image形状相同的图像,但是都是0像素值。

  2. 使用np.zeros()函数
    该函数要传入需要创建图像的形状,并且需要指定数组的数据类型,默认值是np.float64

在复制图像时,本文也给出两种实现方法:

  1. 使用np.copy()函数
    将需要复制的图像image传入该函数,会返回一个numpy数组也即是图像,改变该返回值图像的内容,原图像不会改变。

  2. 使用直接复制的方法
    可以采用直接复制的方法将图像image复制给新的变量实现图像的复制,但是这种复制在改变新的图像时,原来的图像也会随着改变

同样使用上面的图像案例,具体代码如下:

# -*-coding:utf-8-*-
"""
File Name: color_space_conversion.py
Program IDE: PyCharm
Create File By Author: Hong
"""
import cv2 as cv
import numpy as np


def numpy_img(image_path: str):
    """
    在opencv-python中所有的图像都是numpy数组,
    可以使用numpy操作图像,如生成图像、修改图像、复制图像
    :param image_path: 传入图像文件路径
    :return: 没有返回值
    """
    # cv2.IMREAD_COLOR: 默认参数,读入彩色图像,忽略alpha通道,数字1;
    # cv2.IMREAD_GRAYSCALE:读入灰度图片,数字0;
    # cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道,数字-1
    img_color = cv.imread(image_path, cv.IMREAD_COLOR)
    img_gray = cv.imread(image_path, cv.IMREAD_GRAYSCALE)
    img_unchanged = cv.imread(image_path, cv.IMREAD_UNCHANGED)
    print(img_color.shape)  # H, W, C  (888,500,3)
    print(img_gray.shape)  # H, W  (888, 500)
    print(img_unchanged.shape)  # H, W, C (888, 500, 4)

    h, w, c = img_color.shape
    roi = img_color[190:400, 150:380, :]  # 截取img_color图像的一部分, 第一维度指定高的范围,第二维度指定宽的范围,第三维度是通道
    # 方法1 创建一个和img_color形状相同的空白图片
    # blank = np.zeros_like(img_color)
    # 方法2 使用h w c和数据类型,创建一个空白图像
    blank = np.zeros((h, w, c), dtype=np.uint8)
    # blank[190:400, 150:380, :] = img_color[190:400, 150:380, :]
    # print(blank)
    # 方法1 图像copy, 改变blank,不会改变img_color
    # blank = np.copy(img_color)
    # 方法2 图像赋值, 共用同一个数据,改变blank,就会改变img_color
    # blank = img_color
    cv.imshow('roi', roi)
    cv.imshow('blank', blank)

    cv.imshow('img_color', img_color)
    # cv.imshow('img_gray', img_gray)
    # cv.imshow('img_unchanged', img_unchanged)
    cv.waitKey(0)
    cv.destroyAllWindows()


if __name__ == '__main__':
    path = 'images/2.png'
    numpy_img(path)

图像复制的效果展示:


图像创建结果

更多关于OpenCV和深度学习的精彩内容,请关注微信公众号 “AI与计算机视觉”

你可能感兴趣的:(OpenCV-Python图像颜色空间转换和图像的创建)