2014-04-25 4 views
1

Je possède ce programme simple:Matlab mal dans la multiplication de tableau?

% Read Image: 
I=imread('Bureau.bmp'); 

% calculate Hist: 
G= unique(I); % Calculate the different gray values 
Hist= zeros(size(G)); % initialize an array with the same size as G 

% For each different gray value, loop all the image, and each time you find 
% a value that equals the gray value, increment the hist by 1 
for j=1:numel(G) 
    for i= 1:numel (I) 

    if G(j)== I(i) 
     Hist(j)=Hist(j)+1; 
    end 

    end   
end 

Maintenant, regardez cette multiplication:

>> G(2) 

ans = 

    1 

>> Hist(2) 

ans = 

    550 

>> Hist(2)*G(2) 

ans = 

    255 

Et il me donne 255 non seulement pour l'indice 2, mais pour toute combinaison d'indices!

Répondre

3

Deux choses pour votre problème. D'abord, voici la raison de votre problème de multiplication: différents types. I et G sont de type uint8. H est de type double. Lorsque vous effectuez la multiplication, Matlab semble utiliser le type le plus restrictif, alors voici uint8. Ainsi, le résultat de Hist(2)*G(2) est de type uint8, compris entre 0 et 255.

Deuxièmement: s'il vous plaît NE PAS calculer un histogramme de cette façon. Matlab a de nombreuses fonctions pour cela (hist et histc pour les plus courantes), donc s'il vous plaît lisez le doc et utilisez-le au lieu de créer votre propre code. Si vous voulez néanmoins écrire votre propre fonction (but d'apprentissage), ce code est beaucoup trop lent. Vous parcourez l'image environ 256 fois, c'est inutile. Au lieu de cela, d'une manière classique serait:

Hist = zeros(1,256); 
for i=1:numel(I) 
    Hist(int32(I(i))+1) = Hist(int32(I(i))+1)+1 
end 

Vous utilisez directement la valeur du pixel courant (+1 parce que l'indice commence à 1 dans Matlab) pour accéder à l'emplacement correspondant de votre histogramme. En outre, vous devez convertir la valeur du pixel en int32, pour éviter le problème de la valeur 255 (avec les variables uint8, 255 + 1 = 0). Je ne veux pas ici être pédant, mais Matlab vient avec des milliers de fonctions (sans mentionner les dizaines de boîtes à outils) et un doc très bien écrit, donc s'il vous plaît lisez-le et utilisez tous les éléments que vous pouvez trouver à l'intérieur, C'est le meilleur conseil que je puisse donner à quiconque commence à apprendre Matlab.

+0

Vous m'avez sauvé la vie merci! – Apastrix

Questions connexes