【问题标题】:Suspect out of bounds Octave怀疑越界八度
【发布时间】:2016-07-14 09:46:51
【问题描述】:

我试图通过转换图片的 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 函数。注释行似乎是有问题的行。

【问题讨论】:

  • 如果注释行是引发错误的行,考虑到该行包含您的rgb2hsv(),您也应该附上此类函数的代码。否则我们无能为力。显然该函数内部有问题。
  • rgb2hsv 函数是此处描述的函数rapidtables.com/convert/color/rgb-to-hsv.htm。唯一的区别是我在 [0,100] 区间中有 H S V。 H=(H/360) * 100, S = (delta/Cmax) * 100, V = Cmax * 100

标签: matlab image-processing octave rgb hsv


【解决方案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&gt;1 然后b&gt;m 其中m (再次)是实际尺寸大小,您将遇到越界错误。换句话说,循环将从1 运行到b,而矩阵只有维度m(小于b)。

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

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

并且(如上所述)最终会丢弃一些不必要的输出参数(感谢波浪号 ~ 运算符)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2018-10-04
    • 2017-10-01
    • 2016-09-06
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多