PhotoShop算法实现--直方图(十)
亮度直方图(Histogram)就是一张表示图像色彩R、G、B三分量各个亮度级的分布图像。它的横坐标是亮度级,范围为[0,255],纵坐标是该亮度的频率,即像素的分布数,通过它可以了解图像的一个很基本的统计特征。
实现原理:首先建立一个256级的亮度数组,然后取出图像中的每一个像素的亮度值,再将亮度数组对应亮度级的统计值加1,最后根据各亮度级的统计值计算出对应的概率。
实现代码:
void PhotoShop::Histogram(Mat& img, Mat& gImg)
{
if ( gImg.empty())
gImg.create(480,480, CV_8UC1);
gImg = cv::Scalar::all(0);
int i, j;
Size size = img.size();
int chns = img.channels();
float total = size.width* size.height;
int Count[256] = {0};
float Probability[256]={0};
if (img.isContinuous() && gImg.isContinuous())
{
size.width *= size.height;
size.height = 1;
}
for ( i= 0; i<size.height; ++i)
{
const unsigned char* src = (const unsigned char*)(img.data+ img.step*i);
for ( j=0; j<size.width; ++j)
{
Count[src[j]]++;
}
}
float maxP = 0;
for ( i =0; i<256; ++i)
{
Probability [i] = Count[i]/total;
if ( Probability[i]>maxP)
{
maxP = Probability[i];
}
}
int scale = 400/maxP;
for ( i =0; i<256; ++i)
{
int py = (int)(Probability[i]*scale+0.5);
// 画出概率图
line(gImg, Point(i+80, gImg.rows-40),Point(i+80, gImg.rows-40-py),cv::Scalar::all(255),1);
}
}
这里只实现了单通道(灰度图像)的直方图计算方法,对于多通道的情况,可以进行通道拆分,分别予以计算,然后显示。
实现效果如下图所示:
从颜色直方图上看,可以知道,这种图片的灰度分布较为均匀。图像的直方图包含了丰富的图像信息,描述各通道的亮度级分布,反应了亮度的分布情况,在图像处理中具有广泛的应用(如图像分割、增强等)。
作者:kezunhai 出处:http://blog.csdn.net/kezunhai 欢迎转载或分享,但请务必声明文章出处。