Выравнивание яркости, яркости и контрастности для набора изображений
Я использую 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, нужны тщательно контролируемые объективные параметры, такие как яркость парных изображений (например, для бинокулярного соперничества). Более того, несмотря на то, что для одного пикселя используется одно и то же среднее значение оттенков серого, более крупный объект на переднем плане одного изображения может казаться темнее (или светлее), чем меньший объект другого изображения. Для этого я также включу некоторый фактор "расстояния", который взвешивает размер объекта и его кажущуюся яркость...