MATLAB - алгоритм растягивания гистограммы - PullRequest
0 голосов
/ 27 апреля 2020

Мне нужно растянуть гистограмму двух изображений, но используя мой собственный алгоритм. Это мой текущий код:

img_gray = imread('hist_gray.jpg');
img_couple = imread('hist_couple.bmp');

img_gray_mod = rozciaganie(img_gray);
img_couple_mod = rozciaganie(img_couple);

subplot(4,2,1);
imshow(img_gray);
title("Obraz oryginalny");

subplot(4,2,2);
imhist(img_gray);
title("Histogram");

subplot(4,2,3);
imshow(img_gray_mod);
title("Obraz po modyfikacji");

subplot(4,2,4);
imhist(img_gray_mod);
title("Histogram");

subplot(4,2,5);
imshow(img_couple);
title("Obraz oryginalny");

subplot(4,2,6);
imhist(img_couple);
title("Histogram");

subplot(4,2,7);
imshow(img_couple_mod);
title("Obraz po modyfikacji");

subplot(4,2,8);
imhist(img_couple_mod);
title("Histogram");

function r = rozciaganie(img);
mn = min(min(img));
mx = max(max(img));
r = 255*((img-mn)/(mx-mn));
end

Это то, что я получаю в качестве выходных изображений и их гистограмм. Кто-нибудь может помочь мне с этим?

result

1 Ответ

0 голосов
/ 27 апреля 2020

Проблема в том, что ваше изображение имеет тип uint8. Следующая строка:

r = 255*((img-mn)/(mx-mn));

выполняет вычисления с использованием 8-битных целых чисел. img-mn должно быть в порядке, но затем вы делите на mx-mn, в результате чего все ваши пиксели становятся равными 0 или 1 (любое нецелое значение округляется в меньшую сторону). Наконец, умножение на 255 приводит к значениям 0 или 255. Для всех ваших пикселей.

Самое простое решение - выполнить операции с использованием операций с плавающей запятой:

function r = rozciaganie(img);
img = double(img); % convert to double so all arithmetic is floating-point arithmetic
mn = min(img(:));  % better than min(min(img))
mx = max(img(:));
r = 255*((img-mn)/(mx-mn));
r = uint8(r); % convert back to uint8 so the display works as expected
end

Просто переупорядочить целое число арифметика c также не работает должным образом, например, (255*(img-mn))/(mx-mn) переполняет значения в умножении, все результаты, превышающие 255, становятся 255. При делении после этого эти значения не восстанавливаются. (img-mn)*(255/double(mx-mn)) является наилучшим приближением, но может привести к появлению артефактов округления. Вы можете попробовать это, чтобы увидеть, достаточно ли хороши результаты.

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