【问题标题】:matlab histogram (with for loops)matlab直方图(带有for循环)
【发布时间】:2018-04-10 22:40:06
【问题描述】:

我正在做一个练习,我必须通过读取每个像素的值来绘制图像的直方图。然后我的想法是遍历每个颜色层(r,g,b)并将每个像素的值存储在矩阵中。以下代码运行,但它看起来不正确,我不完全确定为什么。第一个问题是该图不是带有垂直条和堆叠值的直方图(我该如何实现),第二个问题是该图很奇怪,因为它看起来对 r、g 和 b 应用了相同的值,这鉴于我正在使用的图像,这是不可能的。帮助?谢谢!

clc;
clear;

%% init values

% loading initial image
init_img = imread('face-1.jpg');

% rgb matrixes
r = zeros(256, 1);
g = zeros(256, 1);
b = zeros(256, 1);

%% main loop

% for each colour (r-g-b)
for a = 1:size(init_img, 3)

    % loop through eache layer of the image
    for i = 1:size(init_img, 1)
        for j = 1:size(init_img, 2)

           if(a == 1)
               for n = 1:size(r,1)
                if(n == init_img(i, j, 1))
                    % get value (x) from n(th) row, column 1
                    x = r(n, 1);                    
                    r(n, 1) = x+1;
                end
               end
           elseif(a == 2)
               for n = 1:size(g,1)
                if(init_img(i, j, 1) == n-1)
                    % get value (x) from n(th) row, column 1
                    x = g(n, 1);                    
                    g(n, 1) = x+1;
                end
               end
           elseif (a == 3)
               for n = 1:size(b,1)
                if(init_img(i, j, 1) == n-1)
                    % get value (x) from n(th) row, column 1
                    x = b(n, 1);                    
                    b(n, 1) = x+1;
                end
               end
           end          
        end
    end
end

%% plot

plot(r, 'Red');
hold('on');
plot(g, 'Green');
hold('on');
plot(b, 'Blue');

【问题讨论】:

  • 为什么不直接在图片上使用 hist 函数呢?
  • 您不是在绘制直方图,而是在使用仅绘制单个点的 plot 函数。使用 hist 或 bar 获取您想要的图表。

标签: matlab plot histogram


【解决方案1】:

也许这样的事情会有所帮助:

我稍微更改了您的代码并提出了以下内容。 我通过遍历图像来检索像素值并将其存储在相应的 bin 中。我使用的是bar 而不是plot(参见here

% loading initial image
init_img = imread('test.jpg');

% rgb matrixes
r = zeros(256, 1);
g = zeros(256, 1);
b = zeros(256, 1);

%% main loop

for i = 1:size(init_img, 1)
   for j = 1:size(init_img,2)
       pix = init_img(i,j,1:3);

       r(pix(1)+1) = r(pix(1)+1) + 1;
       g(pix(2)+1) = g(pix(2)+1) + 1;
       b(pix(3)+1) = b(pix(3)+1) + 1;
   end
end

%% plot
subplot(2,1,1);
title('histogram using for loops');
hold('on');
bar(r);
bar(g);
bar(b);

%% compare data
subplot(2,1,2);
title('imhist');
hold('on');
imhist(init_img(:,:,1));
imhist(init_img(:,:,2));
imhist(init_img(:,:,3));

我在最后添加了一个使用imhist 的比较部分(有关文档,请参阅here)。 如果这不符合您的要求,请查看histogram (here)。

脚本将打印以下内容(注意图中的颜色与像素对应的颜色不匹配):

【讨论】:

  • 您好,您的解决方案看起来很棒!我对 matlab 还是很陌生,对如何处理矩阵有点困惑。只是一件事,我尝试了代码,但没有得到 3 种不同的颜色。可能是什么原因?我附上了图片。谢谢!
  • 这很有趣。您是否检查过所有颜色数组(例如r)是否已填充?并确保您使用hold on。在任何情况下,您都可以尝试在图中指定颜色,例如bar(r,'r') 红色
  • 成功了..默认情况下所有颜色都设置为相同..我已经指定了它们,但看起来没问题..谢谢!我确实有最后一个问题..你能澄清以下行中的 +1:r(pix(1)+1) 吗?
  • 太棒了!我猜像素值的范围是从 0 到 255。但是,matlab 矩阵的索引是从 1 开始的。这就是为什么我简单地做了pix(1)+1 将范围转移到 1 到 256。行中的最后一个 +1 是增加桶数。
【解决方案2】:

你正在阅读init_img的第一个平面三遍!你应该改为阅读init_img(i,j,a)

除此之外: - 如果你对每个 a 做不同的事情,为什么要在 a 上循环?不妨删除循环和条件。 - 不要循环n。可以直接设置n=init_img(i,j,a)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    相关资源
    最近更新 更多