2014-09-04 4 views
-1

Я написал код для выравнивания гистограммы цветного изображения. Код отлично работает для изображения с серой шкалой, но он вызывает ошибку для цветного изображения. Я конвертирую изображение rgb в hsv, а затем выполняю выравнивание гистограммы. Есть идеи об этом?Matlab: индекс должен быть положительным целым числом или логическим

Код:

% GIm=imread('tire.tif'); this is grayscale image, which works fine 
I=imread('D:\came.jpg'); 
GIm=rgb2hsv(I);% converting color image to hsv 
numofpixels=size(GIm,1)*size(GIm,2); 
figure,imshow(GIm); 
title('Original Image'); 
HIm=uint8(zeros(size(GIm,1),size(GIm,2))); 
freq=zeros(256,1); 
probf=zeros(256,1); 
probc=zeros(256,1); 
cum=zeros(256,1); 
output=zeros(256,1); 
%freq counts the occurrence of each pixel value. 
%The probability of each occurrence is calculated by probf. 
for i=1:size(GIm,1) 
    for j=1:size(GIm,2) 
     value=GIm(i,j); 
     freq(value+1)=freq(value+1)+1; % giving error here 
     probf(value+1)=freq(value+1)/numofpixels; 
    end 

end 

sum=0; 
no_bins=255; 
%The cumulative distribution probability is calculated. 
for i=1:size(probf) 
    sum=sum+freq(i); 
    cum(i)=sum; 
    probc(i)=cum(i)/numofpixels; 
    output(i)=round(probc(i)*no_bins); 
end 

for i=1:size(GIm,1) 
    for j=1:size(GIm,2) 
      HIm(i,j)=output(GIm(i,j)+1); 
    end 
end 

figure,imshow(HIm); 
title('Histogram equalization'); 
subplot(2,2,2); 
plot(GIm); 
%bar(GIm); 
title('Before Histogram equalization'); 
subplot(2,2,4); 
plot(HIm) 
%bar(HIm); 
title('After Histogram equalization'); 

Ошибка:

Attempted to access freq(1.61378); index must be a positive integer or logical. 

Error in histogramequ (line 18) 
     freq(value+1)=freq(value+1)+1; 
+2

James - посмотрите ближе к изображению HSV, 'GIm'. В окне Command введите 'class (GIm)' и 'max (GIm (:))'. Вероятно, вы заметите, что тип данных HSV (класс) равен ** double **, а максимальное значение равно 1. И поэтому все значения пикселей находятся в интервале [0,1], и сообщение об ошибке имеет смысл. Также проверьте размеры изображений RGB и HSV. В отличие от двух измерений для изображений в оттенках серого могут быть три измерения. Возможно, ваш код будет обновлен, чтобы справиться с этим. – Geoff

+2

Я не уверен, как бы вы создали гистограмму - пожалуй, одну для каждой из компонентов оттенка, насыщенности и значения (изображения HSV), разделяющую интервал [0,1] на фиксированное количество ячеек. Например, [0,0,1], [0,1, 0,2), ..., [0,8,0,9], [0,9,1] могут быть десятью ячейками, которые вы попытаетесь «заполнить». Хотя вы, вероятно, хотите значительно больше из них (это всего лишь пример). – Geoff

ответ

1

Основная проблема вашего кода после rgb2hsv(), формат каждого пикселя в два раза в [0,1], а не uint8. Поэтому вам нужно преобразовать обратно в [0,255], чтобы его можно было использовать в качестве индекса.

Следующий код будет работать должным образом.

for i=1:size(GIm,1) 
    for j=1:size(GIm,2) 
     value=floor(GIm(i,j) * 255); % now value is in [0,255] 
     freq(value+1)=freq(value+1)+1; 
     probf(value+1)=freq(value+1)/numofpixels; 
    end 
end 
Смежные вопросы