opencv直方图均衡化

#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;
}
时间: 2024-10-06 07:20:20

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

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

1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 #include <math.h> 4 5 using namespace cv; 6 using namespace std; 7 8 9 int main(int argc, char** argv) 10 { 11 Mat src,src_gray,dst; 12 //src = imread("3 input.bmp"); 13 s

opencv 直方图均衡化

将代码中的图片路径换成实际路径即可. #include "stdafx.h" #include "cv.h" #include "highgui.h" #include <highgui.h> #include <cv.h> using namespace std; int main(int argc, char** argv) { int k; IplImage* src = cvLoadImage("..\\

图像直方图均衡化增强opencv与C语言版

本文实现彩色图像的全局直方图均衡.分别对R/G/B三通道均衡,读写图片采用OpenCV.代码如下: #include <opencv2/opencv.hpp> //#include <cv.h> //#include <cxcore.h> //#include <highgui.h> #include <time.h> #include <stdio.h> #include <math.h> #include "

《OpenCV:直方图应用:直方图均衡化,直方图匹配,对比直方图》

直方图均衡化 直方图均衡化(Histogram Equalization)是直方图最典型的应用,是图像点运算的一种.对于一幅输入图像,通过运算产生一幅输出图像,点运算是指输出图像的每个像素点的灰度值由输入像素点决定,即: 直方图均衡化是通过灰度变换将一幅图像转换为另一幅具有均衡直方图,即在每个灰度级上都具有相同的象素点数过程.从分布图上的理解就是希望原始图像中y轴的值在新的分布中尽可能的展开.变换过程是利用累积分布函数对原始分布进行映射,生成新的均匀拉伸的分布.因此对应每个点的操作是寻找原始分布

Opencv图像识别从零到精通(10)-----直方图均衡化与直方图拉伸

 一.直方图均衡化 直方图均衡化是灰度变换的一个重要应用,广泛应用在图像增强处理中,它是以累计分布函数变换为基础的直方图修正法,可以产生一幅灰度级分布具有均匀概率密度的图像,扩展了像素的取值动态范围.许多图像的灰度值是非均匀分布的,其中灰度值集中在一个小区间内的图像是很常见的,直方图均衡化是一种通过重新均匀地分布各灰度值来增强图像对比度的方法,经过直方图均衡化的图像对二值化阈值选取十分有利.一般来说,直方图修正能提高图像的主观质量,因此在处理艺术图像时非常有用.直方图均衡化处理的中心思想是把原始

Qt 5.3 下OpenCV 2.4.11 开发(9)直方图均衡化

接着上面的章节,我们在 Histogram1D 类中加入一个新方法,即直方图均衡化的方法,现在贴出完整的代码,Histogram1D 类 头文件如下: #ifndef HISTOGRAM1D_H #define HISTOGRAM1D_H #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp> using namespace

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

直方图均衡化是什么有什么用 先说什么是直方图均衡化,通俗的说,以灰度图为例,原图的某一个像素为x,经过某个函数变为y.形成新的图.新的图的灰度值的分布是均匀的,这个过程就叫直方图均衡化. 图像直方图均衡化作用:用来增强对比度. 这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候.通过这种方法,亮度可以更好地在直方图上分布.这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能. 这种方法对于背景和前景都太亮或者太

opencv —— equalizeHist 直方图均衡化

直方图均匀化简介 从这张未经处理的灰度图可以看出,其灰度集中在非常小的一个范围内.这就导致了图片的强弱对比不强烈. 直方图均衡化的目的,就是把原始的直方图变换为在整个灰度范围(0~255)内均匀分布的形式,从而增加像素灰度值的动态范围,达到增强图像整体对比度的效果. 直方图均衡化的列表计算 序号 运算 步骤和结果 1 列出原始图灰度值 f(0 ≤ f ≤ L-1) 0 1 2 3 4 5 6 7 2 列出原始直方图(概率表达) 0.02 0.05 0.09 0.12 0.14 0.2 0.22

opencv学习笔记9 直方图均衡化并绘制直方图

进行直方图均衡化并将直方图绘制出来,主要需要如下几个函数: 1.CVAPI(void) cvEqualizeHist( const CvArr* src, CvArr* dst ); 这个函数用起来十分简单,只需要传入源图像以及已初始化的目标图像即可. 第一个参数:const CvArr* src:待处理的源图像: 第二个参数:CvArr* dst:目标图像: 在cvEqualizeHist()中,原始图像及目标图像必须是单通道,大小相同的8位图像.对于彩色图像,必须先利用cvSplite()将