2016-03-26 2 views
1

Я пытаюсь сделать своего рода гистограмму hsv, преобразовывая значения rgb изображения (80 * 120). Это код:Подозреваемый за пределами октавы

function Image_histogram = hsvHistogram(path, count_bins) 
     Image = double(imread(path)); 
     Image_histogram = zeros(3 * count_bins); 
     [n m] = size(Image); 

     H_vect = zeros(n, m); 
     S_vect = zeros(n, m); 
     V_vect = zeros(n, m); 

     hue_vect = zeros(1, count_bins); 
     saturation_vect = zeros(1, count_bins); 
     value_vect = zeros(1, count_bins); 


     for line = 1 : n 
       for row = 1 : m 
         %[H_vect(line, row), S_vect(line, row), V_vect(line, row)] = rgb2hsv(Image(line, row, 1), Image(line, row, 2), Image(line, row, 3)); 
       endfor 
     endfor 
     number = 100/count_bins; 

     for count = 0 : count_bins - 1 
       left = (number * count); 
       right = (number * count + number); 

       hue_vect(1, count + 1) = (sum(sum(H_vect(:,:) >= left & H_vect(:,:) < right))); 
       saturation_vect(1, count + 1) = (sum(sum(S_vect(:,:) >= left & S_vect(:,:) < right))); 
       value_vect(1, count + 1) = (sum(sum(V_vect(:,:) >= left & V_vect(:,:) < right))); 
     endfor 

     Image_histogram = horzcat(hue_vect, saturation_vect, value_vect); 


endfunction 

Когда я пытаюсь получить матрицу HSV я всегда получаю ошибку: hsvHistogram: A(I,J,...): index to dimension 2 out of bounds; value 121 out of bound 120

rgb2hsv является пиксель конвертером пикселей. Он преобразует R G B в H S V. Это не встроенная функция rgb2hsv. Прокомментированная строка, похоже, имеет проблемы.

+0

Если прокомментированная строка - это строка, которая выдает ошибку, учитывая, что такая строка содержит ваш 'rgb2hsv()', вы должны также прикрепить код для таких функций. В противном случае мы не сможем. Видимо, внутри этой функции что-то не так. – Alessiox

+0

Функция rgb2hsv описана здесь http://www.rapidtables.com/convert/color/rgb-to-hsv.htm. Единственное различие заключается в том, что у меня есть H S V в интервале [0,100]. H = (H/360) * 100, S = (дельта/Cmax) * 100, V = Cmax * 100 – RobertD

ответ

1

Проблема в функции size().
Если такое изображение RGB, матрица Image будет трехмерной матрицей, но в вашей функции size() вы просто собираете два выхода, что приведет к неправильным результатам.
Вы должны собрать все три выхода (для всех трех измерений), а затем в конечном итоге отказаться от третьего (что мы знаем, это 3). Попробуйте сделать:

[n,m,~]=size(Image); 

Больше в деталях, если матрица имеет размер n x m x q но вы спрашиваете только для двух выходов, как

[a,b]=size(Image); 

вы будете иметь a=n и b=m*q.
Эти результаты, очевидно, неверны, потому что с q>1 затем b>m, где m (снова) - размер фактического размера, и вы столкнетесь с ошибкой за пределами границ. Другими словами, цикл будет работать от 1 до b, тогда как матрица имеет только размерность m (которая меньше b).

Как вместо этого вы должны собрать все три измерения отдельно:

[a,b,c]=size(Image); 

и (как указано выше) в конечном итоге отказаться от ненужных выходных аргументов (благодаря тильде ~ оператору).