python进行HSV颜色空间转换
1、色调(Hue)、饱和度(Saturation)、亮度(Value)三个分量构成,
H 表示色调 也有叫色相的 红绿蓝 这些。用度数表示红0度,绿120度,蓝240度。从红--蓝(或者红紫) ,opencv里 范围:0-180
S 代表饱和度, 纯色占的比例,表达深浅度(0-100%) 比如深红 品红 0-255
V 亮度 (0-100%) 0-255
import cv2
import numpy as np
image = cv2.imread('c:\\meiping1.png')
先展示源图情况。
2、转化成HSV
HSV = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
cv2.imshow('HSV', HSV)
分离HSV通道 并显示
H, S, V = cv2.split(HSV)cv2.imshow('H', H)cv2.imshow('S', S)cv2.imshow('V', V)print(H)print(S)print(V)
HSV出来是这个效果还是有点没想到,
3、H 取值:
[[ 80 80 70 ... 93 96 95]
[ 84 70 80 ... 93 86 90]
[ 83 84 80 ... 100 90 96]
...
[ 80 90 84 ... 160 105 113]
[ 80 95 90 ... 90 80 90]
[ 80 120 120 ... 60 80 68]]
这表示的是H通过到颜色数字,度数。图片把他们当灰度图显示了。
其实这用该是表示H色调.
4、S: 表达颜色深浅程度
[[ 4 4 4 ... 13 7 9]
[ 7 4 4 ... 13 12 9]
[ 5 7 8 ... 8 7 7]
...
[ 5 10 17 ... 5 7 7]
[10 10 12 ... 7 11 4]
[ 5 3 7 ... 2 6 7]]
5、V: 反应image图像亮度情况
[[186 187 191 ... 177 183 178]
[187 189 192 ... 179 177 177]
[187 188 190 ... 183 178 182]
...
[154 155 153 ... 141 145 138]
[155 153 150 ... 140 137 141]
[154 154 154 ... 143 136 140]]
6、因为要使用cv2.inRange()函数,这个函数挺有意思,以后还要用到后续再说,它类似阈值处理。
介于第二和第三参数之间的 置255,其他的置0 这个比较重要!
lower_red = np.array([30, 30, 30])upper_red = np.array([225, 225, 225])
mask = cv2.inRange(HSV, lower_red, upper_red) cv2.imshow('mask', mask)
果然是二值图像!
效果还不错
7、最后利用以前用过的与 加上掩码图,看一下效果。
滤掉了一些颜色,保留了一些 有点特效的意思。
maskAnd = cv2.bitwise_and(image, image, mask=mask)cv2.imshow('resource', image)cv2.imshow('maskAnd', maskAnd)cv2.waitKey(0)cv2.destroyAllWindows()
对比源图和效果图