Transformée en cosinus discrète (DCT) d'une image
Je travaille sur une fonction Matlab qui calcule la DCT (discrete cosine transform) d'une image. Je ne sais pas ce qui ne fonctionne pas dans mon code, mais j'ai eu une image de sortie avec le même numéro. Je veux utiliser cette formule pour mon DCT.
Des idées s'il vous plaît.
function image_comp = dctII(image, b)
[h w] = size(image);
image = double(image) - 128;
block = zeros(b,b);
image_t=zeros(size(image));
for k=1:b:h
for l=1:b:w
image_t(k:k+b-1,l:l+b-1)= image(k:k+b-1,l:l+b-1);
for u=1:b
for v=1:b
if u == 0
Cu = 1/sqrt(2);
else
Cu = 1;
end
if v == 0
Cv = 1/sqrt(2);
else
Cv = 1;
end
Res_sum=0;
for x=1:b;
for y=1:b
Res_sum = Res_sum + ((image_t(x,y))*cos(((2*x)+1)*u*pi/(2*b))*cos(((2*y)+1)*v*pi/(2*b)));
end
end
dct= (1/4)*Cu*Cv*Res_sum;
block(u,v) = dct;
end
end
image_comp(k:k+b-1,l:l+b-1)=block(u,v);
end
end
end
Vous code fonctionne avec la correction mentionnée ci-dessous. Mais je vous suggère de lire de boucles, sinon vous aurez des ennuis de travailler avec un grand nombre de données.
OriginalL'auteur user2827482 | 2013-09-29
Vous devez vous connecter pour publier un commentaire.
Dans l'intérieur de la boucle sur x et y, vous ne lisez pas la bonne place dans image_t. Vous avez copié le bloc local dans un emplacement avec k,l comme le coin supérieur gauche pour une utilisation dans le traitement, mais dans l'intérieur de la boucle, vous êtes toujours la lecture à partir du même bloc qui commence à 1,1 comme le coin supérieur gauche de image_t.
L'inverse DCT pour votre type II DCT est le type III DCT. C'est une simple question de changer les mathématiques légèrement. Voir les sections DCT-II et DCT-III: en.wikipedia.org/wiki/Discrete_cosine_transform
OriginalL'auteur mikeTronix