Сопоставление гистограммы двух изображений без использования histeq
Хорошо известно, что histeq
в MATLAB можно выполнить сопоставление гистограммы, чтобы гистограмма изображения была преобразована в другую гистограмму. Я пытаюсь выполнить эту же операцию без использования histeq
, Я знаю, что вам нужно рассчитать CDF между двумя изображениями, но я не уверен, что делать дальше. Что я делаю?
1 ответ
Сопоставление гистограммы связано с преобразованием гистограммы одного изображения, чтобы оно выглядело как другое. Основной принцип состоит в том, чтобы вычислять гистограмму каждого изображения в отдельности, а затем вычислять их дискретные кумулятивные функции распределения (CDF). Обозначим CDF первого изображения как в то время как CDF второго изображения
, Следовательно,
будет означать, что значение CDF для интенсивности
x
за первое изображение.
Как только вы рассчитаете CDF для каждого из изображений, вам необходимо вычислить отображение, которое преобразует одну интенсивность из первого изображения так, чтобы оно соответствовало распределению интенсивности второго изображения. Для этого для каждой интенсивности на первом изображении - назовем это который будет из
[0,255]
предполагая 8-битное изображение - мы должны найти интенсивность на втором изображении (также в диапазоне
[0,255]
) такой что:
Может случиться так, что мы не получим ровно равенство, поэтому вам нужно найти наименьшую абсолютную разницу между а также
, Другими словами, для отображения
M
для каждой записи мы должны найти интенсивность
такой что:
Вы сделаете это для всех 256 значений, и мы создадим отображение. Как только вы найдете это отображение, вы просто должны применить это отображение к первому изображению, чтобы оно выглядело как распределение интенсивности второго изображения. Грубый (и, возможно, неэффективный) алгоритм будет выглядеть примерно так. Позволять im1
быть первым изображением (типа uint8
) в то время как im2
это второе изображение (типа uint8
):
M = zeros(256,1,'uint8'); %// Store mapping - Cast to uint8 to respect data type
hist1 = imhist(im1); %// Compute histograms
hist2 = imhist(im2);
cdf1 = cumsum(hist1) / numel(im1); %// Compute CDFs
cdf2 = cumsum(hist2) / numel(im2);
%// Compute the mapping
for idx = 1 : 256
[~,ind] = min(abs(cdf1(idx) - cdf2));
M(idx) = ind-1;
end
%// Now apply the mapping to get first image to make
%// the image look like the distribution of the second image
out = M(double(im1)+1);
out
должно содержать ваше совпавшее изображение, где оно преобразует распределение интенсивности первого изображения, чтобы оно соответствовало распределению интенсивности второго изображения. Будьте особенно внимательны out
заявление. Диапазон интенсивности im1
охватывает между [0,255]
, но индексация массивов в MATLAB начинается с 1. Поэтому нам нужно добавить 1 к каждому значению im1
так что мы можем правильно индексировать в M
производить нашу продукцию. Тем не мение, im1
имеет тип uint8
и MATLAB насыщает значения, если вы попытаетесь выйти за пределы 255. Таким образом, чтобы гарантировать, что мы получим 256, мы должны привести к типу данных с точностью выше 8-битной. Я решил использовать double
затем, когда мы добавляем 1 к каждому значению в im1
, мы будем охватывать от 1 до 256, чтобы мы могли правильно индексировать в M
, Также не думайте, что когда я нахожу местоположение, которое минимизирует разницу, я также должен вычесть на 1, поскольку тип данных охватывает [0,255]
,