MATLAB中的伽玛校正实现

时间:2019-10-14 18:40:09

标签: matlab image-processing gamma

我正在尝试在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);

以下是结果:

原始图片: enter image description here

伽玛= 0.5 Gamma = 0.5

伽玛= 1.5 enter image description here

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

请注意括号:

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