原理
灰度直方图是数字图像处理中一个最简单、最有用的工具,它描述了一幅图像的灰度级内容 。任何一幅图像的直方图都包括了可观的信息,某些类型的图像可由其直方图完全描述。灰度直方图是灰度值的函数,描述的是图像中具有该灰度值的像素的个数,其横坐标表示像素的灰度级别,纵坐标是该灰度出现的频率 ( 像素个数与图像像素总数之比 )
灰度图代码:
src = dst = (Uint8 *)frameBuffPtr->frame.frameBufferPtr;
for ( i = 0 ; i < inputHeight ; i ++ )
{
for( j = 0 ; j < inputWidth ; j++ ,dst += 2)
*dst = 0x80; /* CbCr=128,转化灰度图 */
/* statistic the y diginal */
ICETEKDM6437B2Statistic(src + i * inputWidth * 2, inputWidth);
}
/* draw the histogram on screen
第一个参数指出直方图的显示起始位置*/
ICETEKDM6437B2Histogram(src + inputWidth * (inputHeight - HISTOHIGH - 10) * 2 + 50 * 2, inputWidth);
-----------------------------------------------------------------------------------------------
void ICETEKDM6437B2Statistic(unsigned char *src, short pixelCount)
{
int i;
for ( i=0 ; i
{
nHisto[src[i * 2 + 1]]++;//y 值构成的数组,统计Y值分布
}
}
-----------------------------------------------------------------------------------------------
void ICETEKDM6437B2Histogram(unsigned char * src, short pixelCount)
{
unsigned char * dst = src;
m_nWork=0;
/* look for the max data */
for ( mi=0 ; mi < HISTOWIDTH ; mi++ )
if ( m_nWork < nHisto[mi] )
m_nWork = nHisto[mi];
/* get the scale */
m_nWork /= (HISTOHIGH - 1);// max/127
/* get the scale count */
for ( mi=0;mi<256;mi++ )
{
nHisto[mi]/=m_nWork;// 此数组用来统计新值 0-127
}
/* draw the histogram 画直方图*/
for(mi = 0 ; mi < HISTOHIGH ; mi++)
{
dst = src;
for(mj = 0 ; mj < HISTOWIDTH ; mj++)
{
/* Set cbcr */
*dst++ = 0x80;//cr=cb=128
if(mi >= (HISTOHIGH - 1 - nHisto[mj]))
/* Set y value*/
*dst++ = HISTOCOLOR;//y=200
else
*dst++ = 1;//y=0
}
src += pixelCount * 2;//下一行
}
js++; js%=2;
for ( mi=0 ; mi nHisto[mi]=0;//清零
}
阅读(7511) | 评论(0) | 转发(0) |