图像颜色空间转换
在使用OpenCV读去图像文件时,我们得到的图像通道顺序是BGR,每个通道的数值是0~255之间。由于对图像操作的需要,我们会将图像进行颜色空间转换处理,通常是将图像从RGB颜色空间转换到其他颜色空间,比如HSV颜色空间。这个过程需要用到两个opencv函数。
图像读取函数
cv2.imread()
这个函数有两个参数,第一个是图像文件名,即输入图像的文件所在路径和名称;第二个参数是flag,指定读取图像文件的类型,常见的三种读取图像类型的标志为:
(1) cv2.IMREAD_COLOR: 默认参数,读入彩色图像,忽略alpha通道,数字1;
(2) cv2.IMREAD_GRAYSCALE:读入灰度图片,数字0;
(3) cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道,数字-1转换图像的颜色空间函数
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数组的操作,本文介绍两种创建图像和两种复制图像的方法。两种创建图像的方式是:
使用
np.zeros_like()
函数
该函数是将已读取的图片image作为参数传入函数,就可以创建一个和image形状相同的图像,但是都是0像素值。使用
np.zeros()
函数
该函数要传入需要创建图像的形状,并且需要指定数组的数据类型,默认值是np.float64
在复制图像时,本文也给出两种实现方法:
使用
np.copy()
函数
将需要复制的图像image传入该函数,会返回一个numpy数组也即是图像,改变该返回值图像的内容,原图像不会改变。使用直接复制的方法
可以采用直接复制的方法将图像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与计算机视觉”。