Niveaux de gris de l'image compression en utilisant le Codage de Huffman dans MATLAB
Je suis en train de compresser une image en niveaux de gris en utilisant le codage de Huffman en MATLAB, et ont essayé le code suivant.
J'ai utilisé une image en niveaux de gris de taille 512x512 en tif
format. Mon problème est que la taille de l'image compressée (longueur de comprimé de mots de code) devient plus grande que la taille de l'image non compressée. Le taux de compression est d'arriver à moins de 1.
clc;
clear all;
A1 = imread('fig1.tif');
[M N]=size(A1);
A = A1(:);
count = [0:1:255]; % Distinct data symbols appearing in sig
total=sum(count);
for i=1:1:size((count)');
p(i)=count(i)/total;
end
[dict,avglen]=huffmandict(count,p) % build the Huffman dictionary
comp= huffmanenco(A,dict); %encode your original image with the dictionary you just built
compression_ratio= (512*512*8)/length(comp) %computing the compression ratio
%% DECODING
Im = huffmandeco(comp,dict); % Decode the code
I11=uint8(Im);
decomp=reshape(I11,M,N);
imshow(decomp);
OriginalL'auteur parvathy | 2014-09-22
Vous devez vous connecter pour publier un commentaire.
Il y a une légère erreur dans votre code. Je suis en supposant que vous voulez calculer la probabilité de rencontrer chaque pixel, ce qui est l'histogramme normalisé. Vous n'êtes pas le calcul correctement. Plus précisément:
total
est sommation sur[0,255]
qui n'est pas correct. Vous êtes censé pour calculer la distribution de probabilité de votre image. Vous devez utiliserimhist
à la place. En tant que tel, vous devez faire ceci à la place:Cela permettra de calculer correctement votre distribution de probabilité pour votre image. Rappelez-vous, quand vous faites le codage de Huffman, vous devez spécifier la probabilité de rencontre d'un pixel. En supposant que chaque pixel peut également être susceptible d'être choisi, ce qui est capturé par le calcul de l'image de l'histogramme, puis la normalisation par le nombre total de pixels dans l'image. Essayer cela et voir si vous avez de meilleurs résultats.
Cependant, Huffman ne fera que vous donner de bons taux de compression si vous avez fréquemment des symboles. Avez-vous arrive de prendre un coup d'oeil à l'histogramme ou la diffusion de vos pixels dans l'image?
Si l'écart est assez grand, avec très peu de participations par bin, alors Huffman ne vous donnera pas de compression d'épargne. En fait, il peut vous donner un plus taille. Gardez à l'esprit que la
TIFF
norme de compression utilise uniquement Huffman dans le cadre de l'algorithme. Il y a aussi quelques pré - et post-traitement afin d'en poursuivre la route jusqu'à la taille.Comme un autre exemple, supposons que j'ai eu une image qui se composait de
[0, 1, 2, ... 255; 0, 1, 2, ..., 255; 0, 1, 2, ..., 255];
j'ai 3 lignes de[0,255]
, mais vraiment, il pourrait être n'importe quel nombre de lignes. Cela signifie que la probabilité de rencontrer chaque symbole est équiprobable, ou1/255
, ce qui signifie que, pour chaque symbole, nous aurions besoin de 8 bits par symbole... qui est essentiellement le raw valeur de pixel de toute façon!La clé derrière Huffman est qu'un groupe de bits, ensemble, génèrent un symbole. Fréquentes des symboles affectées à une petite séquence de bits. Car avec cette image que j'en ai parlé a des intensités qui sont équiprobable, alors vous feriez seulement de générer un symbole par l'intensité plutôt que d'un groupe. Avec cela, non seulement vous transmettre le dictionnaire, vous devez efficacement l'envoi d'un caractère à la fois, et ce n'est pas mieux que d'envoyer le raw de flux d'octets.
Si vous voulez que votre image à être comprimé par raw Huffman, la distribution des pixels doit être biaisée. Par exemple, si la plupart des intensités de l'image sont sombres ou lumineuses. Si votre image a un bon contraste ou si la propagation de la intensités des pixels est plat tout au long de l'image, puis de Huffman ne vous donnera pas de compression d'épargne.
J'ai essayé d'exécuter le code. Cependant, quand je lance, comme donné dans la question de savoir compter = [0:1:255]; % de données Distinctes symboles figurant dans sig total=somme(nombre); for i=1:1:taille((count)'); p(i)=count(i)/total; fin le code ne se termine jamais. Alors j'ai essayé de courir comme celui proposé dans la réponse, j'obtiens une erreur: Erreur à l'aide de huffmandict (ligne 171) Source des symboles de répétition de l'Erreur dans Huffman (ligne 10) [dict,avglen]=huffmandict(comte,p) La seule différence, c'est: je prends une image RVB et le convertir en niveaux de gris. Pouvez-vous m'aider s'il vous plaît?
n'est pas calculée correctement lorsque vous faites référence à la question d'origine. J'ai spécifiquement point que dans ma réponse et conseillé les OP à utiliser
imhist
à la place. Si vous n'avez pasimhist
car il fait partie de la boîte à outils de traitement d'image, l'utilisationaccumarray
:p = accumarray(double(A(:)) + 1, 1, [256 1]) / numel(A);
.A
est l'image d'entrée.Je me suis trompé.
count
devrait être au même. C'est lep
qui est incorrect qui j'ai corrigé dans mon post. Veuillez voir les modifications. Bonne chance.je vous remercie beaucoup. Il a travaillé!
OriginalL'auteur rayryeng