直方图均衡化算法、直方图匹配算法 C++ 代码

2023-11-15

这两天一直在研究匀光匀色算法才了解到了直方图匹配算法,想要了解这个算法又要先了解直方图均衡化算法,通过网上查找了很多资料,没有现成C++代码,经过仔细思考和实验后大概复现了该算法。特此记录,以备查阅
参考链接如下:
1、匀光匀色–直方图匹配算法实现与应用
2、基于OpenCV的直方图匹配
3、直方图均衡化的数学原理

先介绍一下基本概念

测试数据

在这里插入图片描述
原始数据

在这里插入图片描述
底图影像
在这里插入图片描述
直方图匹配匀光匀色效果

从上图可以看出原始影像与模板颜色不一致,经过直方图匹配匀光匀色后颜色一致性较好。

直方图均衡算法

先看看直方图均衡算法原理知识:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
先在根据上面的算法步骤,计算一幅影像的直方图均衡影像

1、获取一张影像Mat的直方图,即计算hs

void getImgHistogram(Mat image, map<int, double> & map)
{//获取一张影像Mat的直方图,即计算hs
	int w = image.cols;
	int h = image.rows;
	double totalPixel = w * h;
	
	double rate = 1 / (image.channels() * totalPixel);//所有像素分之一
	for (int i = 0; i < 256; i++) {
		//map.put(i, 0.0);// 通过循环,往集合里面填充0~255个位置,初始值都为0
		map[i] = 0.0;
	}

	//分别统计图像上0~255上分布总数
	for (int row = 0; row < h; row++) {
		uchar* uc_pixel = image.data + row * image.step;
		for (int col = 0; col < w; col++) {
			//uc_pixel[0] = 255 - uc_pixel[0];
			//uc_pixel[1] = 255 - uc_pixel[1];
			//uc_pixel[2] = 255 - uc_pixel[2];
			for (int BandID = 0; BandID < image.channels(); BandID++)
			{
				map[uc_pixel[BandID]] += rate;
			}
			uc_pixel += image.channels();
			//map[uc_pixel[0]] += rate;
			//map[uc_pixel[1]] += rate;
			//map[uc_pixel[2]] += rate;
			//uc_pixel += 3;
		}
	}
	return;
}

2、计算累计直方图,即hp

	double SrcSum = 0;
	map<int, double> SrcImg_AccMap;//计算累计直方图,即hp
	for (int i = 0; i < 256; i++)
	{
		SrcSum += SrcImg_map[i];
		SrcImg_AccMap[i] = SrcSum;
	}

3、对直方图中所有像素乘以255即可得到最终直方图均衡的影像,不单独列出代码,最后看所有代码里面可以找到。

所有代码如下:

#include <opencv.hpp>
#include <map>
#include <vector>

using namespace std;
using namespace cv;
void getImgHistogram(Mat image, map<int, double> & map);
Mat GetEquHistogramMat(Mat SrcImage, map<int, double> SrcImg_AccMap);//获取均衡化的影像Mat

int main()
{
	const char* SrcPath = "D:/datas/ColorMap/back/Test.png";
	const char* outPutPath = "D:/datas/ColorMap/back/Test_ZFTJH.png";
	Mat SrcImage = imread(SrcPath);
	map<int, double> SrcImg_map;//定义直方图map,直方图可以使用map进行定义,也可以使用一个一维数组定义
	getImgHistogram(SrcImage, SrcImg_map);//获取影像直方图
	//计算累计直方图
	double SrcSum = 0;
	map<int, double> SrcImg_AccMap;//累计直方图
	for (int i = 0; i < 256; i++)
	{
		SrcSum += SrcImg_map[i];
		SrcImg_AccMap[i] = SrcSum;

	}

	Mat SrcImage_Equ = GetEquHistogramMat(SrcImage, SrcImg_AccMap);//获取直方图均衡化的Mat
	imwrite(outPutPath, SrcImage_Equ);
	printf("Success save img:%s\n", outPutPath);
	imshow("SrcImage", SrcImage);
	imshow("SrcImage_Equ", SrcImage_Equ);
	waitKey(0);
	return 0;
}

void getImgHistogram(Mat image, map<int, double> & map)
{
	//获取影像直方图
	int w = image.cols;
	int h = image.rows;
	double totalPixel = w * h;

	double rate = 1 / (image.channels() * totalPixel);//所有像素分之一
	for (int i = 0; i < 256; i++) {
		// 通过循环,往集合里面填充0~255个位置,初始值都为0
		map[i] = 0.0;
	}

	//分别统计图像上0~255上分布总数
	for (int row = 0; row < h; row++) {
		uchar* uc_pixel = image.data + row * image.step;
		for (int col = 0; col < w; col++) {
			//每个波段像素
			for (int BandID = 0; BandID < image.channels(); BandID++)
			{
				map[uc_pixel[BandID]] += rate;
			}
			uc_pixel += image.channels();
			//map[uc_pixel[0]] += rate;
			//map[uc_pixel[1]] += rate;
			//map[uc_pixel[2]] += rate;
			//uc_pixel += 3;
		}
	}
	return;
}

Mat GetEquHistogramMat(Mat SrcImage, map<int, double> SrcImg_AccMap)//获取直方图均衡化的Mat
{//累计直方图,然后再每个直方图像素乘以255即得到均衡的直方图
	Mat resultImg = SrcImage.clone();//均衡化的src图
	for (int row = 0; row < resultImg.rows; row++) {
		uchar* uc_pixel = resultImg.data + row * resultImg.step;
		for (int col = 0; col < resultImg.cols; col++) {
			for (int BandID = 0; BandID < SrcImage.channels(); BandID++)
			{
				uc_pixel[BandID]=255* SrcImg_AccMap[uc_pixel[BandID]];
			}
			uc_pixel += SrcImage.channels();

			//uc_pixel[0] = 255 * SrcImg_AccMap[uc_pixel[0]];
			//uc_pixel[1] = 255 * SrcImg_AccMap[uc_pixel[1]];
			//uc_pixel[2] = 255 * SrcImg_AccMap[uc_pixel[2]];
			//uc_pixel += 3;
		}
	}
	return resultImg;


}

在这里插入图片描述

直方图匹配算法

直方图匹配算法是在直方图均衡算法基础上进行的衍生
直方图匹配:将一张图片的直方图匹配到目标图上,使两张图的视觉感觉接近
关于理论公式有很多,如果喜欢看理论知识,这里还有一篇博客:直方图匹配的数学原理 。写了很多,但是公式太复杂了,看不是很懂。直到看了下面这幅图我才懂了直方图匹配的流程步骤
在这里插入图片描述
上图说的是待匹配影像A和参考底图B,分别对其进行直方图均衡化(说简单点就是累计直方图乘以255),输出的直方图均衡的影像称为:A_Equ、B_Equ影像,看A_Equ和B_Equ那个像素值距离最近,则将B上的该直方图值映射给A,形成一个映射表。例如通过上面最下面这副图可以得到映射表(映射表可以用map<int ,uchar>数据格式表达,或者uchar*的一维数组来表达,以数组下标表示直方图值),为了值观表达,上图的映射表{0:0,1:1,2:1,3:2,4:4}。
我认为上图映射表中其实有点问题(该表我是从参考链接三中搬过来的):A图的像素3,转换成均衡化影像像素值为18,18这个值在B_Equ中距离15是3(fabs(18-15)),距离20是2(fabs(18-20)),依照取出B_Equ最近的像素作为映射像素,所以该值应该映射到B_Equ中的像素20,对应B中的的是3,所以映射表中3映射成3,而不是2。
最后一步就是根据引射表{0:0,1:1,2:1,3:2,4:4}进行修正A影像得到的就是右下角的直方图匹配后的影像,将该影像存出来则是最终结果。

注意这是直方图匹配大概流程,如果想要颜色与底图颜色更接近,则需要对待匹配影像的每个波段都与底图影像每个波段做匹配,效果则最好。

上代码:


#include <opencv.hpp>
#include <map>
#include <vector>


