2 颜色空间
不多哔哔了(也哔不出什么话暖场),直接开始吧。
2.1 TrackBar控件
- 该控件可对颜色进行进度条式拖动(差不多类似的意思吧)
- cv2.createTrackbar(trackbarName, windowName, value, count, onChange):创建TrackBar控件,value为trackbar的默认值,count为bar的最大值,最小为0,onChange类似回调函数
- getTrackbarPos(trackbarName, windowName):获取TrackBar的当前值
#创建三原色的TrackBar
import cv2
import numpy as np
#创建窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse', 640, 480)
#定义回调函数
def callback(value):
pass
#创建trackbar
cv2.createTrackbar('R', 'trackbar', 0, 255, callback)
cv2.createTrackbar('G', 'trackbar', 0, 255, callback)
cv2.createTrackbar('B', 'trackbar', 0, 255, callback)
#创建一个纯黑背景图片,高度,宽度(与之前相反)
img = np.zeros((480, 640, 3), np.uint8)
while True:
#获取当前trackbar值
r = cv2.getTrackbarPos('R', 'trackbar')
g = cv2.getTrackbarPos('G', 'trackbar')
b = cv2.getTrackbarPos('B', 'trackbar')
#改变背景图颜色,取出第三个维度值,进行颜色通道替换
img[:] = [b, g, r]
cv2.imshow('trackbar', img)
key = cv2.waitKey(1)
if key == ord('q')
break
cv2.destroyAllWindows()
2.2 OpenCV的色彩空间
2.2.1 BGR和RGB
最常见的色彩空间就是RGB,人眼也是基于RGB色彩空间分辨颜色。
OpenCV默认使用的是BGR,区别在于图片在色彩通道上的排序不同。
2.2.2 HSV,HSL和YUV(了解即可)
2.2.2.1 HSV(HSB)
- OpenCV用得最多的色彩空间是HSV。
- Hue:色相,即色彩,用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。
- Saturation:饱和度,表示色彩接近光谱色的程度。可以看成是某种光谱色和白色混合的结果。取值范围为0%~100%,值越大,颜色越饱和。
- Value:明度,表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关,对于物色体,此值与物体的透射比或反射比有关。通常取值为0%(黑)~100%(白)。
2.2.2.2 HSL
- Hue:色相,与HSV的Hue完全一样。
- Saturation:饱和度
- Lightness:亮度
HSL在顶部是纯白的,不管是什么颜色。
与HSV的区别:
- S:HSL的饱和度可以看成是稀释程度,不加颜色混合。
- L:控制混入的黑白两种颜色。
2.2.2.3 YUV
是一种颜色编码的方式,常使用在各个视频处理组件中。YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。
YUV最大的有点在于只需占用极少的带宽。
- 4:4:4 表示完全取样
- 4:2:2 表示2:1的水平取样,垂直完全取样
- 4:2:0 表示2:1的水平取样,垂直2:1取样
- 4:1:1 表示4:1的水平取样,垂直完全取样
2.2.3 色彩空间的转换
- cv2.cvtColor(src, code[, dst[, dstCn]]):颜色转换的关键API
import cv2
def callback(value):
pass
cv2.namedWindow('color', cv2.WINDOW_NORMAL)
cv2.resizeWindow('color', 640,480)
img = cv2.imread('./img.jpg')
#常见的颜色空间转换,A为透明度,2 == to
color_spaces = [cv2.COLOR_BGR2RGBA, cv2.COLOR_BGR2BGRA, cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2HSV, cv2.COLOR_BGR2YUV]
cv2.createTrackbar('curcolor', 'color', 0, 4, callback)
while True:
index = cv2.getTrackbarPos('curcolor', '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()
2.3 OpenCV的重要数据结构——Mat
2.3.1 Mat介绍
Mat是OpenCV在C++语言中用来表示图像数据的一种数据结构。在Python中转化为numpy的ndarray。
- Mat由header和data组成,header中记录了图片的维数、大小、数据类型等数据。
- ndarray的四种常见属性:
- 1.img.size:元素的总个数
- 2.img.dtype
- 3.img.shape
- 4.img.ndim:维数
2.3.2 Mat拷贝
- 浅拷贝:指向同一个底层数据data,header不同
- 深拷贝:复制一份一模一样的数据,header和data都不同
import cv2
import numpy as np
img = cv2.imread('./img.jpg')
#浅拷贝
img2 = img.view()
#深拷贝
img3 = img.copy()
#该数据为了体现深浅拷贝的区别,改成红色
img[10:100, 10:100] = [0, 0, 255]
#cv2.imshow('img', img)
#cv2.imshow('img2', img2)
#cv2.imshow('img3', img3)
#一起显示,横向排版
cv2.imshow('img', np.hstack((img, img2, img3)))
cv2.waitKey(0)
cv2.destroyAllWindows()
2.3.3 通道的分离与合并
- cv2.split(mat[, mv]):分割图像的通道
- cv2.merge((ch1, ch2, ch3)):融合多个通道
#图像的分割与融合
import cv2
import numpy as np
img = np.zeros((480, 640, 3), np.uint8)
#分割通道
b, g, r = cv2.split(img)
#修改颜色
b[10:100, 10:100] = 255
g[10:100, 10:100] = 255
#合并通道,需要是元组
img2 = cv2.merge((b, g, r))
cv2.imshow('img', np.hstack((img, img2)))
cv2.waitKey(0)
cv2.destroyAllWindows()
颜色空间部分暂时告一段落吧。