Python-颜色空间转换

转换颜色空间

在OpenCV 中有超过150 中进行颜色空间转换的方法。但是你以后就会
发现我们经常用到的也就两种:BGR<->Gray 和BGR<->HSV。

我们要用到的函数是:cv2.cvtColor(input_image,flag),其中flag
就是转换类型。

对于BGR<->Gray 的转换,我们要使用的flag 就是cv2.COLOR_BGR2GRAY。
同样对于BGR<->HSV 的转换,我们用的flag 就是cv2.COLOR_BGR2HSV。
你还可以通过下面的命令得到所有可用的flag。

import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib.image as mpimg # mpimg 用于读取图片

flags=[i for i in dir(cv2) if i.startswith('COLOR_')]
#str.startswith()函数:用于判断一个字符串是否为某个字符串的开头
#dir()函数:带参数时,返回参数的属性、方法列表
print(flags)

image

image

物体跟踪

现在我们知道怎样将一幅图像从BGR 转换到HSV 了,我们可以利用这
一点来提取带有某个特定颜色的物体。在HSV 颜色空间中要比在BGR 空间
中更容易表示一个特定颜色。在我们的程序中,我们要提取的是一个蓝色的物体。下面就是就是我们要做的几步:

• 从视频中获取每一帧图像
• 将图像转换到HSV 空间
• 设置HSV 阈值到蓝色范围。
• 获取蓝色物体,当然我们还可以做其他任何我们想做的事,比如:在蓝色物体周围画一个圈。

import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib.image as mpimg # mpimg 用于读取图片

cap=cv2.VideoCapture(0)

while(1):

    #获取每一帧
    ret,frame=cap.read()

    #转换到HSV
    hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

    #设定蓝色的阈值
    lower_blue=np.array([110,50,50])
    upper_blue=np.array([130,255,255])

    #根据阈值构建掩模
    mask=cv2.inRange(hsv,lower_blue,upper_blue)
    #第一个参数:hsv指的是原图
    #第二个参数:lower_red指的是图像中低于这个lower_red的值,图像值变为0
    #第三个参数:upper_red指的是图像中高于这个upper_red的值,图像值变为0
    #而在lower_red~upper_red之间的值变成255

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

image

怎样找到要跟踪对象的HSV 值?

函数cv2.cvtColor() 也可以用到这里。但是现在你要传入的参数是(你想要的)BGR 值而不是一副图。例如,我们要找到绿色的HSV 值,我们只需在终端输入以下命令:

import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib.image as mpimg # mpimg 用于读取图片

green=np.uint8([0,255,0])
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)

image

所以不能用[0,255,0],而要用[[[0,255,0]]]

这里的三层括号应该分别对应于cvArray,cvMat,IplImage

import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib.image as mpimg # mpimg 用于读取图片

green=np.uint8([[[0,255,0]]])
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print(hsv_green)

image

现在你可以分别用[H-100,100,100] 和[H+100,255,255] 做上下阈值。除了这个方法之外,你可以使用任何其他图像编辑软件(例如GIMP)或者在线转换软件找到相应的HSV 值,但是最后别忘了调节HSV 的范围。

posted @ 2021-06-10 15:53  司砚章  阅读(114)  评论(0编辑  收藏  举报