我正在做练习,我必须通过读取每个像素的值来绘制图像的直方图。然后我的想法是遍历每个颜色层(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');
答案 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)。
如果这不符合您的要求,请查看histogram
(here)。
脚本将打印以下内容(请注意,图中的颜色与像素的对应颜色不匹配):
答案 1 :(得分:0)
你正在阅读init_img
的第一架飞机三次!您应该阅读init_img(i,j,a)
。
除此之外:
- 如果你为每个a做一些不同的事情,为什么循环呢?不妨删除循环和条件。
- 不要越过n。您可以直接设置n=init_img(i,j,a)
。