OpenCV初尝试2——颜色空间

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中记录了图片的维数、大小、数据类型等数据。

OpenCV初尝试2——颜色空间

  • 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()

让我们暂时结束色彩空间部分。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2022年4月2日
下一篇 2022年4月2日

相关推荐