HSV色彩空间

HSV色彩空间,第1张

import cv2

import numpy as np

imgs = cv2.imread('water.jpg')

HSV_img = cv2.cvtColor(imgs,cv2.COLOR_BGR2HSV)

HSV2_img = cv2.cvtColor(HSV_img,cv2.COLOR_HSV2BGR)

cv2.imshow('BGR_student',imgs)

cv2.imshow('HSV_img',HSV_img)

cv2.imshow('HSV2_img',HSV2_img)

wait_re = cv2.waitKey(0) # 程序等待,否则会一闪而过

cv2.destroyAllWindows()

运行结果:

在HSV色彩空间中,H通道对应不同的颜色,因此可以通过对H通道的筛选便能筛选出特定的颜色。

dst = cv2.inRange(src,lowerb,upperb)

src---表示要检查的数组或图像

lower---表示范围的下界

upper---表示范围的上界

dst---表示输出结果,大小和src一致。在设定范围(【lower,upper】)的,对应位置上的值为255,其余位置为0.

提取颜色时,往往不是提取一个特定的值,而是提取一个颜色区间。例如,在OpenCV中的HSV色彩空间中,蓝色在H通道的值是120。在提取蓝色时,通常提取它附近的一个区间值,即[120-10,120+10]范围内的值来指定蓝色。相比之下,HSV模式中的S通道、V通道的值一般在区间【100,255】,因为当饱和度和亮度太低时,计算出来的色调可能就不可靠了。

另外绿色值分布在[50,100,100]和[70,255,255]之间;红色在[0,100,100]和[10,255,255]之间。

import cv2

import numpyas np

img = cv2.imread('water.jpg')

hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

cv2.imshow('img_BGR',img)

cv2.imshow('img_hsv',hsv)

# 指定红的范围

minRed = np.array([10,100,100],dtype=np.uint8)

maxBRed = np.array([30,200,200],dtype=np.uint8)

mask_red = cv2.inRange(hsv,minRed,maxBRed)

red_part2 = cv2.bitwise_and(hsv,hsv,mask=mask_red)

cv2.imshow('red_part2',red_part2)

cv2.waitKey(0)

cv2.destroyAllWindows()

通过分析估算出肤色在HSV空间内的范围,从而提取包含肤色部份图像。

这里将色调范围定在[5,170]

饱和度定在[25,166]

img = cv2.imread('houzi.jpeg')

hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

cv2.imshow('img_BGR',img)

cv2.imshow('img_hsv',hsv)

minHue =5

maxHue =170

hueMask = cv2.inRange(h, minHue,maxHue)

minSat =25

maxSat =166

satMask = cv2.inRange(s,minSat,maxSat)

mask = hueMask &satMask

roi_part1 = cv2.bitwise_and(img,img,mask=mask)

roi_part2 = cv2.bitwise_and(hsv,hsv,mask=mask)

cv2.imshow('roi_part1',roi_part1)

cv2.imshow('roi_part2',roi_part2)

cv2.waitKey(0)

在HSV模型内进行分量值的调整能生成一些有趣的效果。例如,将一幅图像的H通道和S通道保持不变,将其V通道的值都调整为255.

在RGB色彩空间加一个A通道,也叫alpha通道,用来表示透明度。这四个通道被称为RGBA色彩空间,png图像是一种典型的四通道图像,alpha通道的取值范围是[0,1],或者[0,255],表示从透明到不透明。

import cv2

import numpyas np

img = cv2.imread('wasser_2.jpg')

bgra = cv2.cvtColor(img,cv2.COLOR_BGR2BGRA)

b,g,r,a = cv2.split(bgra)

a[:,:] =80

bgra1 = cv2.merge([b,g,r,a])

cv2.imshow('img_BGR',img)

cv2.imshow('bgra1',bgra1)

a[:,:] =150

bgra2 = cv2.merge([b,g,r,a])

cv2.imshow('bgra2',bgra2)

a[:,:] =10

bgra3 = cv2.merge([b,g,r,a])

cv2.imshow('bgra3',bgra3)

cv2.waitKey(0)

cv2.destroyAllWindows()

cv2.imwrite('wasser_bgra3.png',bgra3)

cv2.imwrite('wasser_bgra3.jpg',bgra3)

显示出来是没有什么差别的,但保存的png图片是有差别的。

如果要进行颜色检测,HSV颜色空间是当前最常用的。

HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。

RGB和CMY颜色模型都是面向硬件的,而HSV(Hue Saturation Value)颜色模型是面向用户的。

HSV模型的三维表示从RGB立方体演化而来。设想从RGB沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。

OpenCV中HSV各个分量的取值范围

色调 H : 0 ~ 180

用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°, 蓝色为240°。它们的补色是:黄色为60°,青色为180°, 品红为300°;

饱和度 S :0 ~ 255

饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。

亮度 V : 0 ~ 255

亮度表示颜色明亮的程度,对于光源色,亮度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

若要识别某种颜色,HSV的3个分量的范围得自己调了,官方的颜色区域不是特别靠谱。

一点经验:亮度V 几乎对颜色的识别没有影响,亮度与颜色大概关系不大,只与环境中的光照有关,为了算法的适应性更强,可以把亮度V的范围调成0~255。

对颜色识别影响最大的是色调,这个得仔细调,当然,为了适应性强,范围最好调宽点。

转换成HSV颜色空间后,居然有种印象派画作的感觉了

以下的程序,能将一幅图像中的 红色、蓝色、黄色找出来:

clearclc

h=linspace(0,1,19)

s=linspace(0,1,9)

v=linspace(0,1,11)

h=h([1:end-3])*2*pi

[H,S]=meshgrid(h,s)

surf(S.*cos(H),S.*sin(H),H-H+1,hsv2rgb(cat(3,H/2/pi,S,H-H+1)))

hold on

[H,V]=meshgrid(h,v)

surf(V.*cos(H),V.*sin(H),V,hsv2rgb(cat(3,H/2/pi,H-H+1,V)))

[S,V]=meshgrid(s,v)

surf(S.*V.*cos(h(1)),S.*V.*sin(h(1)),V,hsv2rgb(cat(3,S-S+h(1)/2/pi,S,V)))

surf(S.*V.*cos(h(end)),S.*V.*sin(h(end)),V,hsv2rgb(cat(3,S-S+h(end)/2/pi,S,V)))

axis off equal

view(60,15)

camzoom(2) clearclc

h=linspace(0,1,31)

s=linspace(0,1,9)

v=linspace(0,1,11)

h=h([1:end-5])*2*pi

[H,S]=meshgrid(h,s)

surf(S.*cos(H),S.*sin(H),H-H+1,hsv2rgb(cat(3,H/2/pi,S,H-H+1)))

hold on

[H,V]=meshgrid(h,v)

surf(V.*cos(H),V.*sin(H),V,hsv2rgb(cat(3,H/2/pi,H-H+1,V)))

[S,V]=meshgrid(s,v)

surf(S.*V.*cos(h(1)),S.*V.*sin(h(1)),V,hsv2rgb(cat(3,S-S+h(1)/2/pi,S,V)))

surf(S.*V.*cos(h(end)),S.*V.*sin(h(end)),V,hsv2rgb(cat(3,S-S+h(end)/2/pi,S,V)))

shading flataxis off equal

view(60,15)camzoom(2)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11926602.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存