opencv直方图拉伸

1、首先计算出一幅图像的直方图

//计算直方图
cv::MatND ImageHist::getHist(const cv::Mat &image){

	cv::Mat im;
	if(image.channels() == 3)
		cv::cvtColor(image,im,CV_RGB2GRAY,0);
	else
		im = image;
	float r[2];
	r[0] = 0;
	r[1] = 255;
	const float *ranges[1];
	ranges[0] = r;
	cv::calcHist(&im,
		1,
		&channels,
		cv::Mat(),
		hist,
		1,
		&histSize,
		ranges);
	return hist;
}

//将直方图生成图像,以便在MFC空间中显示
cv::Mat ImageHist::getHistImage(const cv::Mat &image){

	double maxVal = 0;
	double minVal = 0;
	cv::minMaxLoc(hist,&minVal,&maxVal,0,0);
	cv::Mat histImg(histSize,histSize,CV_8U,cv::Scalar(255));

	int high = histSize * 0.9;
	for (int i = 0;i < histSize;++i)
	{
		float binVal = hist.at<float>(i);
		int inted = binVal / maxVal *high;
		cv::line(histImg,
			cv::Point(i,histSize),
			cv::Point(i,histSize - inted),
			cv::Scalar::all(0));
	}
	return histImg;
}

2、去掉直方图两端bin为0或者小于某一数量的bin并记录去掉后两端的灰度值(mini,maxi),然后利用以下公式对颜色查找表进行拉伸:

(i - mini) * 255 / (maxi - mini) + 0.5

cv::Mat ImageHist::stretch(const cv::Mat &image,int minValue /* = 0 */){
	int mini = 0;
	for (;mini < histSize;++mini)
	{
		if(hist.at<float>(mini) > minValue)
			break;
	}
	int maxi = histSize - 1;
	for (;maxi >= 0;--maxi)
	{
		if(hist.at<float>(maxi) > minValue)
			break;
	}

	cv::Mat lookup(1,256,CV_8U);
	for (int i = 0;i < histSize;++i)
	{
		if(i < mini)
			lookup.at<uchar>(i) = 0;
		else if(i > maxi)
			lookup.at<uchar>(i) = 255;
		else
			lookup.at<uchar>(i) =static_cast<uchar>((i - mini) * 255 / (maxi - mini) + 0.5);
	}
	cv::Mat result;
	cv::LUT(image,lookup,result);
	return result;
}

结果:

时间: 2024-10-06 12:41:21

opencv直方图拉伸的相关文章

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

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

OpenCV &mdash;&mdash; 直方图与匹配

直方图就是对数据进行统计,将统计值组织到一系列事先定义好的bin中.bin中的数值是从数据中计算出来的特征的统计量,这些数据可以是诸如梯度,方向,色彩或任何其他特征. 直方图获得是是数据分布的统计图 直方图的基本数据结构 CvHistogram 创建一个新的直方图 cvCreateHist dims   直方图维数的数目 sizes  直方图维数尺寸的数组 type  直方图的表示格式: CV_HIST_ARRAY 意味着直方图数据表示为多维密集数组 CvMatND; CV_HIST_TREE

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

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

OpenCV 直方图

OpenCV中有灰度直方图均衡化的函数equalizeHist ( InputArray src, OutputArray dst ) 只能处理单通道的灰色图像,对于彩色图像,需要把每个信道分别均衡化,再Merge为彩色图像. OpenCV函数 compareHist ()产生一个表达两个直方图的相似度的数值 要比较两个直方图(H1 and H2), 首先必须要选择一个衡量直方图相似度的对比标准  该函数提供了4种对比标准来计算相似度 1.Correlation ( CV_COMP_CORREL

Opencv直方图计算是否需要Gpu加速?

众所周知,Gpu加速技术对图像处理具有很大的影响,在前面的博客中通过对比验证了Gpu加速技术对图像滤波的高效率.但是Gpu技术并不是万能的,本文通过比较发现Gpu计算直方图的效率并没有传统计算方法效率高.下面表格是对比结果,时间是通过运行20次求平均值而得,后面给出相应的比较代码.由结果可以看出Cpu计算直方图是运行效率更高,当对图片数据库进行训练时,如果有5000幅图片需要处理,采用Cpu计算方式可以节省75分钟左右的时间,节省的时间还是相当可观的. Gpu与Cpu计算直方图效率对比 方式 C

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 <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, minV

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直方图加刻度

声明:本文参考链接 //////////////////////////画 坐 标 值////////////// double bin_w = (double)dstImage.cols / 256; // hdims: 条的个数,则 bin_w 为条的宽度 double bin_u = (double)dstImage.rows / maxValue; //// max: 最高条的像素个数,则 bin_u 为单个像素的高度 //画纵坐标刻度(像素个数) char string[10]; in