绘制灰度直方图

前辈写的不能直接用,自己改了改

#include "cv.h"
#include "highgui.h"
#include "opencv2/imgproc.hpp"
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <ctype.h>
using namespace std;
using namespace cv;

//结构体
IplImage *src = 0;//*ip=地址中那个值
IplImage *histimg = 0;
//多维直方图
CvHistogram *hist = 0;

int hdims = 50;//划分HIST的初始个数,越高越精确

//滚动条函数
void HIST(int t)
{
	float hranges_arr[] = { 0,255 };
	float* hranges = hranges_arr;
	int bin_w;
	int bin_u;
	float max;
	int i;
	char string[10];
	CvFont font;
	//通过&变量名访问地址
	cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, 1, 1, 0, 1, 8);//字体结构初始化
	if (hdims == 0)
	{
		printf("直方图条数不能为零!\n");
	}
	else
	{
		hist = cvCreateHist(1, &hdims, CV_HIST_ARRAY, &hranges, 1);  // 创建直方图
		histimg = cvCreateImage(cvSize(800, 512), 8, 3);
		cvZero(histimg);//新建图像后紧接着加个cvZero()函数,就是将图像中的每个像素都置为0,那么显示的frame自然就是全黑了。
		cvCalcHist(&src, hist, 0, 0); // 计算直方图
		cvGetMinMaxHistValue(hist, NULL, &max, NULL, NULL);//寻找最大值及其位置
		  //printf("max_val:%f \n",max_val);
		cvZero(histimg);
		//c++ 中的“->”的意思是指向结构变量的指针。
		//指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值
		double bin_w = (double)histimg->width / hdims;  // hdims: 条的个数,则 bin_w 为条的宽度
		double bin_u = (double)histimg->height / max;  //// max: 最高条的像素个数,则 bin_u 为单个像素的高度

		// 画直方图
		for (int i = 0; i < hdims; i++)
		{
			CvPoint p0 = cvPoint(i*bin_w, histimg->height);
			int val = cvGetReal1D(hist->bins, i);
			CvPoint p1 = cvPoint((i + 1)*bin_w, histimg->height - cvGetReal1D(hist->bins, i)*bin_u);
			cvRectangle(histimg, p0, p1, cvScalar(0, 255), 1, 8, 0);
		}
		//画纵坐标刻度(像素个数)
		int kedu = 0;
		for (int i = 1; kedu < max; i++)
		{
			kedu = i * max / 10;
			_itoa_s(kedu, string, 10);//把一个整数转换为字符串
			//在图像中显示文本字符串
			cvPutText(histimg, string, cvPoint(0, histimg->height - kedu * bin_u), &font, CV_RGB(0, 255, 255));
		}
		//画横坐标刻度(像素灰度值)
		kedu = 0;
		for (int i = 1; kedu < 256; i++)
		{
			kedu = i * 20;
			_itoa_s(kedu, string, 10);//把一个整数转换为字符串
			//在图像中显示文本字符串
			cvPutText(histimg, string, cvPoint(kedu*(histimg->width / 256), histimg->height), &font, CV_RGB(255, 0, 0));
		}

		cvShowImage("Histogram", histimg);
	}
}
//指针的指针,*p为指针,**p为一个指向*p指针的指针,**p中存放的是*p的地址*p中存的是p的地址
int main(int argc, char** argv)
{
	argc = 2;
	//argv[1] = "D:\\opencv\\sources\\samples\\data\\lena.jpg";

	if (argc != 2 || (src = cvLoadImage("D:\\opencv\\sources\\samples\\data\\lena.jpg", 0)) == NULL)  // force to gray image
		return -1;
	
	cvNamedWindow("src", 1);
	cvShowImage("src", src);
	cvNamedWindow("Histogram", 1);

	cvCreateTrackbar("hdims", "src", &hdims, 256, HIST);
	HIST(0);
	cvWaitKey(0);

	/*cvDestroyWindow("src");
	cvDestroyWindow("Histogram");
	cvReleaseImage(&src);
	cvReleaseImage(&histimg);
	cvReleaseHist(&hist);*/

	return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41834780/article/details/86604987
今日推荐