我试图通过转换图片的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函数。评论线似乎是有问题的。
答案 0 :(得分:1)
问题出在size()
函数中
如果此类图像为RGB,则矩阵Image
将为3D矩阵,但在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);
和(如上所述)最终丢弃一些不必要的输出参数(感谢代字号~
运算符)。