怀疑超出界限Octave

时间:2016-03-26 19:59:49

标签: matlab image-processing octave rgb hsv

我试图通过转换图片的rgb值(80 * 120)来制作一种hsv直方图。 这是代码:

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函数。评论线似乎是有问题的。

1 个答案:

答案 0 :(得分:1)

问题出在size()函数中 如果此类图像为RGB,则矩阵Image将为3D矩阵,但在size()函数中,您只需收集两个输出,这将导致不正确的结果。
你必须收集所有三个输出(对于所有三个维度),然后最终丢弃第三个(我们知道它是3)。尝试做:

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

详细信息,如果您的矩阵的大小为n x m x q,但您只需要两个输出,例如

[a,b]=size(Image);

您将拥有a=nb=m*q 这些结果显然是不正确的,因为q>1然后b>m其中m(再次)实际尺寸大小,您将遇到越界错误。换句话说,循环将从1运行到b,而矩阵只有维m(小于b)。

相反,您必须分别收集所有三个维度:

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

和(如上所述)最终丢弃一些不必要的输出参数(感谢代字号~运算符)。