Реализация гамма-коррекции в MATLAB - PullRequest
1 голос
/ 14 октября 2019

Я пытаюсь выполнить функцию гамма-коррекции в 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 Ответ

2 голосов
/ 14 октября 2019

Обратите внимание на скобки:

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 удвоится до деления (деления uint8 двойником производит uint8 в MATLAB).

1010 * Кроме того,вам не нужно цикл вообще. MATLAB хорошо обрабатывает целые матрицы за один раз. Вы можете упростить свою функцию до этого:
function G = FuncionGamma(I,gamma)
G = uint8( 255 * (double(I)/255).^(1/gamma) );
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...