#include <iostream>
#include "highgui.h"
#include "cv.h"
#include "cxcore.h"
#include "math.h"

using namespace std;
using namespace cv;

//绘制1维直方图
Mat draw1DHistogram(Mat histogramMat) {
	double maxVal = 0, minVal = 0;
	minMaxLoc(histogramMat, &minVal, &maxVal, 0, 0);
	Mat histImage(histogramMat.rows, histogramMat.rows, CV_8U, Scalar(255));
	int hpt = static_cast<int>(0.9 * histogramMat.rows);
	for (int h = 0; h < histogramMat.rows; h++) {
		float binVal = histogramMat.at<float>(h);
		int intensity = static_cast<int>((binVal / maxVal) * hpt);
		line(histImage, Point(h, histogramMat.rows - 1),
				Point(h, histogramMat.rows - 1 - intensity), Scalar::all(0));
	}
	return histImage;
}

//一维直方图计算(采用实际图像) 实验2
void get1DHistogramExperiment2(Mat& image) {
	//计算直方图 使用的图片数量
	int nImageArrays = 1;
	//使用的直方图数组
	Mat* imageArrays = new Mat[nImageArrays];
	//加载实际图像
//	Mat image = imread("e:\\citywall1.bmp", 0);
	if (image.data == NULL) {
		printf("加载图像失败\n");
		return;
	}
	imageArrays[0] = image;
	//直方图的维数
	const int dims = 1;
	//在图像的通道序列中 本次直方图计算使用了哪些通道,本代码中使用了编号为0的通道
	int channels[dims] = { 0 };
	//直方图中每一维上的bin数,本代码是创建一维直方图 并且 分为256个bin
	int histBins[dims] = { 256 };
	//保存直方图的结果 CV_32F,dims说明矩阵的维度,histBins说明矩阵每一维上的大小
	Mat histND(dims, histBins, CV_32F, Scalar::all(0));
	//手动指定各个bin的取值范围
	//float image1Range[5]={0.0,50.0,200.0,220.0,256.0};
	//统一分割,只需要指定bin[0]的下限值和bin[histBins[dims-1]-1]的上限值即可
	float image1Range[5] = { 0.0, 256.0 };
	//各个通道的 bin划分规则
	const float* allRanges[dims] = { image1Range };
	//直方图计算
	calcHist(imageArrays, nImageArrays, channels, Mat(), histND, dims, histBins,
			allRanges, true);
	//绘制直方图
	Mat histImage = draw1DHistogram(histND);
	//显示直方图
	namedWindow("hist");
	imshow("hist", histImage);
	waitKey(0);
}
/**
 * 直方图均衡
 */
void HistogramEqual(Mat& src){
	Mat dst;
	equalizeHist(src,dst);   //直方图均衡化
	get1DHistogramExperiment2(dst);
	namedWindow("equal");
	imshow("equal",dst);
	waitKey(0);
}
int main() {
	Mat image = imread("e:\\test.bmp", CV_LOAD_IMAGE_GRAYSCALE);
	namedWindow("src");
	imshow("src",image);
	get1DHistogramExperiment2(image);
	HistogramEqual(image);

	return 0;
}

