怀疑越界Octave
Suspect out of bounds Octave
我正在尝试通过转换图片 (80*120) 的 rgb 值来制作一种 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 函数。注释行似乎有问题。
问题出在 size()
函数中。
如果此类图像是 RGB,则矩阵 Image
将是 3D 矩阵,但在您的 size()
函数中,您只是收集两个输出,这将导致不正确的结果。
您必须收集所有三个输出(对于所有三个维度),然后最终丢弃第三个(我们知道它是 3)。尝试做:
[n,m,~]=size(Image);
更多详细信息,如果您的矩阵大小为 n x m x q
但您只要求两个输出,例如
[a,b]=size(Image);
你将有 a=n
和 b=m*q
。
这些结果显然是不正确的,因为 since q>1
then b>m
where m
is (again) the actual dimension size and you'll experience the out-of-bounds error.换句话说,循环将从 1
到 b
运行 而矩阵只有维度 m
(小于 b
)。
相反,您必须分别收集所有三个维度:
[a,b,c]=size(Image);
and(如上所述)最终丢弃了一些不必要的输出参数(感谢波浪号 ~
运算符)。
我正在尝试通过转换图片 (80*120) 的 rgb 值来制作一种 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 函数。注释行似乎有问题。
问题出在 size()
函数中。
如果此类图像是 RGB,则矩阵 Image
将是 3D 矩阵,但在您的 size()
函数中,您只是收集两个输出,这将导致不正确的结果。
您必须收集所有三个输出(对于所有三个维度),然后最终丢弃第三个(我们知道它是 3)。尝试做:
[n,m,~]=size(Image);
更多详细信息,如果您的矩阵大小为 n x m x q
但您只要求两个输出,例如
[a,b]=size(Image);
你将有 a=n
和 b=m*q
。
这些结果显然是不正确的,因为 since q>1
then b>m
where m
is (again) the actual dimension size and you'll experience the out-of-bounds error.换句话说,循环将从 1
到 b
运行 而矩阵只有维度 m
(小于 b
)。
相反,您必须分别收集所有三个维度:
[a,b,c]=size(Image);
and(如上所述)最终丢弃了一些不必要的输出参数(感谢波浪号 ~
运算符)。