您的位置:首页 > 运维架构

【学习 OpenCV】—— 色彩空间(RGB、HSV、rgb2hsv、rgb2gray 的实现)

2016-04-16 16:24 411 查看
RGB 色彩空间的基础是对叠加型三原色(红绿蓝)的应用。之所以选择它们,是因为把它们组合起来后可以产生色域很宽(256*256*256)的各种颜色。实际上,人类的视觉系统( Human visual system,HVS)也是基于对三原色的感知,因为视锥细胞的灵敏度位于红绿蓝的光谱周围。这通常是数字成像中默认的色彩空间,因为这就是人类看数字图像的方式。

但是,利用 RGB 色彩空间计算颜色之间的差距,并不是衡量两个颜色相似度(similarity)的最好方式。RGB 并不是感知均匀的色彩空间。也就是说,两种具有一定差距的颜色可能看起来非常接近,而另外两种具有同样差距的颜色看起来却差别很大。

未解决这个问题,引入了一些具有感知均匀特性的颜色表示法。CIEL*a*b* 就是一种这样的颜色模型。把图像转换到这种表示法后,我们就可以真正地使用图像像素与目标颜色之间的欧氏距离,来度量颜色之间的视觉相似度。

0. rgb2gray 的实现

def rgb2gray(rgb):
return np.dot(rgb[..., :3], [0.299, 0.587, 0.144])


1. rgb2hsv

HSV,H:hue,S:saturation,V:value

[0, 255] ⇒ [0, 1],也即将原始的 rgb 3 通道上的 256 级灰度值,线性压缩在 0-1 区间内;

R′=R/255,G′=G/255,B′=B/255

Cmax=max(R′,G′,B′),Cmin=min(R′,G′,B′),Δ=Cmax−Cmin

此时便可以计算 hsv 了:

H=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪0°,60°⋅(G′−B′Δmod6),60°⋅(B′−R′Δ+2),60°⋅(R′−G′Δ+4),Δ=0R′=CmaxG′=CmaxB′=Cmax,S=⎧⎩⎨0,ΔCmax,Cmax=0Cmax≠0,V=Cmax
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: