#matlab #image-processing #histogram #indices
#matlab #обработка изображений #гистограмма #индексы
Вопрос:
Я реализую выравнивание гистограммы изображения без использования встроенных функций, в частности imhist
, и histeq
. Мне разрешено использовать только cumsum
и hist
или histcounts
. У меня есть тестовая функция, которая проверяет мой код на наличие разных значений, которые я добавил для справки.
Это мой код:
function eq_img = histeq_contrast(img)
%input image data is assumed to be in range 0..1
image = img;
[m,n] = size(image);
L = 256;
H = histcounts(image(:),(0:256));
H = H.';
[counts] = H;
x = 0:255;
myCDF = cumsum(counts)/(m*n);
eqI = (L-1)*myCDF(double(image) 1);
eqI = uint8(eqI);
histMyOutput = histcounts(eqI,256);
eq_img = histMyOutput;
Это сообщение об ошибке, которое генерируется
Array indices must be positive integers or logical values.
Error in histeq_contrast (line 22)
eqI = (L-1)*myCDF(double(image) 1);
Error in histeq_test (line 16)
I1eq = histeq_contrast(I1);
Для справки, моя тестовая функция:
%histeq_test test script%
I1 = imread('pout.tif');
I1=im2double(I1);
% damage contrast
I1=0.8*I1;
I1eq = histeq_contrast(I1);
figure
subplot(1,2,1);
imagesc(I1); caxis([0 1]); title('Test Image 1'); axis equal tight
subplot(1,2,2);
imagesc(I1eq); caxis([0 1]); title('Histeq Result'); axis equal tight
colormap(gray);
fprintf(1,'Min/max of input image 1: %3.3f %3.3fn', min(I1(:)),max(I1(:)) );
fprintf(1,'Min/max of output image 1: %3.3f %3.3fn', min(I1eq(:)),max(I1eq(:)) );
% damage contrast
I2 = I1*0.25 0.25;
I2eq = histeq_contrast(I2);
figure
subplot(1,2,1);
imagesc(I2); caxis([0 1]); title('Test Image 2'); axis equal tight
subplot(1,2,2);
imagesc(I2eq); caxis([0 1]); title('Histeq Result'); axis equal tight
colormap(gray);
fprintf(1,'Min/max of input image 2: %3.3f %3.3fn', min(I2(:)),max(I2(:)) );
fprintf(1,'Min/max of output image 2: %3.3f %3.3fn', min(I2eq(:)),max(I2eq(:)) );
Комментарии:
1. Извините, я виноват. Исправлено.
Ответ №1:
Ваше входное изображение:
I1 = imread('pout.tif');
I1=im2double(I1);
% damage contrast
I1=0.8*I1;
После im2double
I1
содержит значения в диапазоне 0-1. Внутри вашей histeq_contrast
функции в строке, где вы получаете сообщение об ошибке, вы индексируете, используя это изображение:
eqI = (L-1)*myCDF(double(image) 1);
Таким образом, вы индексируете в нецелочисленных местоположениях, как указано в сообщении об ошибке. (Кроме того, преобразование в double
не требуется, поскольку оно уже было удвоено.) Правильно было бы:
eqI = (L-1)*myCDF(round(image*255) 1);
В качестве альтернативы, не используйте im2double
.
Комментарии:
1. Код выводится без каких-либо ошибок, но гистограмма теперь повреждена, отредактировал вопрос, чтобы отразить изменения.
2. @user6820366: пожалуйста, не меняйте вопрос настолько сильно, чтобы мой ответ больше не отвечал на него. Если вы хотите, вы можете отредактировать его, чтобы улучшить, но не делайте предоставление вам ответа движущейся целью. Я откатил редактирование. Вы пропустили
*255
в своем обновлении, что здесь важно. Кроме того, ваша функция выводит гистограмму выровненного изображения. Вместо этого сделайте выводeqI
. Я предполагаю, что вы не писали код???3. Прошу прощения, я не знал о редактировании, и да, я не писал полный код, я надеялся получить гистограмму раньше, а затем изменить ее на выходное изображение по мере необходимости.