OpenCV图像处理专栏十二 |《基于二维伽马函数的光照不均匀图像自适应校正算法》

python实现图像自动Gamma校正 python实现图像自动Gamma校正 前言: 关于Gamma: Gamma校正是对动态范围内亮度的非线性存储/还原算法,即输入值进行的非线性操作,使输出值与输入值呈指数关系;从效果上来说Gamma校正调整图像的整体亮度,没有校正的图像看起来可能会存在过亮或太暗的情况,所以想要图像显示效果更完美,Gamma校正就显得很重要了。 Gamma矫正的计算过程如下: output=〖input〗^(1/Gamma) 使用上面的指数函数把每个像素的RGB值进行变换。具体执行下列转换公式(假定像素值的取值范围为0 阅读详情
AI摘要

介绍一种基于二维伽马函数的光照不均匀图像自适应校正算法,该算法通过Retinex的多尺度高斯滤波求取光照分量,并在HSV空间的V分量上应用二维Gamma函数进行亮度调整,有效改善光照不均匀问题。

前言

这是OpenCV图像处理专栏的第十二篇文章,今天为大家介绍一个用于解决光照不均匀的图像自适应校正算法。光照不均匀其实是非常常见的一种状况,为了提升人类的视觉感受或者是为了提升诸如深度学习之类的算法准确性,人们在解决光照不均衡方面已经有大量的工作。一起来看看这篇论文使用的算法吧,论文名为:《基于二维伽马函数的光照不均匀图像自适应校正算法》。

算法原理

论文使用了Retinex的多尺度高斯滤波求取光照分量,然后使用了二维Gamma函数针对原图的HSV空间的V(亮度)分量进行亮度改变,得到结果。原理还是蛮简单的,因为是中文论文,且作者介绍得很清楚,我就不细说了,可以自己看论文,论文地址见附录。本文的重点在于对算法步骤的解读和OpenCV复现。

算法步骤

在这里插入图片描述

需要注意的点

文中公式5(二维Gamma变换) 有误,公式5为:

在这里插入图片描述
其中 γ \gamma γ 的指数应该是 m − I ( x , y ) m-I(x,y) m−I(x,y),而不是 I ( x , y ) − m I(x,y)-m I(x,y)−m,如果使用后者会得到错误结果,应该是作者笔误了。

OpenCV C++代码复现

Mat RGB2HSV(Mat src) {
	int row = src.rows;
	int col = src.cols;
	Mat dst(row, col, CV_32FC3);
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			float b = src.at<Vec3b>(i, j)[0] / 255.0;
			float g = src.at<Vec3b>(i, j)[1] / 255.0;
			float r = src.at<Vec3b>(i, j)[2] / 255.0;
			float minn = min(r, min(g, b));
			float maxx = max(r, max(g, b));
			dst.at<Vec3f>(i, j)[2] = maxx; //V
			float delta = maxx - minn;
			float h, s;
			if (maxx != 0) {
				s = delta / maxx;
			}
			else {
				s = 0;
			}
			if (r == maxx) {
				h = (g - b) / delta;
			}
			else if (g == maxx) {
				h = 2 + (b - r) / delta;
			}
			else {
				h = 4 + (r - g) / delta;
			}
			h *= 60;
			if (h < 0)
				h += 360;
			dst.at<Vec3f>(i, j)[0] = h;
			dst.at<Vec3f>(i, j)[1] = s;
		}
	}
	return dst;
}

Mat HSV2RGB(Mat src) {
	int row = src.rows;
	int col = src.cols;
	Mat dst(row, col, CV_8UC3);
	float r, g, b, h, s, v;
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			h = src.at<Vec3f>(i, j)[0];
			s = src.at<Vec3f>(i, j)[1];
			v = src.at<Vec3f>(i, j)[2];
			if (s == 0) {
				r = g = b = v;
			}
			else {
				h /= 60;
				int offset = floor(h);
				float f = h - offset;
				float p = v * (1 - s);
				float q = v * (1 - s * f);
				float t = v * (1 - s * (1 - f));
				switch (offset)
				{
				case 0: r = v; g = t; b = p; break;
				case 1: r = q; g = v; b = p; break;
				case 2: r = p; g = v; b = t; break;
				case 3: r = p; g = q; b = v; break;
				case 4: r = t; g = p; b = v; break;
				case 5: r = v; g = p; b = q; break;
				default:
					break;
				}
			}
			dst.at<Vec3b>(i, j)[0] = int(b * 255);
			dst.at<Vec3b>(i, j)[1] = int(g * 255);
			dst.at<Vec3b>(i, j)[2] = int(r * 255);
		}
	}
	return dst;
}

