前言
直方图在图像处理中是个十分有用的概念,在图像处理领域有很大的作用。
我想了想,直方图其实就是个统计学的原理,统计出来图像本身一些特征,例如RGB,灰度 HSV等等一些特征出现的频率。
统计学在任何学科里面都有很高的使用价值,说的高深一点有宏观经济学,投资理财等等,说的通俗点博彩行业。当然这里指的多是外国的博彩bwin之类的赔率。中国的彩票就先忽略了,这种东西大家都懂得,庄家太大。
今天文章写的简单,后面有时间把直方图的均衡化 以及直方图对比写进来。
一概念
opencv里面给的定义是
Histograms are collected
counts
of data organized into a set of predefined
bins
根据多方面的定义加上自己的理解,直方图是一种统计的含义,它统计某一种特征值在给定范围和给定间隔的分布规律。
二算法
这个算法是最简单的,拿灰度直方图来说,给定的范围是0-225,给定的间隔是1.
那么就是统计这个图片从0-255的变化情况,在哪个值最多,哪个值最少。
三代码
void caclHistMethod(Mat src, Mat &dst, int size, int begin ,int end)
{
dst.create(1,size,CV_32F);
float* p;
uchar* q;
p = dst.ptr<float>(0);
for(int i =0 ; i< size;i++)
{
p[i] = 0;
}
for(int i =0 ; i< src.rows;i++)
{
q = src.ptr<uchar>(i);
for (int j = 0; j<src.cols;j++)
p[q[j]]+=1;
}
}
void caclHistMethod(Mat src, Mat &dst, int size, int begin ,int end)
{
dst.create(1,size,CV_32F);
float* p;
uchar* q;
p = dst.ptr<float>(0);
for(int i =0 ; i< size;i++)
{
p[i] = 0;
}
for(int i =0 ; i< src.rows;i++)
{
q = src.ptr<uchar>(i);
for (int j = 0; j<src.cols;j++)
p[q[j]]+=1;
}
}
四效果图和数据
测试的图像还是lena.jpg前面文章中的那一张
效率

原始 本文

