文章目录
改变颜色空间
1. 转换颜色空间 cv2.cvtColor()
OpenCV中提供了100多种颜色空间,其实我们常用的也就那么三个,RGB、HSV、灰度图,HSV其实是一个用来描述颜色的很好的颜色空间,具体的原理请百度,转换颜色空间的方法就是cv2.cvtColor()
,代码如下:
# 所有的颜色空间
# color_space = [i for i in dir(cv2) if i.startswith("COLOR_")]
# print(color_space)
img = cv2.imread("bear.jpg")
img_hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
2. 物体跟踪 cv2.inRange()
OpenCV官方教程中提供了以下的例子,用来在视频中实时地追踪指定颜色的物体(代码里是蓝色),方法就是上面讲到的HSV颜色空间,首先你需要找到你要追踪的颜色的下界和上界,然后利用cv2.inRange()
方法得到一张mask图片,再用mask和每一帧进行按位与操作即可,代码如下:
def object_tracking():
"""
跟踪视频中的蓝色物体(其他颜色均可)
:return:
"""
cap = cv2.VideoCapture(0)
while True:
# get each frame
ret, frame = cap.read()
if not ret:
break
if ret:
# convert each BGR frame to HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_RGB2HSV)
# define range of blue color in HSV
lower_blue = np.array([110, 50, 50])
upper_blue = np.array([130, 255, 255])
# generate a mask img w.r.t the color defined above
# hence, we only get some blue colors
mask = cv2.inRange(hsv, lower_blue, upper_blue)
res = cv2.bitwise_and(frame, frame, mask=mask)
cv2.imshow('frame', frame)
cv2.imshow('mask', mask)
cv2.imshow('res', res)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
效果如下:
当然,你也可以换一个颜色,需要注意的是,OpenCV中HSV空间三个量依次对应的范围是0-179,0-255,0-255,如果用其他工具转换时需要变换到该范围下对应的值,也可以通过下列的示例代码进行转换:
green = np.uint8([[[0,255,0 ]]])
hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print(hsv_green)
[[[ 60 255 255]]]
图像的阈值处理
1. 简单阈值处理 cv2.threshold()
所谓阈值处理,就是给定一个阈值,当像素值比指定阈值大或小时做相关的操作。这个字念yu,不是fa,方法签名为:cv2.threshold(src,thresh,maxval,type,dst=None)
,需要将的是OpenCV中提供的几种type:
- cv2.THRESH_BINARY:若像素值大于阈值,则置为maxval;否则置0
- cv2.THRESH_BINARY_INV:THRESH_BINARY的反转
- cv2.THRESH_TRUNC:若像素值大于阈值,则置为阈值;否则不变
- cv2.THRESH_TOZERO:小于阈值的部分置为0;其他不变
- cv2.THRESH_TO