最常见的色彩空间就是RGB, 人眼也是基于RGB的色彩空间去分辨颜色的.
OpenCV默认使用的是BGR. BGR和RGB色彩空间的区别在于图片在色彩通道上的排列顺序不同.
显示图片的时候需要注意适配图片的色彩空间和显示环境的色彩空间.比如传入的图片是BGR色彩空间, 显示环境是RBG空间, 就会出现颜色混乱的情况.
RGBA中的A指的是透明度通道!
为什么要使用HSV?
方便OpenCV做图像处理.比如根据hue的值就可以判断背景颜色.
HSL和HSV差不多.
Hue: 色相
Saturation: 饱和度
Lightness: 亮度
H指的是色相(Hue),就是颜色名称,例如“红色”、“蓝色”;
S指的是饱和度(Saturation),即颜色的纯度;
L(Lightness)和B(Brightness)是明度,颜色的明亮程度.
在原理和表现上,HSL和HSB中的H(色相)完全一致,但二者的S(饱和度)不一样,L和B(明度)也不一样:
(1)HSL中的S:可以理解成稀释
10ml纯红色液体,饱和度为100%。加入1L纯净水,颜色就没那么红了,那么饱和度也下降了。
(2)HSV中的S:可以理解成混合
10ml纯红色液体,饱和度为100%。加入白色的液体混合在一起后,饱和度下降了。
YUV,是一种颜色编码方法。常使用在各个视频处理组件中。 YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。
“Y”表示明亮度(Luminance或Luma),也就是灰阶值,“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
Y’UV的发明是由于彩色电视与黑白电视的过渡时期。
Y’UV最大的优点在于只需占用极少的带宽。
src: 输入图像
code: 颜色空间转换代码(A指的是透明度)
dst: 输出与src相同大小和深度的图像
dstCn: 目标图像的通道数,如果参数为0,则通道的数量自动从src和code派生
将trackbar与颜色空间转换结合实现对应的颜色转换代码:
# 关键API cv2.cvtColor
import cv2
def callback(value):
pass
cv2.namedWindow('color', cv2.WINDOW_NORMAL)
cv2.resizeWindow('color', 640, 480)
# 读取照片, OpenCV读进来的图片默认是BGR的色彩空间.
img = cv2.imread('./cat.jpeg')
# 定义颜色空间转化列表
color_spaces = [
# 所有颜色空间的转化都是COLOR开头
cv2.COLOR_BGR2RGBA, cv2.COLOR_BGR2BGRA,
cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2HSV,
cv2.COLOR_BGR2YUV
]
# 设置trackbar
cv2.createTrackbar('trackbar', 'color', 0, 4, callback)
while True:
# 获取trarckbar的值
index =cv2.getTrackbarPos('trackbar', 'color')
# 进行颜色空间转换
cvt_img = cv2.cvtColor(img, color_spaces[index])
cv2.imshow('color', cvt_img)
key = cv2.waitKey(10)
if key == ord('q'):
break
cv2.destroyAllWindows()
Mat是OpenCV在C++语言中用来表示图像数据的一种数据结构,C++中是用mat来保存图片.在python中转化为numpy的ndarray.
在python中Mat数据对应numpy的ndarray, 使用numpy提供的深浅拷贝方法即可实现Mat的拷贝.
numpy的深浅拷贝的区别:
浅拷贝view( ):B复制A,A改变,B改变
深拷贝copy( ):B复制A,A改变,B改变
# 因为python中图片数据已经包装成ndarray了, 所以对mat的深浅拷贝,其实就是对ndarray深浅拷贝.
import cv2
import numpy as np
cv2.namedWindow('img',cv2.WINDOW_NORMAL)
# cv2.resizeWindow('img',560,720)
img = cv2.imread('./cat.jpeg')
# 浅拷贝.
img2 = img.view()
# 深拷贝
img3 = img.copy()
# 对原始图片某个区域进行变红操作,看看img2和img3的变化
img[10:100, 10: 100] = [0, 0, 255]
# 竖着排
# cv2.imshow('img', np.vstack((img, img2, img3)))
# 横着排
cv2.imshow('img', np.hstack((img, img2, img3)))
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV中的Mat在python中已经转化为ndarray, 通过ndarray的属性即可访问Mat图像的属性
import cv2
import numpy as np
img = cv2.imread('cat.jpeg')
#shape属性中包括了三个信息
#高度,长度 和 通道数
print(img.shape)
#图像占用多大空间
#高度 * 长度 * 通道数
print(img.size)
#图像中每个元素的位深
print(img.dtype)
cv2.split(m[, mv]) 分割图像的通道
merge(mv[, dst]) 融合多个通道
# 图像的分割与融合
import cv2
import numpy as np
# 行,宽,通道数:BGR的通道数为3,全黑图片
img = np.zeros((200, 200, 3), np.uint8)
# 分割通道
b, g, r = cv2.split(img)
# 分别展示b,g,r
# cv2.imshow('b',b)
# cv2.imshow('g',g)
# cv2.imshow('r',r)
# print('b:', b)
# 修改一些颜色
b[10:100, 10:100] = 255
g[10:100, 10: 100] = 255
# 合并通道
img2 = cv2.merge((b, g, r))
# b,g全黑的图片里指定区域变白色
cv2.imshow('img', np.hstack((b, g)))
# img2的的颜色组成b,g指定区域为255,r为0
cv2.imshow('img2', np.hstack((img, img2)))
cv2.waitKey(0)
cv2.destroyAllWindows()
附OpenCV目录:OpenCV总目录学习笔记