Выравнивание яркости, яркости и контрастности для набора изображений

Я использую MATLAB для серии экспериментов, в которых каждый глаз стимулируется разными мотивами из изображений (бинокулярное соперничество), как на одной бутылке, а на другой - на часах. Существует панель инструментов для регулировки яркости и пространственной частоты (панель инструментов Shine), но она не работает для изображений, где фон просто прозрачен, например.png/.tif/.bmp и т. Д. Кроме того, фон, который должен оставаться прозрачным, получает включены в процедуру анализа и сопоставления, так что объекты в центре изображения по-прежнему не совпадают идеально.

Существует ли в MATLAB простой метод (или GIMP) для сопоставления трех величин (яркости, яркости, контрастности) в наборе изображений в оттенках серого? В GIMP я пытался сделать это через "Уровни", но с неубедительными результатами, так как гистограммы каждого изображения довольно разные. Можно ли настроить предопределенную гистограмму шаблона, в соответствии с которой все другие изображения могут быть сопоставлены, чтобы получить их одинаковые для трех величин?

Заранее спасибо! Далибора

2 ответа

В Matlab, если вы хотите сопоставить только непрозрачную часть изображения, вы можете извлечь непрозрачную часть в 1D-изображение, передать ее в функцию панели инструментов, а затем преобразовать изображение обратно в исходную форму.

Допустим, у вас есть изображение с информацией RGBA, где A=1 полностью непрозрачно. Затем вы можете преобразовать изображение следующим образом:

opaqueIdx = imgRGBA(:, :, 4) == 1; 
imgOpaque = zeros(sum(opaqueIdx(:)), 1, 3); 
for color = 1:3
   myColor = imgRGBA(:, :, color); 
   imgOpaque(:, :, color) = myColor(opaqueIdx); 
end

imgOpaque затем можно отрегулировать, после чего вы перезаписываете непрозрачные части в исходном изображении с настроенными значениями.

К счастью, я нашел решение после изучения деталей матрицы изображений. Вот что я получил: я просто добавляю все значения оттенков серого для каждого из, скажем, двух, изображений в оттенках серого и делю эту сумму на количество пикселей с ненулевыми значениями в оттенках серого (поскольку прозрачный фон исключен из процедуры сопоставления), Это дает среднее значение оттенков серого для пикселя переднего плана в изображении. Предварительное условие (которое мне нужно для моего исследования) состоит в том, что изображения должны иметь одинаковые размеры r1 x c1 = r2 x c2 и иметь одинаково прозрачный фон.

Этот цикл суммирует все значения оттенков серого для всех пикселей со значением, отличным от 255 (альтернативно ненулевое), давая общую яркость переднего плана. r = строки, c = столбцы, I1 = изображение 1, I2 = изображение 2; Конечно, нужно прочитать оба изображения с помощью операции "imread".

for i = 1:r
    n = 1;
    while n <= c
        if I1(i,n,1)<255
            B1 = [B1, I1(i,n,1)];
        end
        if I2(i,n,1)<255 
            B2 = [B2, I2(i,n,1)];
        end
        n=n+1;
    end
end

TotBI1 = sum(B1);
TotBI2 = sum(B2);

Здесь подсчитывается количество пикселей, которые имеют ненулевое (или не 255) значение шкалы серого для обоих двух изображений (как показано в цикле выше):

PixNr1 = length(B1);
PixNr2 = length(B2);

Определение средней яркости на пиксель, которая имеет ненулевое (или не 255) значение шкалы серого (это также можно сделать с помощью операции "среднее"):

BPixAvg1 = TotBI1/PixNr1;
BPixAvg2 = TotBI2/PixNr2;

Наконец, модификация всех пикселей с не-255 значениями серой шкалы DeltaB, которая является выравнивающим (или компромиссным) значением оттенков серого; передний план изображения с более темными значениями оттенков серого становится ярче от DeltaB, а более светлый передний план изображения становится темнее от DeltaB:

DeltaB = (BPixAvg1 - BPixAvg2)/2;

for i = 1:r
    n=1;
    while n<=c
        if I1(i,n,1)<255
            I1(i,n,1:3) = I1(i,n,1:3)-DeltaB;
        end
        if I2(i,n,1)<255
            I2(i,n,1:3) = I2(i,n,1:3)+DeltaB;
        end
        n=n+1;
    end
end

end

Я постараюсь обобщить код для всех видов изображений, поскольку некоторым людям, которые работают над визуальными психофизическими экспериментами с MATLAB PsychToolbox, нужны тщательно контролируемые объективные параметры, такие как яркость парных изображений (например, для бинокулярного соперничества). Более того, несмотря на то, что для одного пикселя используется одно и то же среднее значение оттенков серого, более крупный объект на переднем плане одного изображения может казаться темнее (или светлее), чем меньший объект другого изображения. Для этого я также включу некоторый фактор "расстояния", который взвешивает размер объекта и его кажущуюся яркость...

Другие вопросы по тегам