/*
Calculates the histogram bin into which an HSV entry falls
@param h Hue
@param s Saturation
@param v Value
@return Returns the bin index corresponding to the HSV color defined by
\a h, \a s, and \a v.
*/
int histo_bin( float h, float s, float v )
{
int hd, sd, vd;
/* if S or V is less than its threshold, return a "colorless" bin */
vd = MIN( (int)(v * NV / V_MAX), NV-1 );
if( s < S_THRESH || v < V_THRESH )
return NH * NS + vd;
/* otherwise determine "colorful" bin */
hd = MIN( (int)(h * NH / H_MAX), NH-1 );
sd = MIN( (int)(s * NS / S_MAX), NS-1 );
return sd * NH + hd;
}
通过仔细的分析,可以得出以下结论:
假如某几个像素点的HSV值比较接近,并且H和V值大于一个给定的限定值(S_THRESH,V_THRESH),那么经过上述函数运算后会得到一个相同的值,也就是返回值。如:A(170,0.4,0.3),B(175,0.45,0.27):这两个点经过运算后都会得到44. 也就是会把44返回回去。
故对每一个像素点 : bin = histo_bin(h,s,v); hist[bin]+=1;
所以如果把A、B作为参数,那么最后得到的结果就为:A点:bin=44; hist[44+=1;] B点:bin=44; hist[44]+=1;
这样就把A点和B点作为有相同或相似属性的点统计进直方图。反映在直方图上应该就是和具有A点相似属性的点现在的值为2了。同理可以看出对于S和V,其中一个小于设定值,那么就会归为一类,也就说,如果有10的点S和V值小于设定值,那么十个点就有可能归为一类或两类。具体得就设定值而定。在此函数中,V_THRESH的设定值为0.2,所以有可能会划分为两类。