2017-02-22 2 views
1

Wie berechnet man die Intensität jedes RGB-Farbkanals eines Bildes als Prozentsatz über Matlab? Der folgende Matlab-Code funktioniert nicht richtig:Wie berechnet man die Intensität jedes RGB-Farbkanals eines Bildes als Prozentsatz über Matlab?

I = imread('3.png'); % read image 

Ir=I(:,:,1); % read red chanel 
Ig=I(:,:,2); % read green chanel 
Ib=I(:,:,3); % bule chanel 

% figure, imshow(I), title('Original image') 
% figure, imshow(Ir), title('Red channel') 
% figure, imshow(Ig), title('Green channel') 
% figure, imshow(Ib), title('Blue channel') 

%% read the size of the 
m = size(I,1); 
n = size(I,2); 


R_total= 0; 
G_total= 0; 
B_total= 0; 

for i = 1:m 
      for j = 1:n 

       rVal= int64(Ir(i,j)); 
       gVal= int64(Ig(i,j)); 
       bVal= int64(Ib(i,j)); 

       R_total= R_total+rVal; 
       G_total= G_total+gVal; 
       B_total= B_total+bVal; 

      end  
end 

disp (R_total) 
disp (G_total) 
disp (B_total) 

%% Calcualte the image total intensity 
I_total = R_total + G_total + B_total; 
disp(I_total) 


%% Calculate the percentage of each Channel 

R_precentag = R_total/I_total * 100 ; %% Red Channel Precentage 
G_precentag = G_total/I_total * 100 ; %% Green Channel Precentage 
B_precentag = B_total/I_total * 100 ; 

Ich kann die prozentuale Intensität jeden Kanals R, G, B. nicht sehen

Jede Idee, wie das Problem zu lösen?

Antwort

3

MATLAB speichert den Datentyp nach der Division. Da rval, gval und bval sind ursprünglich als int64 gespeichert, wird diese Einheit Typ in R_total propagierte G_total, B_total und I_total. Wenn Sie versuchen, diese Werte zu teilen, um die Prozentwerte zu finden, wird zuerst die Division ausgeführt (MATLAB arbeitet von links nach rechts, wenn die Operationen den gleichen Vorrang haben, wie Multiplikation und Division). Das Ergebnis dieser Division behält den Einheitentyp int64 bei. Da die Summe der einzelnen Farbkanäle kleiner ist als die Summe, ist das Ergebnis ein Wert zwischen null und eins. Da eine Ganzzahl keine Fließkommazahl speichern kann, wird das Ergebnis auf Null oder Eins gerundet.

Um diese Zahlen korrekt zu teilen sich die Prozentsätze zu finden, die sie zuerst in die Doppeleinheitstyp umwandeln, wie:

R_precentag = double(R_total)/double(I_total) * 100; 

Oder alternativ speichern Sie die rval, bval und gval Variablen als Doppel zu beginnen .

Nebenbei kann Ihr Code drastisch verbessert werden, indem MATLABs Matrix-Vektorisierung (die Addition von (:) am Ende einer Matrix konvertiert die Matrix in einen Vektor durch Stapeln der Spalten), und integrierte Funktionen wie als sum. Als Bonus akkumuliert sum sein Ergebnis standardmäßig als Double, wodurch die Notwendigkeit entfällt, jeden Wert manuell zu konvertieren.

z.B. Ihr vereinfachter Code könnte etwa so aussehen:

I = imread('3.png'); % read image 

Ir=I(:,:,1); % read red channel 
Ig=I(:,:,2); % read green channel 
Ib=I(:,:,3); % read blue channel 

R_total= 0; 
G_total= 0; 
B_total= 0; 

R_total = sum(Ir(:)); 
G_total = sum(Ig(:)); 
B_total = sum(Ib(:)); 

disp (R_total) 
disp (G_total) 
disp (B_total) 

%% Calculate the image total intensity 
I_total = R_total + G_total + B_total; 
disp(I_total) 


%% Calculate the percentage of each Channel 
R_precentag = R_total/I_total * 100 ; %% Red Channel Percentage 
G_precentag = G_total/I_total * 100 ; %% Green Channel Percentage 
B_precentag = B_total/I_total * 100 ; 
+0

Ein Beispiel hinzugefügt, danke für den Hinweis. –

+0

Vergessen Sie nicht, vor dem Ausführen der Summen in Doppel zu konvertieren. – gnovice

+1

@gnovice Warum würden Sie zuerst zu Double konvertieren? "sum" hat keine Probleme, ganze Zahlen als Eingabe zu verwenden und wird standardmäßig ein "double" zurückgeben. –

Verwandte Themen