Mat work(Mat src) {
	int row = src.rows;
	int col = src.cols;
	Mat now = RGB2HSV(src);
	Mat H(row, col, CV_32FC1);
	Mat S(row, col, CV_32FC1);
	Mat V(row, col, CV_32FC1);
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			H.at<float>(i, j) = now.at<Vec3f>(i, j)[0];
			S.at<float>(i, j) = now.at<Vec3f>(i, j)[1];
			V.at<float>(i, j) = now.at<Vec3f>(i, j)[2];
		}
	}
	int kernel_size = min(row, col);
	if (kernel_size % 2 == 0) {
		kernel_size -= 1;
	}
	float SIGMA1 = 15;
	float SIGMA2 = 80;
	float SIGMA3 = 250;
	float q = sqrt(2.0);
	Mat F(row, col, CV_32FC1);
	Mat F1, F2, F3;
	GaussianBlur(V, F1, Size(kernel_size, kernel_size), SIGMA1 / q);
	GaussianBlur(V, F2, Size(kernel_size, kernel_size), SIGMA2 / q);
	GaussianBlur(V, F3, Size(kernel_size, kernel_size), SIGMA3 / q);
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			F.at <float>(i, j) = (F1.at<float>(i, j) + F2.at<float>(i, j) + F3.at<float>(i, j)) / 3.0;
		}
	}
	float average = mean(F)[0];
	Mat out(row, col, CV_32FC1);
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			float gamma = powf(0.5, (average - F.at<float>(i, j)) / average);
			out.at<float>(i, j) = powf(V.at<float>(i, j), gamma);
		}
	}
	vector <Mat> v;
	v.push_back(H);
	v.push_back(S);
	v.push_back(out);
	Mat merge_;
	merge(v, merge_);
	Mat dst = HSV2RGB(merge_);
	return dst;
}

效果

原图1

效果图1

原图2
效果图2

结论

可以看到这个算法对光照不均匀的图像校正效果还是不错的,且没有像Retiex那样在亮度突变处出现色晕现象。

附录

  • 论文原文:https://wenku.baidu.com/view/3570f2c255270722182ef74e.html

同期文章


欢迎关注GiantPandaCV, 在这里你将看到独家的深度学习分享,坚持原创,每天分享我们学习到的新鲜知识。( • ̀ω•́ )✧

有对文章相关的问题,或者想要加入交流群,欢迎添加BBuf微信:

在这里插入图片描述

图像处理算法之Gamma校正优化一 文章目录1 前言2 论文原理3 效果 1 前言 接着上一篇Gamma校正,对于一般的偏暗或者偏亮的图片,可以处理的不错。但是如果图像上出现部分偏亮或者部分偏暗,或者图像在时序上会有亮变暗,环境不定。这时候需要做自适应的gamma矫正,就是需要对暗的部分增亮,对亮的部分拉暗。 了解下方案一: 论文Local colour correction using nonlinear masking 2 论文原理 参考: https://blog.youkuaiyun.com/heiheiya/article/details/80 阅读详情

相关推荐

opencv光照不均匀的图像处理_OpenCV图像处理专栏十二 |基于二维伽马函数的光照不均匀图像自适应校正算法...

前言这是OpenCV图像处理专栏的第十二篇文章,今天为大家介绍一个用于解决光照不均匀的图像自适应校正算法。光照不均匀其实是非常常见的一种状况,为了提升人类的视觉感受或者是为了提升诸如深度学习之类的算法准确性,人们在解决光照不均衡方面已经有大量的工作。一起来看看这篇论文使用的算法吧,论文名为:《基于二维伽马函数的光照不均匀图像自适应校正算法》。算法原理论文使用了Retinex的多尺度高斯滤...

