1.OpenCV的色彩空间
1.1RGB
最常见的色彩空间就是RGB ,人眼也是基于RGB的色彩空间去分辨 颜色的.
OpenCV默认使用的是BGR. BGR和RGB色彩空间的区别在于图片在色彩通道上的排列顺序不同.
每一个像素由3个通道的数据共同组成,我们需要注意这一点,编程的时候很容易出问题。
1. 2 HSV
OpenCV用的最多的色彩空间是HSV.
Hue: 色相, 即色彩, 如红色, 蓝色. 用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°
Saturation: 饱和度, 表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
Value: 明度. 明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)
使用HSV方便OpenCV做图像处理.比如根据hue的值就可以判断背景颜色.
1.3YUV
YUV,是一种颜色编码方法。常使用在各个视频处理组件中。 YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。
“Y”表示明亮度(Luminance或Luma),也就是灰阶值,“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
Y'UV的发明是由于彩色电视与黑白电视的过渡时期。
Y'UV最大的优点在于只需占用极少的带宽。
-
4:4:4表示完全取样。
-
4:2:2表示2:1的水平取样,垂直完全采样。
-
4:2:0表示2:1的水平取样,垂直2:1采样。
-
4:1:1表示4:1的水平取样,垂直完全采样。
2. 色彩空间的转换
色彩空间的转换使用的api是cvtColor(img, colorspace)
参数是输入图像,颜色空间转换的枚举值,返回值是转换之后的图像数据。
colorspace:
# 常见的颜色空间转换 A是透明度
cv2.COLOR_BGR2RGBA,cv2.COLOR_BGR2BGRA,
cv2.COLOR_BGR2GRAY,cv2.COLOR_BGR2HSV,
cv2.COLOR_BGR2YUV
3.Mat
Mat是OpenCV在C++语言中用来表示图像数据的一种数据结构.在python中转化为numpy的ndarray. 数据结构如下:
3.1Mat的浅拷贝和深拷贝
#浅拷贝
img2 = img.view()#深拷贝
img3 = img.copy()
3.2通道的分离与合并
-
split(mat)分割图像的通道 使用如下
-
b,g,r = cv2.split(img)
-
merge((ch1,ch2, ch3)) 融合多个通道 返回值是融合之后的照片数据Mat
4.图形绘制
4.1直线
line(img, pt1, pt2, color, thickness, lineType, shift) 画直线
img: 在哪个图像上画线
pt1, pt2: 开始点, 结束点. 指定线的开始与结束位置 Point类型
color: 颜色
thickness: 线宽
lineType: 线型.线型为-1, 4, 8, 16, 默认为8 (-1是填充 在画其他图形可以试一下)
shift: 坐标缩放比例.(一般选择默认值)
示例代码:
img = np.zeros((480, 640, 3), np.uint8)
# cv2.line(img, (10, 20), (300, 400), (0, 0, 255), 5, 4)
# cv2.line(img, (80, 100), (380, 480), (0, 0, 255), 5, 16)
4.2.矩形
rectangle() 参数与直线的一样 画矩形
示例代码:
# 画矩形 lineType为-1就是填充
# cv2.rectangle(img, (10,10), (100, 100), (0, 0, 255), -1)
4.3圆
circle(img, center, radius, color[, thickness[, lineType[], shift]]]) 中括号内参数表示可选参数.就是确定圆心,半径就可以了。
案列代码:
# 画圆
# cv2.circle(img, (320, 240), 100, (0, 0, 255))
# cv2.circle(img, (320, 240), 5, (0, 0, 255), -1)
4.4.椭圆
ellipse(img, 中心点, 长宽的一半, 角度, 从哪个角度开始, 从哪个角度结束,color, thickness, lineType, shift )
角度:椭圆角度
从哪个角度开始, 从哪个角度结束:意味着可以不用画整个椭圆
案列代码:
# 画椭圆
# cv2.ellipse(img, (320, 240), (100, 50), 15, 0, 360, (0, 0, 255), -1)
4.5.多边形
-
polylines(img, [pts] ,isClosed, color[, thickness[, lineType[, shift]]]) 画多边形
-
pts是点集,是int32位及以上的 isClosed是否闭环
-
注意:[pts]这个参数 3维的
-
fillPoly 填充多边形
-
#填充多边形
# cv2.fillPoly(img, [pts], (255, 255, 0))
4..6绘制文本
-
putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]]) 绘制文本
-
text 要绘制的文本
-
org 文本在图片中的左下角坐标
-
fontFace 字体类型即字体
-
fontScale 字体大小
-