雾看OpenCV(3)——颜色空间转换

在这里插入图片描述

目录

  • 前言
  • 正文
    • 颜色空间转换
      • 实时图像物体追踪
      • HSV的具体含义
      • 图片图像物体追踪处理
  • 参考

前言

这部分的内容是OpenCV 中的图像处理.这里做一些笔记进行记录。

正文

颜色空间转换

实时图像物体追踪

雾看OpenCV(3)——颜色空间转换_第1张图片
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,表示光谱色所占的比例为零,导致整个颜色呈现黑色。

图片图像物体追踪处理

效果图
雾看OpenCV(3)——颜色空间转换_第2张图片
实操步骤

  1. 输入图像,并将图像由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的值

  1. 设置蓝色的范围,高蓝和低蓝的范围,并且用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)

雾看OpenCV(3)——颜色空间转换_第3张图片
感觉效果不是很好,还有很多小白点,所以,我们要进行去噪。

  1. 先闭运算再开运算,进行去噪操作.
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)

雾看OpenCV(3)——颜色空间转换_第4张图片发现效果差别还是比较大的。做了一下去噪操作的话。

  1. 定义红色的颜色范围,并提取在图片中该颜色范围的部分。
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)

雾看OpenCV(3)——颜色空间转换_第5张图片
这是那两个红色颜色范围的部分。所以,现在要将这两部分去进行结合。

  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)

雾看OpenCV(3)——颜色空间转换_第6张图片

  1. 然后,以该图为区域,将原图和原图做与操作,就可以抓出这两部分的内容了。
res = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow('res', res)

雾看OpenCV(3)——颜色空间转换_第7张图片

参考

  1. RGB、HSV和HSL颜色空间

你可能感兴趣的:(OpenCV,opencv)