weixin_39907591的博客 3176

自动伽马校正(Auto Gamma Correction)算法

自动伽马校正(Auto Gamma Correction)算法 目录 文章目录自动伽马校正(Auto Gamma Correction)算法目录理论代码实现参考资料 理论 在对图像进行处理过程中,查找到一篇对图像进行自动gamma校正的论文,论文名称及链接见参考文献1. 文章的核心描述如下: Average of brightness is simple element that can be computed in the least amount of time. Basic approach in

leonardohaig的博客 1万+

opencv光线补偿_opencv 一种不均匀光照的补偿方法

如果一张图片中,光照不均匀,使用全局阈值时,就无法达到想要的阈值化效果。因此,不均匀光照的补偿算法研究,具有一定的意义。当然,不均匀光照的补偿方法有很多,本文只是记录其中一种,具体效果如何,实际价值如何,还有待验证。希望看到此博文的读者,对不均匀光照有深入研究的,可以一起交流。其主要思路为:1、求取源图I的平均灰度,并记录rows和cols;2、按照一定大小,分为N*M个方块,求出每块的平均值,得...

weixin_33001305的博客 2208

古老的基于亮度平均值的自动Gamma校正算法。

本篇博文来自博主Imageshop,更多内容可以移步至Imageshop查看。 转载自:https://www.cnblogs.com/Imageshop/p/13380028.html侵删   在github上搜索代码Auto Gamma Correction,找到一个比较古老的代码,详见:https://github.com/PedramBabakhani/Automatic-Gamma-Correction,配套的代码使用VHDL语言写的,看了半天一个for循环没有,是在看不懂,幸好里面有篇算法.

weixin_39450742的博客 1326

sauvola算法实现图像二值化,解决光照不均匀

利用sauvola实现图像二值化,很好的解决了光照不均匀产生的影响,这是我用c++实现后编译成mexw32 文件,方便matlab调用。适用于32位window系统

论文复现:基于二维伽马函数的光照不均匀图像自适应校正算法

论文复现:基于二维伽马函数的光照不均匀图像自适应校正算法。 心得 输入输出数据类型要当心 在做图像处理时,要十分注意数据类型的转换,图像一般取值 0 - 255 或者 0 - 1 ,但很多情况下,论文或者代码对输入的图像数据取值范围是有条件的,必须弄清楚,否则效果或出现很大的异常,这也是为什么我要在函数输出时,写一个 R_temp,接住这个中间计算结果。因为在其他函数调用该函数时,我们希望它不是经过转型或者归一化处理的,这样才能保证数据计算一致性。 函数功能单一化、可扩展很重要 从原理上来讲,Retinex 系列算法之间是存在递进关系的,因此在编写函数时,尤其要关注算法的输入输出,既保证函数编写完成后,能够实现自身功能的同时,也能为其他调用它的函数提供模块化的处理,这样一层套一层,代码变得很结构化、看起来会比较有层次。这些都需要前期对函数功能进行仔细地分析。 句柄和元胞是个好东西 本文在复现效果对比时,使用了句柄和元胞来存放一些同类型的函数或变量,这样既方便了修改,也减少了代码的冗余度,个人觉得这个做法值得推广。

gamma校正_OpenCV图像处理专栏十二 |《基于二维伽马函数的光照不均匀图像自适应校正算法》...

前言这是OpenCV图像处理专栏的第十二篇文章,今天为大家介绍一个用于解决光照不均匀的图像自适应校正算法。光照不均匀其实是非常常见的一种状况,为了提升人类的视觉感受或者是为了提升诸如深度学习之类的算法准确性,人们在解决光照不均衡方面已经有大量的工作。一起来看看这篇论文使用的算法吧,论文名为:《基于二维伽马函数的光照不均匀图像自适应校正算法》。算法原理论文使用了Retinex的多尺度高斯滤波求取「光...