using namespace std;
using namespace cv;
void getSigBandImgHistogram(Mat SrcImage, map<int, double> &SrcImg_SigMap, int BandId);

int main(int argc, char* argv[])
{

	//const char* SrcPath = "D:/datas/test/ColorCorrection/Src.png";
	//const char* BaseMap = "D:/datas/test/ColorCorrection/baseMap.png";
	//const char* outPutPath= "D:/datas/test/ColorCorrection/outPut.png";

	const char* SrcPath = argv[1];
	const char* BaseMap = argv[2];
	const char* outPutPath = argv[3];
	int IsDislay = atoi(argv[4]);//是否显示匹配后影像效果,0为不显示,其他的都显示

	Mat SrcImage = imread(SrcPath);
	Mat BaseMapImg = imread(BaseMap);


	cout << SrcImage.channels() << endl;
	vector<uchar*>resultMultMap;//存储每个波段最终的映射关系
	for (int BandId = 0; BandId < SrcImage.channels(); BandId++)
	{//单独对影像每个波段进行直方图均衡,然后找到最终的映射关系
		printf("Start Get BandID:%d Histogram!\n", BandId);

		uchar* SigResultBandMap = new uchar[256];//首先定义一下单个波段的映射结果
		//1、获取单波段直方图
		map<int, double> SrcImg_SigMap;//
		map<int, double> BaseMapImg_SigMap;
		getSigBandImgHistogram(SrcImage, SrcImg_SigMap, BandId);
		getSigBandImgHistogram(BaseMapImg, BaseMapImg_SigMap, BandId);

		//计算累计直方图
		double BaseSum_SigMap = 0;
		double SrcSum_SigMap = 0;
		map<int, double> SrcImg_AccSigMap;//累计直方图
		map<int, double> BaseMapImg_AccSigMap;//累计直方图
		for (int i = 0; i < 256; i++)
		{
			SrcSum_SigMap += SrcImg_SigMap[i];
			SrcImg_AccSigMap[i] = SrcSum_SigMap;

			BaseSum_SigMap += BaseMapImg_SigMap[i];
			BaseMapImg_AccSigMap[i] = BaseSum_SigMap;
		}
		printf("Start Build resultMap :%d!\n", BandId);

		for (int i = 0; i < 256; i++)
		{
			double MinValue = 255;//最小值初始化
			for (int j = 0; j < 256; j++)
			{
				double SubVelue = fabs(SrcImg_AccSigMap[i] * 255 - BaseMapImg_AccSigMap[j] * 255);//取绝对值
				if (MinValue > SubVelue)
				{//找到最靠近直方图均衡化的值,作为映射值
					MinValue = SubVelue;
					SigResultBandMap[i] = j;
				}
			}
		}
		resultMultMap.push_back(SigResultBandMap);
	}
	//最后进行直方图像素替换
	Mat resultImg = SrcImage.clone();//均衡化的src图
	for (int row = 0; row < resultImg.rows; row++) {

		uchar* uc_pixel = resultImg.data + row * resultImg.step;
		for (int col = 0; col < resultImg.cols; col++)
		{
			for (int BID = 0; BID < SrcImage.channels(); BID++)
			{
				uc_pixel[BID] = resultMultMap[BID][uc_pixel[BID]];
			}
			//uc_pixel[0] = resultMap[uc_pixel[0]];
			//uc_pixel[2] = resultMap[uc_pixel[2]];
			//uc_pixel[1] = resultMap[uc_pixel[1]];
			//uc_pixel += 3;
			uc_pixel += SrcImage.channels();
		}
	}

	imwrite(outPutPath, resultImg);
	printf("Success save img:%s\n", outPutPath);

	if (IsDislay != 0)
	{//是否显示影像
		imshow("SrcImage", SrcImage);
		//imshow("SrcImage_Equ", SrcImage_Equ);
		imshow("BaseMapImg", BaseMapImg);
		//imshow("BaseMapImg_Equ", BaseMapImg_Equ);
		imshow("resultImg", resultImg);
		waitKey(0);
	}

	return 0;
}

