1. RGB型号
2. HSV机型
3 .如何理解RGB与HSV的联系
4. HSV在图像处理中的应用
5. opencv中RGB--HSV的实现
在图像处理中,最常用的颜色空间是RGB模型,常用于颜色显示和图像处理,三维坐标的模型形式非常容易理解。
HSV模型是表现用户外观的颜色模型,重视颜色显示、颜色、浓淡、明暗。 第一次接触HSV,书里第一个抛出的是圆锥模型,因为很少使用HSV,所以不会给人留下深刻的印象,但是从一些资料来看,HSV的概念有时会出现,骚扰一些人的神经,所以阐明了HSV和RGB的关系,直接
1. RGB型号。
三维坐标:
从原点到白色顶点的中心轴线为灰度线,r、g、b三个分量相等,强度可以用三个分量的矢量表示。
用RGB理解颜色、浓淡、明暗的变化:
颜色变化:连接三个坐标轴RGB的最大分量顶点和kkdsbYMC的颜色顶点的线
浓淡变化:从RGB顶点和CMY顶点到原点和白色顶点中心轴的距离
明暗变化:中心轴点的位置到原点时变暗,到白色顶点时变亮
PS:光学的分析
混合三原色RGB可以产生其他颜色,并不是物理上其他颜色的光可以混合三原色的光。 像黄光这样的单色光各有自己的光谱,但红色和绿色混合后会形成黄色。 原因是人类的感觉系统造成的,与人类的生理系统有关。
只能说“将三原色的光以不同的比例复合,人的眼睛会产生与各种频率的可见光等价的色觉”。
2. HSV机型
倒圆锥模型:
这个模型是用颜色、浓淡、明暗描绘的。
h是颜色
s为浓淡,S=0时,仅灰度
v是明暗的,表示颜色的亮度,但与光的强度没有直接关系。
3. RGB与HSV的联系
根据以上的直观理解,将RGB维坐标的中心轴立起扁平化后,就可以制作HSV的圆锥模型。
但是,由于v只选择了一个RGB的最大成分,所以与强度没有直接关系。 RGB反映光的强度(或灰度)的变化。
v=max(r,g,b ) ) )。
从RGB转换为HSV :
' HSV是用户直观的颜色模型。 从指定色角h,使V=S=1的纯色开始,通过在其中添加黑色和白色,可以获得所需的颜色。 增加黑色时,s不变,v变小;增加白色时,v不变,s变小。 例如,要获得深蓝色,V=0.4 S=1 H=240度。 要获得浅蓝色,V=1 S=0.4 H=240度。' 百度百科
4. HSV的图像处理APP应用
HSV在指定颜色分割时起着比较大的作用。
h成分和s成分表示颜色信息。
分割应用:
用h成分和s成分表示颜色的距离。 颜色距离表示两种颜色之间的数值差异。 Androutsos等人通过实验大致划分了HSV颜色空间,亮度大于75%色度大于20%的是明亮的颜色区域,亮度小于25%的是黑色的区域,亮度大于75%色度小于20%的是白色的区域,除此之外是彩色的
对于不同的颜色区域,通过混合h和s的变量并确定阈值,可以进行简单的分割。
HSV的阴影消除算法:
improvingshadowsuppressioninmovingobjectdetectionwithhsvcolorinformation
5 .在5. RGB -- HSV上实现opencv
结构RGB2HSV _ f { typedeffloatchannel _ type; RGB2HSV_f(int_srccn,int _blueIdx,float _hrange ) :srccn ),blueidx ),hrange () ) ) ) ) ) 浮动h scale
= hrange*(1.f/360.f); n *= 3; for( i = 0; i < n; i += 3, src += scn ) { float b = src[bidx], g = src[1], r = src[bidx^2]; float h, s, v; float vmin, diff; v = vmin = r; if( v < g ) v = g; if( v < b ) v = b; // v = max(b, g, r) if( vmin > g ) vmin = g; if( vmin > b ) vmin = b; diff = v - vmin; s = diff/(float)(fabs(v) + FLT_EPSILON); // s = 1 - min/max diff = (float)(60./(diff + FLT_EPSILON)); if( v == r ) h = (g - b)*diff; else if( v == g ) h = (b - r)*diff + 120.f; else h = (r - g)*diff + 240.f; if( h < 0 ) h += 360.f; // h 求值 dst[i] = h*hscale; dst[i+1] = s; dst[i+2] = v; } } int srccn, blueIdx; float hrange;};
RGB --> GRAY的实现 算法:
template<typename _Tp> struct RGB2Gray{ typedef _Tp channel_type; RGB2Gray(int _srccn, int blueIdx, const float* _coeffs) : srccn(_srccn) { static const float coeffs0[] = { 0.299f, 0.587f, 0.114f }; // 三分量系数不同,人眼对绿色最敏感,所以G分量系数较大 memcpy( coeffs, _coeffs ? _coeffs : coeffs0, 3*sizeof(coeffs[0]) ); if(blueIdx == 0) std::swap(coeffs[0], coeffs[2]); } void operator()(const _Tp* src, _Tp* dst, int n) const // 运算 { int scn = srccn; float cb = coeffs[0], cg = coeffs[1], cr = coeffs[2]; for(int i = 0; i < n; i++, src += scn) dst[i] = saturate_cast<_Tp>(src[0]*cb + src[1]*cg + src[2]*cr); // 结果 } int srccn; float coeffs[3];};