Выравнивание контрастности и яркости на нескольких изображениях
У меня есть примерно 160 изображений для эксперимента. Некоторые из изображений, однако, имеют явно разные уровни яркости и контрастности по сравнению с другими. Например, у меня есть что-то вроде двух картинок ниже:
Я хотел бы выровнять эти два изображения с точки зрения яркости и контрастности (вероятно, найдите некоторый уровень в середине и не приравнивайте одно изображение к другому - хотя это может быть хорошо, если это облегчает ситуацию). Есть ли у кого-нибудь какие-либо предложения относительно того, как это сделать? Я не очень разбираюсь в анализе изображений в Matlab, поэтому, пожалуйста, ответьте на мои вопросы, если они возникнут. Есть вопрос об выравнивании яркости, яркости и контрастности для набора изображений, который уже здесь, но код не имеет для меня особого смысла (из-за отсутствия у меня опыта работы с изображениями в Matlab).
В настоящее время я использую Gimp для манипулирования изображениями, но на 160 изображений это отнимает много времени, а субъективная оценка глаз не очень надежна. Спасибо!
1 ответ
Ты можешь использовать histeq
выполнить спецификацию гистограммы, где алгоритм будет стараться изо всех сил, чтобы целевое изображение соответствовало распределению интенсивностей / гистограммы исходного изображения. Это также называется сопоставлением гистограммы, и вы можете прочитать об этом в моем предыдущем ответе.
В сущности, распределение интенсивностей между двумя изображениями должно быть одинаковым. Если вы хотите воспользоваться этим, используя histeq
Вы можете указать дополнительный параметр, который указывает целевую гистограмму. Поэтому входное изображение будет пытаться сопоставить себя с целевой гистограммой. Примерно так будет работать, если вы храните изображения в im1
а также im2
:
out = histeq(im1, imhist(im2));
Тем не мение, imhistmatch
это более лучшая версия для использования. Это почти так же, как вы бы позвонили histeq
за исключением того, что вам не нужно вручную вычислять гистограмму. Вы просто указываете фактическое изображение, чтобы соответствовать себе:
out = imhistmatch(im1, im2);
Вот бегущий пример использования ваших двух изображений. Обратите внимание, что я выберу использовать imhistmatch
вместо. Я читаю два изображения непосредственно из Stackru, я выполняю сопоставление гистограммы, чтобы первое изображение совпадало по распределению интенсивности со вторым изображением, и мы показываем этот результат все в одном окне.
im1 = imread('https://stackru.com/images/f76926b7fcbb419e39f08239c9a3f840c55d25aa.png');
im2 = imread('https://stackru.com/images/c683fbd3d2efc3878c3223454ddbe8c5cf7c0959.png');
out = imhistmatch(im1, im2);
figure;
subplot(1,3,1);
imshow(im1);
subplot(1,3,2);
imshow(im2);
subplot(1,3,3);
imshow(out);
Вот что я получаю:
Обратите внимание, что первое изображение теперь более или менее совпадает по распространению со вторым изображением.
Мы также можем перевернуть его и сделать первое изображение источником, и мы можем попытаться сопоставить второе изображение с первым изображением. Просто переверните два параметра с помощью imhistmatch
:
out = imhistmatch(im2, im1);
Повторяя приведенный выше код для отображения рисунка, я получаю это:
Это выглядит немного интереснее. Мы определенно можем видеть форму глаз второго изображения, а некоторые черты лица более выражены.
Таким образом, в конце концов вы можете выбрать хорошее репрезентативное изображение с наилучшей яркостью и контрастностью, затем обвести все остальные изображения и вызвать imhistmatch
каждый раз, используя это исходное изображение в качестве эталона, чтобы другие изображения попытались сопоставить распределение интенсивности с этим исходным изображением. Я не могу написать код для этого, потому что я не знаю, как вы храните эти изображения в MATLAB. Если вы поделитесь этим кодом, я бы хотел написать больше.