2017-10-30 6 views
0

Ich mache eine Übung, bei der ich das Histogramm eines Bildes durch Ablesen des Wertes jedes Pixels darstellen muss. Dann ist es meine Idee, jede Farbschicht (r, g, b) zu durchlaufen und für jedes Pixel den Wert in einer Matrix zu speichern. Der folgende Code läuft aber da sieht es nicht richtig aus und ich bin mir nicht ganz sicher warum. Das erste Problem ist, dass das Diagramm kein Histogramm mit vertikalen Balken und gestapelten Werten ist (wie kann ich das erreichen) und das zweite Problem ist, dass das Diagramm seltsam ist, da es scheint, als würden die gleichen Werte für r, g und b angewendet ist nicht möglich mit den Bildern, die ich benutze. Hilfe? Vielen Dank!Matlab-Histogramm (mit for-Schleifen)

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

+0

, warum Sie nicht nur die auf dem Bild hist Funktion ? –

+0

Sie zeichnen keine Histogramme, sondern die Plot-Funktion, die nur einzelne Punkte darstellt. Verwenden Sie hist oder bar, um die gewünschten Diagramme zu erhalten. – Eppicurt

Antwort

1

Vielleicht so etwas wie dies hilft:

ich Ihren Code ein wenig verändert und kam mit dem Follow-up. Ich erhalte den Pixelwert durch Iterieren durch das Bild und speichern Sie es in der entsprechenden Bin. Statt plot ich bar bin mit (siehe 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)); 

ich einen Abschnitt am Ende vergleichen hinzugefügt, die imhist verwendet (here zur Dokumentation). Wenn dies Ihren Anforderungen nicht entspricht, werfen Sie einen Blick auf histogram (here).

Das Skript die folgenden (beachten Sie, dass die Farbe in den Stellplätzen die entsprechende Farbe der Pixel nicht übereinstimmt) druckt:

comparison

+0

Hallo, deine Lösung sieht gut aus! Ich bin noch neu in Matlab und ein wenig verwirrt, wie man mit Matrizen umgeht. Nur eine Sache, ich habe den Code ausprobiert, aber ich bekomme nicht die 3 verschiedenen Farben. Was könnte der Grund sein? Ich habe das Bild angehängt. Vielen Dank! –

+0

das ist interessant. Haben Sie überprüft, dass alle Farbfelder (z. B. "r") gefüllt sind? und stellen Sie sicher, dass Sie 'halten 'verwenden. In jedem Fall könnten Sie versuchen, die Farbe in der Auftragung z.B. 'bar (r, 'r')' für rot – foo

+0

, die es gemacht..by default alle Farben wurden eingestellt, um die gleichen..Ich habe sie angegeben und nicht es sieht ok..danke! Ich habe eine letzte Frage ... können Sie die +1 in den Zeilen klären: r (pix (1) +1)? –

0

Sie lesen die erste Ebene von init_img dreimal! Sie sollten stattdessen init_img(i,j,a) lesen.

Andere als das: - Warum die Schleife über eine wenn Sie etwas anderes für jedes a tun? Könnte auch die Schleife und die Bedingungen entfernen. - Schleife nicht über n. Sie können n=init_img(i,j,a) direkt einstellen.