【学习 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, 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
但是,利用 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
相关文章推荐
- Linux启动过程详解
- nginx lvs haproxy负载优缺点比较
- position+opacity组合制作图片淡入淡出效果
- Tomcat8开启APR运行模式(centos6.5)
- Linux进程间通信
- 系统性能指标:广义并发、狭义并发、吞吐量、平均响应时间、TPS、IOPS
- Linux与Windows多线程对比
- linux grep awk sed find cut
- 我的第一篇博客:Ubuntu之路(一)
- 使用Ceph作为OpenStack的后端存储
- operator =注意事项
- linux mysql 忘记密码怎么办
- Linux3个time的比较与inode
- 基于Nginx1.9+LuaJIT+Kafka的点播监控系统实战(上海卓越智慧树网点播监控系统)
- LINUX 下查看GPU信息
- 处理tomcat不必要的日志
- 声明!!!!!
- 动态库的使用方法
- 高可用性dataguard搭建和日常维护工作
- Linux服务管理