OPENCV C++(十)gramm矫正+直方图均衡化

这篇具有很好参考价值的文章主要介绍了OPENCV C++(十)gramm矫正+直方图均衡化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

两者都是只对单通道使用,对多通道的话 就需要分离通道处理再合并通道

OPENCV C++(十)gramm矫正+直方图均衡化,opencv,人工智能,计算机视觉

 两种方法,第一个要运算次数太多了,第二个只需要查表

伽马矫正函数,这里用第二种方法,且写法有点高级

int gammaCorrection(cv::Mat srcMat, cv::Mat& dstMat, float gamma) {
	//建立查询表
	unsigned char lut[256];

	for (int i = 0; i < 256; i++)
	{
		//saturate_cast,防止像素值溢出,如果值<0,则返回0,如果大于255,则返回255
		lut[i] = saturate_cast<uchar>(pow((float)(i / 255.0f), gamma) * 255.0f);
	}

	srcMat.copyTo(dstMat);

	MatIterator_<uchar> it, end;
	for (it = dstMat.begin<uchar>(), end = dstMat.end<uchar>(); it != end; it++) {
		*it = lut[(*it)];
	}

	return 0;

}

就是建立了查找表,然后计算查找表,再遍历像素直接赋值查找表,就不用计算了。

	int readType = 0;
	Mat srcMat = imread("kjy.jpg");
	resize(srcMat, srcMat,Size(srcMat.rows*0.5, srcMat.rows * 0.5));
	
	cv::Mat dstMat;
	float gamma = GAMMA_FACTOR;
	if (srcMat.type() == CV_8UC1){
	gammaCorrection(srcMat, dstMat, gamma);
	}
	else {
		Mat channel[3];
		Mat out[3];
		float hist[3][256];

		//通道分离
		split(srcMat, channel);

		for (int i = 0; i < 3; i++) {

			gammaCorrection(channel[i], out[i], gamma);
		}
		merge(out, 3, dstMat);
	}
	imshow("src", srcMat);
	imshow("dst", dstMat);
	waitKey(0);
	destroyAllWindows();

这就是grammar矫正的代码

直方图均衡化(只对单通道有效果)多通道的话先分离通道再合并一样的

equalizeHist(srcMat, equalizeHistMat);

 

计算直方图函数


int calcIntenHist(const cv::Mat src, float* dstHist)
{

	//输入必为单通道图
	if (src.type() != CV_8UC1) {
		return -1;
	}

	memset(dstHist, 0, sizeof(float) * 256);
	int height = src.rows;
	int width = src.cols;
	//指针遍历
	for (int k = 0; k < height; k++)
	{
		// 获取第k行的首地址
		const uchar* inData = src.ptr<uchar>(k);
		//处理每个像素
		for (int i = 0; i < width; i++)
		{
			int gray = inData[i];
			dstHist[gray]++;
		}
	}

	//直方图归一化
	float norm = height * width;
	for (int n = 0; n < 256; n++) {
		dstHist[n] = dstHist[n] / norm;
	}


	return 0;
}

 还进行了归一化

直方图画画函数


int drawIntenHist(cv::Mat& histMat, float* srcHist, int bin_width, int bin_heght)
{
	histMat.create(bin_heght, 256 * bin_width, CV_8UC3);
	histMat = Scalar(255, 255, 255);

	float maxVal = *std::max_element(srcHist, srcHist + 256);

	for (int i = 0; i < 256; i++) {
		Rect binRect;
		binRect.x = i * bin_width;
		float height_i = (float)bin_heght * srcHist[i] / maxVal;
		binRect.height = (int)height_i;
		binRect.y = bin_heght - binRect.height;
		binRect.width = bin_width;
		rectangle(histMat, binRect, CV_RGB(255, 0, 0), -1);
	}

	return 0;
}

 float height_i = (float)bin_heght * srcHist[i] / maxVal;是防止不够高度大小 要进行的高度归一

