颜色空间
色彩空间变换
- 人眼的色彩空间是RGB,OpenCV默认使用BGR
- OpenCV最常用的是HSV(Hue, Saturation, Value 色调,饱和度,明度)色彩空间。
- 视频为了节省存储,使用的是YUV
- 做移动端开发时,适配问题就需要根据手机屏幕色彩空间的不同来进行调整。
HSV
- Hue色相,是360度的一个扇面,不同度数对应不同色彩。Value,明度,即是圆柱体的高,越靠近圆柱体底部,越暗呈现黑色,越往上,越明,呈现白色。Saturation饱和度,是指从中心到边缘,越边缘颜色越纯,饱和度越高。
- 为什么要用HSV:RGB是物理上的颜色。HSV更像是画家画画。OpenCV更喜欢HSV,因为其可以对颜色色相做判断。而 RGB中每一种颜色都有,就不好判断。
HSL:L是Light亮度,HSL到最上面的时候就纯白了
YUV
- 这里的2可能是U也可能是V
像素访问
- 使用OpenCV在不同色彩空间之间进行转换
import cv2
def callback():
pass
cv2.namedWindow('color',cv2.WINDOW_NORMAL)
img = cv2.imread('pic/yy.jpeg')
colorspaces = [cv2.COLOR_BGR2RGBA,cv2.COLOR_BGR2BGRA,cv2.COLOR_BGR2GRAY,
cv2.COLOR_BGR2HSV_FULL,cv2.COLOR_BGR2YUV]
cv2.createTrackbar('curcolor','color',0,len(colorspaces),callback)
while True:
index = cv2.getTrackbarPos('curcolor','color')
#颜色空间转换API
cvt_img = cv2.cvtColor(img, colorspaces[index])
cv2.imshow('color', cvt_img)
key = cv2.waitKey(10)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
矩阵的运算
- OpenCV中用到的矩阵都要转换成Numpy数组
- 创建单元数组:identity() 是正方的 / eye() 可以是非正方,对角线元素为1
Numpy检索与赋值
- 通过[y,x]进行检索,下标从0开始
- 多维通道通过[y,x,channel]进行检索
import cv2
import numpy as np
img = np.zeros((480,640,3), np.uint8)
count = 0
while count < 200:
img[count, 100]=255 #img[count, 100, 2]=255就是一条红色的线了
count = count + 1
#显示为一条竖线,可以看出确实第一个变量是y轴的值
cv2.imshow('img',img)
key = cv2.waitKey(0) #让窗口一直显示
if key & 0xFF == ord('q'):
cv2.destoryAllWindows()
获取子矩阵 Region of Image(ROI)
- [y1:y2, x1:x2]
roi = img[100:400, 100:600]
roi[ : , : ] = [0, 0, 255] #就将图像变成一个全红的了 BGR
OpenCV最重要的结构体 Mat
- Mat的应用角度就是一个矩阵
- Mat的好处是直接可以使用Numpy对其进行访问,操作方便。
- Mat包含:Header -> data
- 有的时候需要深拷贝的,如你想要将这张图片拷贝下来,然后在拷贝的图片上进行修改,就需要深拷贝。这样就会将头部和数据都拷贝下来,否则的话只是拷贝一个头部,这样就可以保证性能。
- Mat的头部
Mat的深拷贝/浅拷贝
- 当拷贝的时候默认是浅拷贝。
Mat A
A = imread(file, IMREAD_COLOR)
Mat b(A)
- 深拷贝:copy()
访问Mat的属性
- 图像占用多大空间:高度 * 长度 * 通道数 size函数
- shape: 高度 长度 通道数
- img.dtype 图像每个元素的位深
通道的分割与合并
- split(mat)
- merge((ch1,ch2…))