前言
这部分的内容是OpenCV 中的图像处理.这里做一些笔记进行记录。
正文
颜色空间转换
实时图像物体追踪
code
import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
ret = cap.set(3,640)
ret = cap.set(4,480)
# 定蓝色的阈值
# lower = np.array([110, 50, 50])
# upper = np.array([130, 255, 255])
#黄色-乒乓球
lower = np.array([20, 100, 100])
upper = np.array([30, 255, 255])
# 黑色
# lower_black = np.array([0, 0, 0])
# upper_black = np.array([180, 255, 30])
while True:
#获取每一帧
ret,frame = cap.read()
#换到HSV
hsv = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
#图像掩膜与其类似,用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。
#即检查数组元素是否在另外两个数组元素值之间。这里的数组通常也就是矩阵Mat或向量。请注意:该函数输出的dst是一幅二值化之后的图像。
#换到阈值构建掩模,//提取图像中在阈值中间的部分
mask = cv.inRange(hsv,lower,upper)
res = cv.bitwise_and(frame,frame,mask=mask)
#显示图像
cv.imshow('frame',frame)
cv.moveWindow('frame',x=0,y=0)
cv.imshow('mask',mask)
cv.moveWindow('mask',x=frame.shape[1],y=0)
cv.imshow('res',res)
cv.moveWindow('res', y=frame.shape[0], x=0) # 下边
k = cv.waitKey(1) # & 0xFF
if k == ord('q'):
break
# 关闭窗口
cap.release()
cv.destroyAllWindows()
HSV的具体含义
hsv成为色相饱和度值。各个参数的含义如下:
H(Hue):色调,取值范围是 [0,179] ,它用来限制某一个颜色的彩色光谱范围;Hue 用角度度量,取值范围为0~360°,表示色彩信息,即所处的光谱颜色的位置。颜色圆环上所有的颜色都是光谱上的颜色,从红色开始按逆时针方向旋转,Hue=0 表示红色,Hue=120 表示绿色,Hue=240 表示蓝色等等。
S(Saturation):饱和度,取值范围是 [0,255] ,它用来限制颜色的深度,值越大颜色越深;其中水平方向表示饱和度,饱和度表示颜色接近光谱色的程度。饱和度越高,说明颜色越深,越接近光谱色饱和度越低,说明颜色越浅,越接近白色。饱和度为0表示纯白色。取值范围为0~100%,值越大,颜色越饱和。竖直方向表示明度,决定颜色空间中颜色的明暗程度,明度越高,表示颜色越明亮,范围是 0-100%。明度为0表示纯黑色(此时颜色最暗)。
V(Value):色值,取值范围是 [0,255] ,它用来限制像素的亮度,值越大像素越亮。
在各种颜色空间的使用之中,RGB颜色空间比较适用于系统的显示,而HSV适用于图像的处理。在物体的分割或是图像中对物体的跟踪上面有着显著的应用。
在Hue一定的情况下,饱和度减小,就是往光谱色中添加白色,光谱色所占的比例也在减小,饱和度减为0,表示光谱色所占的比例为零,导致整个颜色呈现白色。明度减小,就是往光谱色中添加黑色,光谱色所占的比例也在减小,明度减为0,表示光谱色所占的比例为零,导致整个颜色呈现黑色。
图片图像物体追踪处理
效果图
实操步骤
- 输入图像,并将图像由BGR图像转化为HSV图像
import cv2
import numpy as np
path = "../images/compass.jpg"
img = cv2.imread(path)
# Convert BGR to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)#先将整体图片的值转换成HSV的值
- 设置蓝色的范围,高蓝和低蓝的范围,并且用inrange提取出这部分颜色范围的物体。
sensitivity = 15
# define range of blue color in HSV
lower_blue = np.array([120 - sensitivity, 100, 100])#这里设置蓝色的范围,低蓝和高蓝
upper_blue = np.array([120 + sensitivity, 255, 255])
# Threshold the HSV image to get a range of blue color
mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)#将图片中这部分蓝色挑出来
cv2.imshow("mask_blue1",mask_blue)
感觉效果不是很好,还有很多小白点,所以,我们要进行去噪。
- 先闭运算再开运算,进行去噪操作.
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))#获取一个自定义核
# 下面的这个先闭后开操作是为了去噪
mask_blue = cv2.morphologyEx(mask_blue, cv2.MORPH_CLOSE, kernel) # 闭运算(闭运算 = 先膨胀运算,再腐蚀运算(看上去将两个细微连接的图块封闭在一起))
mask_blue = cv2.morphologyEx(mask_blue, cv2.MORPH_OPEN, kernel) # 开运算(开运算 = 先腐蚀运算,再膨胀运算(看上去把细微连在一起的两块目标分开了))
cv2.imshow('mask_blue', mask_blue)
发现效果差别还是比较大的。做了一下去噪操作的话。
- 定义红色的颜色范围,并提取在图片中该颜色范围的部分。
lower_red_0, upper_red_0 = np.array([0, 100, 100]), np.array([sensitivity, 255, 255])
lower_red_1, upper_red_1 = np.array([180 - sensitivity, 100, 100]), np.array([180, 255, 255])
# Threshold the HSV image to get a range of red color
mask_0 = cv2.inRange(hsv, lower_red_0, upper_red_0)
cv2.imshow("mask_red_0",mask_0)
mask_1 = cv2.inRange(hsv, lower_red_1, upper_red_1)
cv2.imshow("mask_red_1",mask_1)
这是那两个红色颜色范围的部分。所以,现在要将这两部分去进行结合。
- 将这两部分去做或操作。并且做闭操作和开操作,去除噪声。
mask_red = cv2.bitwise_or(mask_0, mask_1)
mask_red = cv2.morphologyEx(mask_red, cv2.MORPH_CLOSE, kernel)
mask_red = cv2.morphologyEx(mask_red, cv2.MORPH_OPEN, kernel)
cv2.imshow("mask_red_end",mask_red)
- 然后,以该图为区域,将原图和原图做与操作,就可以抓出这两部分的内容了。
res = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow('res', res)