直方图均衡化的完整代码:文章来源地址https://www.toymoban.com/news/detail-646244.html

	float srcHist[256];
	float dstHist[256];
	Mat dstHistMat;
	Mat srcHistMat;
	Mat histMat[3];
	Mat equalizeHistMat;
	cv::Mat dstMat1;
	int bin_width = 2;
	int bin_heigth = 100;

	if (srcMat.type() == CV_8UC1) {
		equalizeHist(srcMat, equalizeHistMat);
		imshow("src", srcMat);
		imshow("equalizeHistMat", equalizeHistMat);
		waitKey(0);
		destroyAllWindows();



		calcIntenHist(dstMat1, dstHist);
		drawIntenHist(dstHistMat, dstHist, 3, 100);
		imshow("dstMat hist", dstHistMat);
		calcIntenHist(srcMat, srcHist);
		drawIntenHist(srcHistMat, srcHist, 3, 100);
		imshow("srcMat hist", srcHistMat);
		waitKey(0);
		destroyAllWindows();
	}
	else
	{

		Mat channel[3];
		Mat out[3];
		float hist[3][256];
		split(srcMat, channel);

		for (int i = 0; i < 3; i++) {
			equalizeHist(channel[i], out[i]);
			calcIntenHist(out[i], hist[i]);
			drawIntenHist(histMat[i], hist[i], bin_width, bin_heigth);

			//按照channel编号命名窗口
			stringstream ss;
			ss << i;
			string histWindow = "Hist of chanel " + ss.str();
			string matWindow = "Image of chanel " + ss.str();

			imshow(histWindow, histMat[i]);
			imshow(matWindow, out[i]);

		}

		merge(out, 3, dstMat1);

		cv::Mat grayMat;
		cv::Mat graydstMat;
		cvtColor(srcMat, grayMat, CV_BGR2GRAY);
		cvtColor(dstMat1, graydstMat, CV_BGR2GRAY);

		//计算并绘制直方图
		calcIntenHist(graydstMat, dstHist);
		drawIntenHist(dstHistMat, dstHist, 3, 100);
		imshow("dstMat", dstMat1);
		imshow("dstMat hist", dstHistMat);

		calcIntenHist(grayMat, srcHist);
		drawIntenHist(srcHistMat, srcHist, 3, 100);

		imshow("srcMat hist", srcHistMat);
		imshow("srcMat", srcMat);
		waitKey(0);
		destroyAllWindows();

	}

		return 0;
		
	}

到了这里,关于OPENCV C++(十)gramm矫正+直方图均衡化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV官方教程中文版 —— 直方图均衡化

    本小节我们要学习直方图均衡化的概念,以及如何使用它来改善图片的对比。 想象一下如果一副图像中的大多是像素点的像素值都集中在一个像素值范围之内会怎样呢?例如,如果一幅图片整体很亮,那所有的像素值应该都会很高。但是一副高质量的图像的像素值分布应该很

    2024年02月06日
    浏览(46)
  • Python Opencv实践 - 图像直方图自适应均衡化

       

    2024年02月11日
    浏览(47)
  • opencv- CLAHE 有限对比适应性直方图均衡化

    CLAHE(Contrast Limited Adaptive Histogram Equalization)是一种对比度有限的自适应直方图均衡化技术,它能够提高图像的对比度而又避免过度增强噪声。 在OpenCV中, cv2.createCLAHE() 函数用于创建CLAHE对象,然后可以使用该对象的 apply() 方法来对图像进行CLAHE均衡化, 它在局部区域内对图

    2024年02月04日
    浏览(52)
  • C#使用OpenCv(OpenCVSharp)图像直方图均衡化处理实例

    本文实例演示C#语言中如何使用OpenCv(OpenCVSharp)对图像进行直方图均衡化处理。 直方图均衡化原理 直方图均衡化(Histogram Equalization)是一种常用的图像增强技术,用于改善图像的对比度和亮度分布。它通过重新分配图像灰度级的像素值,使得图像的直方图在灰度范围内更加

    2024年02月07日
    浏览(97)
  • python的opencv操作记录(13)-增强之直方图均衡化

    前段时间忙活深度网络和android的东西去了,好久没讲讲传统图像处理了,这一篇继续来说说opencv中的传统图像处理部分——图像增强之直方图增强。 图像增强是一种基本的图像处理操作,简单的来说就是把图像变的更清晰,或者说感兴趣的某个区域需要变的更加清晰。 而清

    2024年02月04日
    浏览(47)
  • 【c++|opencv】二、灰度变换和空间滤波---2.直方图和均衡化

    every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?type=blog 图像直方图、直方图均衡化

    2024年02月06日
    浏览(47)
  • Python图像增强之直方图均衡化(全局直方图均衡、局部直方图均衡)

    图像增强是有目的地强调图像的整体或局部特性,将原来不清晰的图像变得清晰或强调某些感兴趣的特征,扩大图像中不同物体特征之间的差别,抑制不感兴趣的特征,使之改善图像质量、丰富信息量,加强图像判读和识别效果,满足某些特殊分析的需要。 图像增强通常划分

    2024年02月13日
    浏览(38)
  • 计算机视觉实战--直方图均衡化和自适应直方图均衡化

    前言: Hello大家好,我是Dream。 均衡化是数字图像处理中常用的一种技术,用于增强图像的视觉效果和对比度。 ,今天我们将实现对同一张图像的 直方图均衡化 和 自适应直方图均衡化 处理,学习一下两者的的 基本原理和实现过程 ,一起来看看吧~ 直方图均衡化(Histogram

    2024年02月13日
    浏览(48)
  • 直方图均衡化原理

    2024年02月09日
    浏览(61)
  • 直方图均衡化算法

    直方图均衡化是一种图像处理算法,通过调整图像的灰度级分布,增强图像的对比度和细节。下面是直方图均衡化算法的基本步骤: 统计原始图像的灰度直方图:遍历整个图像,计算每个灰度级出现的频次。 计算累积直方图:对灰度直方图进行累加,得到每个灰度级及其之

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包