Opencv 色彩追踪

在HSV色彩空间内对imori.jpg创建一个只有蓝色部分值为255的图像。

色彩追踪是提取特定颜色的区域的方法。

然而,由于在 RGB 色彩空间内颜色有256^3种,因此十分困难(或者说手动提取相当困难),因此进行 HSV 变换。

HSV 变换在问题5中提到过,是将 RGB 变换到色相(Hue)、饱和度(Saturation)、明度(Value)的方法。

  • 饱和度越小越白,饱和度越大颜色越浓烈,0\leq S\leq 1

  • 明度数值越高越接近白色,数值越低越接近黑色(0\leq V\leq 1);

  • 色相:将颜色使用0到360度表示,具体色相与数值按下表对应:

绿 青色 蓝色 品红
60° 120° 180° 240° 300° 360°

也就是说,为了追踪蓝色,可以在进行 HSV 转换后提取其中180\leq H\leq 260的位置,将其变为255

python实现:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# BGR -> HSV
def BGR2HSV(_img):
    img = _img.copy() / 255.

    hsv = np.zeros_like(img, dtype=np.float32)

    # get max and min
    max_v = np.max(img, axis=2).copy()
    min_v = np.min(img, axis=2).copy()
    min_arg = np.argmin(img, axis=2)

    # H
    hsv[..., 0][np.where(max_v == min_v)]= 0
    ## if min == B
    ind = np.where(min_arg == 0)
    hsv[..., 0][ind] = 60 * (img[..., 1][ind] - img[..., 2][ind]) / (max_v[ind] - min_v[ind]) + 60
    ## if min == R
    ind = np.where(min_arg == 2)
    hsv[..., 0][ind] = 60 * (img[..., 0][ind] - img[..., 1][ind]) / (max_v[ind] - min_v[ind]) + 180
    ## if min == G
    ind = np.where(min_arg == 1)
    hsv[..., 0][ind] = 60 * (img[..., 2][ind] - img[..., 0][ind]) / (max_v[ind] - min_v[ind]) + 300

    # S
    hsv[..., 1] = max_v.copy() - min_v.copy()

    # V
    hsv[..., 2] = max_v.copy()

    return hsv

# make mask
def get_mask(hsv):
    mask = np.zeros_like(hsv[..., 0])
    #mask[np.where((hsv > 180) & (hsv[0] < 260))] = 255
    mask[np.logical_and((hsv[..., 0] > 180), (hsv[..., 0] < 260))] = 255
    return mask


# Read image
img = cv2.imread("imori.jpg").astype(np.float32)

# RGB > HSV
hsv = BGR2HSV(img)


# color tracking
mask = get_mask(hsv)

out = mask.astype(np.uint8)

# Save result
cv2.imwrite("out.png", out)
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.destroyAllWindows()

输入(imori.jpg):

Opencv 色彩追踪

输出:
Opencv 色彩追踪

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程