《OpenCV轻松入门:面向Python》读书笔记
作者:李立宗
出版社:电子工业出版社
出版时间:2019-05
第4章 色彩空间类型转换
4.4 HSV色彩空间讨论
4.4.3 标记指定颜色
在HSV色彩空间中,H通道对应不同的颜色。或者换个角度理解,颜色的差异主要体现在H通道值的不同上。所以,通过对H通道值进行筛选,便能够筛选出特定的颜色。
- 例如,在一幅HSV图像中,如果通过控制仅仅将H通道内值为240(在OpenCV内被调整为120)的像素显示出来,那么图像中就会仅仅显示蓝色部分。
本节将首先通过例题展示一些实现上的细节问题,然后通过具体例题展示如何将图像内的特定颜色标记出来,即将一幅图像内的其他颜色屏蔽,仅仅将特定颜色显示出来。
1)通过inRange函数锁定特定值
OpenCV中通过函数cv2.inRange()来判断图像内像素点的像素值是否在指定的范围内,其语法格式为:
cv2.inRange(src, lowerb, upperb)
-
dst表示输出结果,大小和src一致。
-
src表示要检查的数组或图像。
-
lowerb表示范围下界。
-
upperb表示范围上界。
-
返回值dst与src等大小,其值取决于src中对应位置上的值是否处于区间[lowerb,upperb]内:
● 如果src值处于该指定区间内,则dst中对应位置上的值为255。
● 如果src值不处于该指定区间内,则dst中对应位置上的值为0。
返回的结果dst可以理解为一个掩码数组,其大小与原始数组一致。
2)通过基于掩码的按位与显示ROI
将不感兴趣区域以黑色显示,可以通过设置掩码的方式将该区域的值置为0来实现。
3)显示特定颜色值
【例4.9】分别提取OpenCV的logo图像内的红色、绿色、蓝色。
需要注意:
- 在实际提取颜色时,往往不是提取一个特定的值,而是提取一个颜色区间。
例如,在OpenCV中的HSV模式内,蓝色在H通道内的值是120。在提取蓝色时,通常将“蓝色值120”附近的一个区间的值作为提取范围。该区间的半径通常为10左右,例如通常提取[120-10,120+10]范围内的值来指定蓝色。 - HSV模式中S通道、V通道的值的取值范围一般是[100,255]。这主要是因为,当饱和度和亮度太低时,计算出来的色调可能就不可靠了。
根据上述分析,各种颜色的HSV区间值分布在[H-10,100,100]和[H+10,255,255]之间。因此,各种颜色值的范围为:
● 蓝色:值分布在[110,100,100]和[130,255,255]之间。
● 绿色:值分布在[50,100,100]和[70,255,255]之间。
● 红色:值分布在[0,100,100]和[10,255,255]之间。
首先利用函数cv2.inRange()查找指定颜色区域,然后利用基于掩码的按位与运算将指定颜色提取出来。
4)程序
# -*- coding: utf-8 -*-
import cv2
import numpy as np
opencv=cv2.imread("opencv.jpg")
hsv = cv2.cvtColor(opencv, cv2.COLOR_BGR2HSV)
cv2.imshow('opencv',opencv)
#=============指定蓝色值的范围=============
minBlue = np.array([110,50,50])
maxBlue = np.array([130,255,255])
#确定蓝色区域
mask = cv2.inRange(hsv, minBlue, maxBlue)
#通过掩码控制的按位与,锁定蓝色区域
blue = cv2.bitwise_and(opencv,opencv, mask= mask)
cv2.imshow('blue',blue)
#=============指定绿色值的范围=============
minGreen = np.array([50,50,50])
maxGreen = np.array([70,255,255])
#确定绿色区域
mask = cv2.inRange(hsv, minGreen, maxGreen)
#通过掩码控制的按位与,锁定绿色区域
green = cv2.bitwise_and(opencv,opencv, mask= mask)
cv2.imshow('green',green)
#=============指定红色值的范围=============
minRed = np.array([0,50,50])
maxRed = np.array([30,255,255])
#确定红色区域
mask = cv2.inRange(hsv, minRed, maxRed)
#通过掩码控制的按位与,锁定红色区域
red= cv2.bitwise_and(opencv,opencv, mask= mask)
cv2.imshow('red',red)
cv2.waitKey()
cv2.destroyAllWindows()
5)运行结果

网友评论