登录
首页大数据时代数字图像处理中的灰度直方图是是什么?
数字图像处理中的灰度直方图是是什么?
2020-07-20
收藏

直方图你一定知道,那么灰度直方图呢?你了解吗?灰度直方图,顾名思义,就是先统计出来一幅图像中每一个像素出现的次数,之后再把每一个像素出现的次数除以总的像素个数,得到的结果就是这个像素的出现频率,最后再将像素和该像素的出现频率用图表示出来,就是灰度直方图。先简单通俗的介绍了灰度直方图,下面跟随小编一起详细了解一下吧。

一、灰度直方图概念

灰度直方图,是数字图像处理中,一种计算代价非很小,但是非常有用的工具,它概括出了一幅图像的灰度级信息。

灰度直方图是图像灰度级的函数,通常用来描述每个灰度级在图像矩阵中的像素个数或者占有率。灰度直方图横坐标是灰度级,纵坐标表示图像中该灰度级出现的个数(频率)。

一维直方图的结构:

可以将高维直方图理解为图像在每个维度上灰度级分布的直方图。最为常见的是二维直方图,二维中对应每个像素统计个变量。

二·、灰度直方图的性质:

1、灰度直方图只反映图像的灰度分布情况,不能反映图像像素的位置,也就是丢失了像素的位置信息

2、一幅图像对应的灰度直方图是唯一的,但是不同的图像却能够对应相同的直方图

3、将一幅图像分为多个区域,多个区域的直方图之和也就是原图像的直方图

三、创建灰度直方图


<span style="font-size:18px;">#include <iostream>
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
using namespace std;
 
IplImage *DrawHistogram(CvHistogram*hist, float scaleX = 1, float scaleY = 1){  // 画直方图
	float histMax = 0;
	cvGetMinMaxHistValue(hist, 0 , &histMax, 0, 0);  // 取得直方图中的最值
	IplImage *imgHist = cvCreateImage(cvSize(256 * scaleX, 64*scaleY), 8, 1);
	cvZero(imgHist); //// 清空随机值
	for(int i = 0; i < 255; i++)
	{
		float histValue = cvQueryHistValue_1D(hist, i); // 取得直方图中的i值
		float nextValue = cvQueryHistValue_1D(hist, i+1);
		int numPt = 5;
		CvPoint pt[5];
		pt[0] = cvPoint(i*scaleX, 64*scaleY);
		pt[1] = cvPoint((i+1)*scaleX, 64*scaleY);
		pt[2] = cvPoint((i+1)*scaleX, (1 -(nextValue/histMax))* 64 * scaleY);
		pt[3] = cvPoint((i+1)*scaleX, (1 -(histValue/histMax))* 64 * scaleY);
		pt[4] = cvPoint(i*scaleX, 64*scaleY);
		cvFillConvexPoly(imgHist, pt, numPt, cvScalarAll(255));
	}
	return imgHist;
 
 
}
 
 
int main()
{
	IplImage *img = cvLoadImage("F:\\tongtong.jpg",1);
	if(!img){
		cout << "No data img" << endl;
	}
	int dims = 1;
	int sizes = 256;
	float range[] = {0,255};
	float*ranges[]={range};
	CvHistogram *hist = cvCreateHist(dims, &sizes, CV_HIST_ARRAY, ranges, 1);
	cvClearHist(hist);	        //清除直方图里面的随机值 
	IplImage *imgBlue = cvCreateImage(cvGetSize(img), 8, 1);
	IplImage *imgGreen = cvCreateImage(cvGetSize(img), 8, 1);
	IplImage *imgRed = cvCreateImage(cvGetSize(img), 8, 1);
	cvSplit(img, imgBlue, imgGreen, imgRed, NULL);   //将多通道图像分解
 
	cvCalcHist(&imgBlue, hist, 0, 0);    // 计算图像的直方图
	IplImage *histBlue = DrawHistogram(hist);   // 将直方图中的数据画出来
	cvClearHist(hist);
 
	cvCalcHist(&imgGreen, hist, 0, 0);  
	IplImage *histGreen = DrawHistogram(hist);
	cvClearHist(hist);
	cvCalcHist(&imgRed, hist, 0, 0);
	IplImage *histRed = DrawHistogram(hist);
	cvClearHist(hist);
 
	cvNamedWindow("show",0);
	cvNamedWindow("B", 0);
	cvNamedWindow("G", 0);
	cvNamedWindow("R", 0);
	cvShowImage("show",img);
	cvShowImage("B",histBlue);
	cvShowImage("G",histGreen);
	cvShowImage("R", histRed);
	cvWaitKey(0);
	cvReleaseImage(&img);
	cvDestroyWindow("show");
	cvReleaseImage(&histBlue);
	cvDestroyWindow("B");
	cvReleaseImage(&histGreen);
	cvDestroyWindow("G");
	cvReleaseImage(&histRed);
	cvDestroyWindow("R");
	return 0;
	
}</span>


数据分析咨询请扫描二维码

客服在线
立即咨询