opencv直方图均衡化的更多相关文章

  1. OpenCV——直方图均衡化(用于图像增强)

    #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespac ...

  2. opencv::直方图均衡化

    直方图均衡化 图像直方图: 是指对整个图像像在灰度范围内的像素值是指对整个图像像在灰度范围内的像素值(~)统计出现频率次数,据此生成的直方图,称为图像直方图-直方图. 直方图反映了图像灰度的分布情况. ...

  3. OpenCV-Python教程(10、直方图均衡化)

    相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV和NumP ...

  4. opencv 彩色图像亮度、对比度调节 直方图均衡化

    直接上代码: #include <Windows.h> #include <iostream>// for stand I/O #include <string> ...

  5. OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)

    http://blog.csdn.net/dcrmg/article/details/53677739 1. 基于直方图均衡化的图像增强   直方图均衡化是通过调整图像的灰阶分布,使得在0~255灰阶 ...

  6. 直方图均衡化的 C++ 实现(基于 openCV)

    这是数字图像处理课的大作业,完成于 2013/06/17,需要调用 openCV 库,完整源码和报告如下: #include <cv.h> #include <highgui.h&g ...

  7. opencv图像直方图均衡化及其原理

    直方图均衡化是什么有什么用 先说什么是直方图均衡化,通俗的说,以灰度图为例,原图的某一个像素为x,经过某个函数变为y.形成新的图.新的图的灰度值的分布是均匀的,这个过程就叫直方图均衡化. 图像直方图均 ...

  8. opencv 5 图像转换(3 重映射 仿射变换 直方图均衡化)

    重映射 实现重映射(remap函数) 基础示例程序:基本重映射 //---------------------------------[头文件.命名空间包含部分]------------------- ...

  9. opencv —— equalizeHist 直方图均衡化实现对比度增强

    直方图均匀化简介 从这张未经处理的灰度图可以看出,其灰度集中在非常小的一个范围内.这就导致了图片的强弱对比不强烈. 直方图均衡化的目的,就是把原始的直方图变换为在整个灰度范围(0~255)内均匀分布的 ...

随机推荐

  1. 理解ASP.NET MVC的路由系统

    引言 路由,正如其名,是决定消息经由何处被传递到何处的过程.也正如网络设备路由器Router一样,ASP.NET MVC框架处理请求URL的方式,同样依赖于一张预定义的路由表.以该路由表为转发依据,请 ...

  2. HDU 1496 Train Problem I 火车问题1(桟,水)

    题意: 给出两个串,串中的数字i 代表编号为i的火车进入车站的顺序,车站如桟一样,先进后出.第二个串是火车出站的顺序,问若按照第一个串那样进站,是否有可能如第二个串一样的出站顺序?火车顶多9辆,即1- ...

  3. foreach的指针问题

    从代码: $arr = array(,,,,); echo '$arr = array(1,2,3,4,5)','<br>'; foreach($arr as $key => &am ...

  4. ORACLE 临时表空间清理

    Oracle临时表空间主要用来做查询和存放一些缓冲区数据.临时表空间消耗的主要原因是需要对查询的中间结果进行排序.临时表空间的主要作用: 索引create或rebuildOrder by 或 grou ...

  5. 使用 foreach 操作数组

    foreach 并不是 Java 中的关键字,是 for 语句的特殊简化版本,在遍历数组.集合时, foreach 更简单便捷.从英文字面意思理解 foreach 也就是“ for 每一个”的意思,那 ...

  6. ulimit 命令

    用途:ulimit用于shell启动进程所占用的资源. 类别:shell内建命令 语法格式:ulimit [-acdfHlmnpsStvw] [size] 参数: -H 设置硬资源限制. -S 设置软 ...

  7. DataTable添加列和行的三种方法

    JRoger 原文 #region 方法一: DataTable tblDatas =new DataTable("Datas"); DataColumn dc =null; dc ...

  8. VC远控(二)连接Server端及密码验证

    首先服务端是一个win32console应用程序. 在建立项目的时候需要勾选MFC 套接字的初始化同客户端相似: //对套接字进行初始化 WSADATA wsadata; WORD ver = MAK ...

  9. Win10正式版激活方法有哪些?如何激活Win10?

    很多用户都想将系统升级到Win10,但是却不知道怎么激活Win10正式版的方法,其实不同版本激活正式版Win10的方法秘钥不同,下面99安卓网小编就分享一些激活Win10正式版的方法和秘钥,供大家参考 ...

  10. 比赛组队问题 --- 递归解法 --- java代码 --- 八皇后问题

    两队比赛,甲队为A.B.C3人,乙队为X.Y.Z3人.已知A不和X比,C不和X.Z比,请编程序找出3队赛手名单 采用了与八皇后问题相似的解法,代码如下: 如有疑问请链接八皇后问题的解法:http:// ...