weixin_39914107的博客 811

CTFshow-CRYPTO(持续更新)

密码学签到 }wohs.ftc{galf 将字符串逆序即可 letters = '}wohs.ftc{galf' a = list(letters) a.reverse() for letters in a: print(letters,end='') crypto2 打开浏览器的控制台,复制粘贴回车即可得到flag crypto3 这一题同上 crypto4 如图填写即可,一开始e填写的是17,一直回答错误,后来经过群内大佬提醒软件的e是十六进制的,17转十六进制就是0x11 cr

i_kei的博客 1万+

b g opencv读入的图片 r_OpenCV图像处理专栏十二 |基于二维伽马函数的光照不均匀图像自适应校正算法...

前言这是OpenCV图像处理专栏的第十二篇文章,今天为大家介绍一个用于解决光照不均匀的图像自适应校正算法。光照不均匀其实是非常常见的一种状况,为了提升人类的视觉感受或者是为了提升诸如深度学习之类的算法准确性,人们在解决光照不均衡方面已经有大量的工作。一起来看看这篇论文使用的算法吧,论文名为:《基于二维伽马函数的光照不均匀图像自适应校正算法》。算法原理论文使用了Retinex的多尺度高斯滤...

weixin_39897127的博客 134

载波同步技术(一):BPSK的Costas Loop 载波同步

Author:McCrocodile 2010/11/04          载波的提取在相干解调中往往比较重要,根据信号中是否包含载频分量,载波同步一般也可以分为两种方法。包含载频分量的可以采用窄带滤波或者基本的锁相环环路来实现,不包含的则比较麻烦需要采用特殊的环路实现载波的同步。这里介绍的BPSK的载波恢复就属于后面一种。 对于不包含载频分量的信号载波同步一般有:同相-正交环(就是常说的Costas环)、判决反馈环(几乎可以适用所有调制方式)、同相-正交环衍生环(QPSK松尾环、N相同相-正交环)。

McCrocodile Blog 1万+

别再乱提MR了!手把手教你配置GitLab的CI/CD与分支保护规则,让团队协作更丝滑

本文详细介绍了如何配置GitLab的CI/CD与分支保护规则,以优化团队协作流程。通过设置Protected Branches、MR流水线检查和自动化审批规则,有效防止不规范操作和合并冲突,提升开发效率与代码质量。特别强调MR(Merge Request)的正确使用,确保团队协作更丝滑。

weixin_28840591的博客 236

OpenCV图像处理算法——12(《基于二维伽马函数的光照不均匀图像自适应校正算法》)

基于二维伽马函数的光照不均匀图像自适应校正算法 前言 这是OpenCV图像处理专栏的第十二篇文章,今天为大家介绍一个用于解决光照不均匀的图像自适应校正算法。光照不均匀其实是非常常见的一种状况,为了提升人类的视觉感受或者是为了提升诸如深度学习之类的算法准确性,人们在解决光照不均衡方面已经有大量的工作。一起来看看这篇论文使用的算法吧,论文名为:《基于二维伽马函数的光照不均匀图像自适应校正算法》。 算法...

weixin_45709330的博客 3421

详解AUTOSAR:DaVinci Configurator导入ARXML配置(拓展篇—2)

DaVinci Configurator导入ARXML配置。

不脱发的程序猿 3332

基于二维伽马函数的光照不均匀图像自适应校正算法

关于数字图像处理:本文介绍一种用于解决光照不均匀的图像自适应校正算法。光照不均匀其实是非常常见的一种状况,为了解决图像曝光不足,或者不均衡而提出来的解决方案之一,关于【Retiex解决方案请查看】。 论文原文: 点击查看 算法原理 论文使用了Retinex的多尺度高斯滤波求取「光照分量」,然后使用了「二维Gamma函数」针对原图的「HSV空间的V(亮度)分量」进行亮度改变,得到结果。 具体实现流程如下: Mat RGB2HSV(Mat src) { int row = src.rows; int co

红叶谷 wsp_1138886114的博客 7511

FPGA实现DDR接口

verilog// DDR2控制器状态机// 初始化序列// 发出初始化命令endendendend// 自动预充电end// 其他状态...endcaseendend。

whm128的博客 1001

中国农业银行——轻量式云原生应用平台(轻云平台)

2021年10月,中国人民银行等联合发布了《关于规范金融业开源技术应用与发展的意见》(银办发〔2021〕146 号),规范金融机构合理应用开源技术,提高应用水平和自主可控能力,促进开源技术健康可持续发展。前期,为助力成员单位做好开源技术应用与发展工作,北京金融科技产业联盟开源专委会组织了金融业开源技术应用、创新等方面的案例征集,现对部分优秀案例进行宣传,发挥先进典型示范引领作用。申报单位:中国农业银行股份有限公司技术领域:云原生、无服务器架构(Serverless)、DevOps。

银行信息系统应用架构详解 2393

基于均值调整的自适应局部伽玛校正 Cython

原文github:https://github.com/zhigangjiang/simple_agc

红叶谷 wsp_1138886114的博客 1310

Android16 RK3576修改亮度调节为线性调节

文章摘要: 本文分析了Android系统中亮度调节的非线性问题,并提供了线性化改造方案。首先通过追踪Settings和SystemUI代码,发现亮度调节使用了BrightnessUtils类中的非线性Gamma空间转换算法。然后重点修改了BrightnessUtils类,将原有的Hybrid Log Gamma(HLG)算法替换为简单的线性映射公式。最后在自定义工具窗口中实现了基于系统标准接口的亮度调节功能,通过SeekBar的0-100%百分比值线性映射到1-255的系统亮度值。改造后的亮度调节更加直观,

tzj1058756809的博客 76

图像处理算法之二维Gamma校正matlab实现(实现fspecial、imfilter函数)

目录 0 引言 1、思路 2、代码 2.1 fspecial函数实现代码 2.2 imfilter函数实现代码 2.3 二维Gamma校正实现代码 3、代码运行结果 3.1fspecial函数实现效果 3.2imfilter函数实现效果 3.3 二维Gamma校正实现效果 4、参考资料 0 引言 最近项目中需要用到二维Gamma校正(基于二维伽马函数的光照不均匀图像自适应校正算法),且需要在嵌入式设备上运行,因此需要用C语言实现该功能。经过一番查找,仅...

qq_38719138的博客 6077

【华为OD机试真题 2025C卷新题】855、识文断句 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025C卷新题】855、识文断句 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华为

KJ.JK 1851

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【读点论文】基于二维伽马函数的光照不均匀图像自适应校正算法

摘 要:提出了一种基于二维伽马函数的光照不均匀图像自适应校正算法.利用多尺度高斯函数提取出场景的光照分量,然后.通过与经典算法对比表明,本文算法可以更好地降低光照不均匀对图像的影响,提高图像的质量.

白水空空 2379

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Matlab实现基于二维伽马函数的光照不均匀图像自适应校正算法

Matlab程序: %% % 基于二维伽马函数的光照不均匀图像自适应校正算法 % %% clc,close all; tic; im=imread('你的图片.jpg'); figure; imshow(im); title('原图'); [h,s,v]=rgb2hsv(im); %转到hsv空间,对亮度h处理 % 高斯滤波 HSIZE= min(size(im,1),size(im,...

Yancy的博客 6179

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

图像预处理----颜色空间模型/图像滤波/Gamma矫正

1 颜色空间处理 1.1 RGB 1.2 CMYK 1.3 YUV 1.4 HSV 2 平滑滤波 3 归一化和标准化

weixin_41585924的博客 3758

opencv 形态学图像处理-自适应阈值二值化

opencv 形态学图像处理-自适应阈值二值化

qq_41803556的博客 980

Opencv全局二值化和局部二值化(python实现)

Opencv全局二值化和局部二值化

Keep_Trying_Go的博客 4499
上一篇: OpenCV图像处理专栏十五 |《一种基于亮度均衡的图像阈值分割技术》
下一篇: Codeforces Round #546 (Div. 2) 题解
just_sort
博客等级 码龄11年 2357粉丝 1667原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值