计算图像的直方图

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

南通大学计算机科学与技术学院

《数字图像处理》课程实验

报告书

实验名计算图像的直方图

班级计 121

姓名张进

学号 1213022016

2014年6月 16 日

一、实验内容

1、打开一张图,计算其直方图。

二、图像直方图的概念

图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。

图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征。在实际工程中,图像直方图在特征提取、图像匹配等方面都有很好的应用。

三、灰度直方图的计算

1、灰度直方图的定义

灰度直方图是灰度级的函数,描述图像中该灰度级的像素个数(或该灰度级像素出现的频率):其横坐标是灰度级,纵坐标表示图像中该灰度级出现的个数(频率)。

一维直方图的结构表示为

高维直方图可以理解为图像在每个维度上灰度级分布的直方图。常见的是二维直方图。如红-蓝直方图的两个分量分别表示红光图像的灰度值和蓝光图像灰度值的函数。其图像坐标(Dr,Db)处对应在红光图像中具有灰度级Dr同时在蓝光图像中具有灰度级Db的像素个数。这是基于多光谱——每个像素有多个变量——的数字图像,二维中对应每个像素统计个变量。

简单的说,直方图就是对数据进行统计,将统计值组织到一系列事先定义好的bin中。bin的数值是从数据中计算出的特征的统计量,这些数据可以是诸如梯度,方向,色彩或者任何其他特征。无论如何,直方图获得的是数据分布的统计图。通常直方图的数据要低于原始数据。由于原始数据点可以表征任何事情,所以直方图实际上是一个方便表示图像特征的手段。

2、灰度直方图的计算

对于彩色图像的R、G、B各彩色分量取反的技术就是图像的反色处理,这在处理二值化图像的连通区域选取的时候非常重要。如物体连通域用黑色表示,而二值化后的物体连通域图像可那是白色的,而背景是黑色的,这时应手动选取图像的反色处理或有程序根据背景和物体连通域两种颜色的数量所占比例而自动选择是否选择选取图像的反色处理

int main()

{

Mat Image=imread("../cat.png");

cvtColor(Image,Image,CV_BGR2GRAY);

const int channels[1]={0};

const int histSize[1]={256};

float hranges[2]={0,255};

const float* ranges[1]={hranges};

MatND hist;

calcHist(&Image,1,channels,Mat(),hist,1,histSize,ranges);

return 0;

}

3、彩色直方图计算

int main()

{

Mat Image=imread("../cat.png");

const int channels[3]={0,1,2};

const int histSize[3]={256,256,256};

float hranges[2]={0,255};

const float* ranges[3]={hranges,hranges,hranges};

MatND hist;

calcHist(&Image,1,channels,Mat(),hist,3,histSize,ranges);

return 0;

}

4、不均匀直方图

分别统计0-50,50-80,80-150,150-230,230-255区间的灰度分布:

int main()

{

Mat Image=imread("../cat.png");

cvtColor(Image,Image,CV_BGR2GRAY);

const int channels[1]={0};

int histSize[1]={5};

float hranges[6]={0,50,80,150,230,255};

const float* ranges[1]={hranges};

MatND hist;

calcHist(&Image,1,channels,Mat(),hist,1,histSize,ranges,false);

return 0;

}

四、直方图的显示

直方图计算得到的实际上是一个多维数组,这并不够直观,我们希望能够像在Excel中把相关数据通过表的形式表示出来。

下面通过划线函数来把一个灰度直方图显示出来:

Mat getHistImg(const MatND& hist)

{

double maxVal=0;

double minVal=0;

//找到直方图中的最大值和最小值

minMaxLoc(hist,&minVal,&maxVal,0,0);

int histSize=hist.rows;

Mat histImg(histSize,histSize,CV_8U,Scalar(255));

// 设置最大峰值为图像高度的90%

int hpt=static_cast(0.9*histSize);

for(int h=0;h

{

float binV al=hist.at(h);

int intensity=static_cast(binVal*hpt/maxVal);

line(histImg,Point(h,histSize),Point(h,histSize-intensity),Scalar::all(0));

}

return histImg;

}

相关文档
最新文档