matlab直方图(带for循环)

时间:2017-10-30 01:24:25

标签: matlab plot histogram

我正在做练习,我必须通过读取每个像素的值来绘制图像的直方图。然后我的想法是遍历每个颜色层(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');

histogram

2 个答案:

答案 0 :(得分:1)

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

我稍微改变了你的代码并想出了以下内容。 我通过迭代图像并将其存储在相应的bin中来检索像素值。而不是plot我使用bar(请参阅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)。 如果这不符合您的要求,请查看histogramhere)。

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

comparison

答案 1 :(得分:0)

你正在阅读init_img的第一架飞机三次!您应该阅读init_img(i,j,a)

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