在MATLAB

时间:2016-08-14 23:56:24

标签: arrays matlab image-processing histogram rgb

我有一项任务,我必须将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时它会运行?

提前致谢。

2 个答案:

答案 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