MATLAB 中的 Gamma 校正实现

Posted

技术标签:

【中文标题】MATLAB 中的 Gamma 校正实现【英文标题】:Gamma correction implementation in MATLAB 【发布时间】:2019-10-14 18:40:09 【问题描述】:

我正在尝试在 MATLAB 中执行伽马校正功能,至少可以说,我得到了一些好坏参半的结果。使用低于 1 的伽马常数(例如 0.5)会给我一个更亮的图像,而使用高于 1 的常数会给我一个更暗的图像,这是错误的,因为它应该给我相反的结果(低于 1 的常数应该更暗且恒定高于 1 应该更亮)。

这是我根据以下公式编写的代码,该公式是我在查看图像处理书籍时发现的:

f(v):= 255·(v/255) 1/GAMMA

其中(如果我理解正确的话)v 是输入图像,而 GAMMA 是一个常数。

这是 MATLAB 中的代码:

%%Fucnion de gamma
%%Entradas
%% I = imagen original
%% gamma = constante de gamma
%%Salidas 
%% G = imagen transformada

function [G] = FuncionGamma(I,gamma)
G=zeros(size(I));
for i=1: size(I, 1)
    for j=1: size(I, 2)
        G(i,j) = double(255 * (I(i,j)/255)).^(1/gamma);
    end
end
G=uint8(G); 
end

这是调用它的脚本:

clc;
clear;
close all;

gamma = 0.5;
gamma2 = 1.5;
I = imread("mantis.jpg");

[IMG1] = FuncionGamma(I,gamma); 
[IMG2] = FuncionGamma(I,gamma2); 

figure;
imshow(IMG1);

figure; 
imshow(IMG2);

结果如下:

原图:

伽玛 = 0.5

而伽玛 = 1.5

我做错了什么?

【问题讨论】:

【参考方案1】:

注意你的括号:

G(i,j) = double(255 * (I(i,j)/255)).^(1/gamma);

G(i,j) = double( 255 * (I(i,j)/255) ) .^ (1/gamma);
                 ^^^^^^^^^^^^^^^^^^

突出显示的部分提升为1/gamma。您需要以不同的方式放置括号,以便首先计算幂,然后计算乘法。请注意,此处不需要double,但您可能希望在除法之前将I 转换为双精度(在MATLAB 中将uint8 除以双精度会产生uint8)。

此外,您根本不需要循环。 MATLAB 擅长一次性处理整个矩阵。您可以将您的功能简化为:

function G = FuncionGamma(I,gamma)
G = uint8( 255 * (double(I)/255).^(1/gamma) );
end

【讨论】:

成功了,谢谢克里斯。我还发现我只使用一个通道(这就是图像显示为红色的原因)。

以上是关于MATLAB 中的 Gamma 校正实现的主要内容,如果未能解决你的问题,请参考以下文章

色彩校正中的 gamma 值是什么

Gamma Correction/Gamma校正/灰度校正/亮度校正

ISP基础(10)-Gamma校正及其实现

利用多项式实现图像几何校正(Matlab实现)

Gamma校正与线性工作流

gamma校正