void getSigBandImgHistogram(Mat SrcImage, map<int, double> &SrcImg_SigMap, int BandId)
{//获取指定波段的直方图信息
	int w = SrcImage.cols;
	int h = SrcImage.rows;
	double totalPixel = w * h;
	double rate = 1 / totalPixel;
	for (int i = 0; i < 256; i++) {
		//map.put(i, 0.0);// 通过循环,往集合里面填充0~255个位置,初始值都为0
		SrcImg_SigMap[i] = 0.0;
	}

	//分别统计图像上0~255上分布总数
	for (int row = 0; row < h; row++) {
		uchar* uc_pixel = SrcImage.data + row * SrcImage.step;
		for (int col = 0; col < w; col++) {
			SrcImg_SigMap[uc_pixel[BandId]] += rate;
			uc_pixel += 3;
		}
	}
	return;

}

结果如下图
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

直方图均衡化算法、直方图匹配算法 C++ 代码 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 为什么libc++的shared_ptr实现使用完整内存屏障而不是宽松内存屏障?

    在boost的实现中shared ptr 它用放松内存排序以增加其引用计数 https github com boostorg smart ptr blob master include boost smart ptr detail sp
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • 从 MVC 迁移到 ASP.NET Core 3.1 中的端点路由时,具有角色的 AuthorizeAttribute 不起作用

    我正在尝试将我的项目从 UseMVC asp net core 2 2 兼容样式 升级到 UseEndpoint Routing 并且我的所有请求都被重定向到我的验证失败页面 它与声明有关 如果我删除 Authorize Roles Adm
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 在 C 中使用 GNU automake 中的解析器

    我是 GNU autotools 的新手 在我的项目中使用了 lex 和 yacc 解析器 将它们作为 makefile am 中的源代码会产生以下错误 配置 in AC CHECK PROGS YACC bison yacc none i
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • 1033 旧键盘打字 Python实现

    1033 旧键盘打字 20 20 分 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 输入格式 输入在2行中分别给出坏掉的那些键 以及应该输入的文字 其
  • PC微信逆向:破解聊天记录文件!

    作者 newx 链接 https bbs pediy com thread 251303 htm 在电子取证过程中 也会遇到提取PC版微信数据的情况 看雪 52破解和CSDN等网上的PC版微信数据库破解文章实在是太简略了 大多数只有结果没有
  • MySQL中通过一条语句来统计符合不同条件的COUNT

    现在有两个表record 和 info 其中表record存放每次通话记录的主动呼出号码与被动呼入号码 表Info存放人名和对应号码 如下 现在的目的是统计每个人的手机号码主动呼出次数与被动呼入次数 就用到下列语句即可 SELECT nam
  • Openlayers 坐标系全面解析

    目录 EPSG 4326 EPSG 3857 EPSG 4326 与 EPSG 3857 的坐标转换 EPSG 4490 Openlayers 自定义坐标系 EPSG 4490 和 EPSG 4525 EPSG 4326 EPSG 3857
  • CTFshow-pwn入门-前置基础pwn23-pwn25

    pwn23 25的题目会涉及到ret2shellcode ret2libc等内容 本篇文章只会侧重研究这几道题目的wp 不会过多涉及到ret2shellcode ret2libc的基本原理 等有时间再来写关于ret2libc ret2she
  • 移动游戏平台的新趋势分享—91-mgas大会

    移动游戏平台的新趋势分享 91 mgas大会 随着智能手机与平板电脑等设备的普及 移动游戏以惊人的速度深入到人们生活当中 玩家的选择范围进一步扩大 包括角色扮演 策略游戏 棋牌游戏 休闲益智 动作冒险 但耐心在降低 而角色扮演和策略游戏的混
  • 【单片机毕业设计】【mcuclub-dz-047】基于单片机的消毒器设计

    最近设计了一个项目基于单片机的消毒器设计 与大家分享一下 一 基本介绍 项目名 基于单片机的消毒器的设计 项目编号 mcuclub dz 047 单片机 STM32F103C8T6 功能简介 1 通过液位传感器检测液位 当液位较低 通过GS
  • java毕业设计——基于JSP+J2EE+sqlserver的超市综合信息管理系统设计与实现(毕业论文+程序源码)——超市综合信息管理系统

    基于JSP J2EE sqlserver的超市综合信息管理系统设计与实现 毕业论文 程序源码 大家好 今天给大家介绍基于JSP J2EE sqlserver的超市综合信息管理系统设计与实现 文章末尾附有本毕业设计的论文和源码下载地址哦 需要
  • 如何在python pyqt窗口中,嵌入notepad、word、计算器

    import sys from PyQt5 QtWidgets import QApplication QWidget from ctypes import 成功了 class App QWidget def init self super
  • GIS状态检测新技术——振动分析法

    提示 唐老师好 我之前因为 阳 了 所以就没有参与汇报 给老师带来不便 请老师见谅 以此篇文章代替课堂汇报 文章目录 前言 一 不同故障对应的振动频谱和故障特征量 二 GIS设备振动特征估计 1 GIS设备状态空间 2 粒子滤波 三 GIS
  • vue+element-ui 项目实战示例详解【目录】

    vue 和 element是两个流行的前端即时 通常用于管理后台 PC等页面 能够快速构建美观的界面 1 vue2 介绍 Vue js是一个流行的JavaScript框架 用于构建用户界面 它的版本分为Vue 2和Vue 3 而Elemen
  • bootstrap 和 ant design css样式 冲突 导致图标移位

    bootstrap 和 ant design 冲突 导致图标移位 body anticon transform translate 0 5px 3px
  • 命令模式代码示例

    package com example mingling 执行命令的接口 author Administrator public interface Command void execute package com example ming
  • 【马士兵】Python基础--08(字典)

    Python基础 08 文章目录 Python基础 08 基础知识 字典的组成及原理 字典的创建方式 字典元素的获取 字典元素的增删改操作 获取字典视图 字典元素的遍历 字典生成式 基础知识 可变序列 目前包括字典 列表 不可变序列 目前包
  • 数电学习笔记

    数电学习笔记 背景 笔记正文 背景 在刚开学那段时间把清华大学阎石老师的 数字电子技术基础 第五版又看了一遍 记了点笔记 刚好实验室的打印机有扫描功能 于是把笔记分享一下 笔记正文 以上
  • jni中如何查看函数签名

    操作步骤 第一步 找到 build 文件夹 第二步 找到 javac 文件夹 第三步 找到自己写的 xxx class文件 第四步 右键 xxx class 文件 在 Terminal 中打开 第五步 执行 javap s xxx clas
  • 飞浆(paddle)实现机器学习

    一 飞浆 paddle 介绍 飞桨是国内唯一功能完备的端到端开源深度学习平台 集深度学习训练和预测框架 模型库 工具组件和服务平台为一体 拥有兼顾灵活性和高性能的开发机制 工业级应用效果的模型 超大规模并行深度学习能力 推理引擎一体化设计以
  • [机缘参悟-88]:什么是平台?国家、公司、家庭、硬件、软件、应用?

    目录 前言 1 什么是平台 1 1 英文是platform 1 2 百度百科 1 3 平台的现实案例 2 平台的特征 2 1 相对性 2 2 层次性 2 3 广泛性 第3章 三大系统 3 1 软硬件系统中的平台 3 2 人类社会的平台 3
  • linux网卡team0,team

    1 安装teamd root web01 yum y install teamd 2 停止NetworkManager什么是NetworkManager呢 NetworkManager服务是管理和监控网络设置的守护进程 CentOS7更加注
  • 直方图均衡化算法、直方图匹配算法 C++ 代码

    这两天一直在研究匀光匀色算法才了解到了直方图匹配算法 想要了解这个算法又要先了解直方图均衡化算法 通过网上查找了很多资料 没有现成C 代码 经过仔细思考和实验后大概复现了该算法 特此记录 以备查阅 参考链接如下 1 匀光匀色 直方图匹配算法