我有一项任务,我必须将RGB图像作为输入,然后为三个不同的通道绘制直方图(红色,绿色和 Blue )分别使用MATLAB。
这是我先写的代码:
function histogram_rgb(image)
values1 = zeros(1, 256);
values2 = zeros(1, 256);
values3 = zeros(1, 256);
[rows, cols, c] = size(image);
for c1 = 1:rows
for c2 = 1:cols
values1(1, image(c1, c2, 1)) = values1(1, image(c1, c2, 1)) + 1;
values2(1, image(c1, c2, 2)) = values2(1, image(c1, c2, 2)) + 1;
values3(1, image(c1, c2, 3)) = values3(1, image(c1, c2, 3)) + 1;
end
end
figure;
subplot(1, 3, 1);
bar((1:256), values1);
title('Histogram for the Image - Red');
subplot(1, 3, 2);
bar((1:256), values2);
title('Histogram for the Image - Green');
size(values3)
subplot(1, 3, 3);
bar((1:256), values3);
title('Histogram for the Image - Blue');
end
但这给了我以下错误:
下标索引必须是实数正整数或逻辑。
我搜索了这个错误,发现当数组索引出错时会发生这种错误。然后我编辑了我的代码,修复了这个错误。我唯一做的就是编辑以下行:
values3(1, image(c1, c2, 3)) = values3(1, image(c1, c2, 3)) + 1;
错误在哪里。我所做的就是在索引中添加1,如下所示:
values3(1, image(c1, c2, 3) + 1) = values3(1, image(c1, c2, 3) + 1) + 1;
我的问题是为什么会这样?我的意思是,这个索引适用于前两个数组,那为什么不是这个为什么当我向索引添加1时它会运行?
提前致谢。
答案 0 :(得分:2)
对于后代,答案是你的图像在某些通道的强度介于[0,255]
之间,但由于MATLAB的索引开始为1,因此通道中任何值为0的强度都会给你一个越界错误。这仅适用于您的某些频道,因此您不会看到其他频道的错误。因此,您实际上需要将每个通道的强度移动1以访问正确的元素以填充矩阵。还应注意,如果您的图像是整数类型,例如uint8
。如果您只是添加1,则已经为255的强度将饱和为255而不会达到256.因此,在计算直方图之前临时将图像转换为double
非常重要1。
因此,在您的双for
循环中,请执行以下操作:
for c1 = 1:rows
for c2 = 1:cols
pix = double(image(c1, c2, :)) + 1; % New
values1(1, pix(1)) = values1(1, pix(1)) + 1; % Change
values2(1, pix(2)) = values2(1, pix(2)) + 1; % Change
values3(1, pix(3)) = values3(1, pix(3)) + 1; % Change
end
end
以上内容的好处是我们将单个位置的所有频道转换为double
,然后将其加1。然后我们可以使用此像素中的每个通道填充直方图。
答案 1 :(得分:-1)
这是一项非常简单的任务,使用matlab中的hist
函数提供:
function histogram_rgb(image)
titles = {'R', 'G', 'B'};
for i=1:3
subplot(1, 3, i);
values = image(:, :, i);
hist(values(:), 1:10:256);
title(titles{i});
end