OpenCV学习笔记(27) 灰度直方图均衡化 练习

#include <opencv2/core/core.hpp>  
#include<opencv2/highgui/highgui.hpp>  
#include"opencv2/imgproc/imgproc.hpp"  
#include <iostream>  
#include <math.h>
using namespace cv;

Mat srcImage;
Mat grayImage;
Mat histImage;   //灰度直方图
Mat gray_equalize_image;
Mat hist_equalize_image;

//画一个白色矩形作为面板在灰度直方图
void fill_white(Mat image)
{
	rectangle(image, Point(0, 0), Point(image.cols, image.rows), Scalar(255, 255, 255), CV_FILLED);
}


void histgram(Mat image,std::string imagename)
{
	//定义变量,calcHist函数的参数准备
	Mat dstHist;  //输出的结果存储的空间 
	int dims = 1;  //1维
	float midRanges[] = { 0,256 };  //用于指出直方图每一维的每个bin(份)的上下界范围数组的数组
	const float*ranges[] = { midRanges };
	int size = 256;   //数值一共分为256组,也就是柱条的数目
	int channels = 0;

	int nScale = 2;

	calcHist(&image, 1, &channels, Mat(), dstHist, dims, &size, ranges);

	//calcHist  函数调用结束后,dstHist变量中将储存了 直方图的信息  用dstHist的模版函数 at<Type>(i)得到第i个柱条的值  
	//at<Type>(i, j)得到第i个并且第j个柱条的值 


	//因为任何一个图像的某个像素的总个数,都有可能会有很多,会超出所定义的图像的尺寸,针对这种情况,先对个数进行范围的限制  
	//先用 minMaxLoc函数来得到计算直方图后的像素的最大个数  
	double HistMaxValue;
	minMaxLoc(dstHist, 0, &HistMaxValue, 0, 0);


	histImage = Mat::zeros(Size(255 * nScale, 150), CV_8UC3);//定义灰度直方图页面的大小
	fill_white(histImage);//白底
	for (int i = 0; i < 256; i++)
	{
		float fHistValue = dstHist.at<float>(i);//像素为i的直方块大小
		int nRealHeight = cvRound((fHistValue / HistMaxValue) * 150);  //要绘制的高度
		rectangle(histImage, Point(i*nScale, 254), Point((i + 1)*nScale - 1, 150 - nRealHeight), Scalar(0, 0, 0), CV_FILLED);
		//从左往右一条一条的绘制~
	}
	imshow(imagename, histImage);
}

bool readImage()
{
	srcImage = imread("400.jpg");
	imshow("原图", srcImage);
	if (!srcImage.data)
	{
		std::cout << "fail to load image" << std::endl;
		return 0;
	}
}



void rgb_to_gray()
{
	grayImage.create(srcImage.size(), CV_8UC3);
	cvtColor(srcImage, grayImage, CV_BGR2GRAY);
	
}
void showImage(Mat Image,std::string Image_name)
{
	imshow(Image_name, Image);
}

void equlizeimage()
{
	equalizeHist(grayImage, gray_equalize_image);
}
void main()
{
	readImage();
	rgb_to_gray();
	showImage(grayImage, "灰度图");
	histgram(grayImage,"灰度直方图");

	equlizeimage();
	showImage(gray_equalize_image, "灰度图均衡化后");
	histgram(gray_equalize_image, "灰度图均衡化后的直方图");

	waitKey();
}

运行结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值