2017-04-05 2 views
0
sous-échantillonnage

avec Snoop JPEG pour une image 4: 2: 2 Hor (YYCbCr) Je vois cela dans le SOF0:composants JPEG SOF0

Component[1]: ID=0x01, Samp Fac=0x21 (Subsamp 1 x 1), Quant Tbl Sel=0x00 (Lum: Y) 
Component[2]: ID=0x02, Samp Fac=0x11 (Subsamp 2 x 1), Quant Tbl Sel=0x01 (Chrom: Cb) 
Component[3]: ID=0x03, Samp Fac=0x11 (Subsamp 2 x 1), Quant Tbl Sel=0x01 (Chrom: Cr) 

maintenant où sont les valeurs 0x21 et 0x11 viennent?

Je sais que les facteurs d'échantillonnage sont stockés comme ceci: (1byte) (bit 0-3 vertical., 4-7 horizontal.) mais je ne vois pas comment 0x11 se rapporte à 2x1 et 0x21 à 1x1. Je m'attendais à voir 0x11 pour le composant Y et non 0x21. (je ne sais pas comment vous obtenez 0x21 comme résultat). Est-ce que quelqu'un peut expliquer ces valeurs et comment vous les calculez par exemple 4: 2: 2 horizontal (16x8)?

Répondre

1

JPEG le fait bassackwarks. Les valeurs indiquent RELATIVE SAMPLING RATES. Le taux d'échantillonnage le plus élevé est pour Y (2). La fréquence d'échantillonnage pour Cb et Cr est 1. Utiliser la fréquence d'échantillonnage la plus élevée pour normaliser les pixels:

2Y = Cb = Cr. Y = 1/2 Cb = 1/2 Cr.

Pour chaque valeur de pixel Y dans cette direction, utilisez une valeur de pixel de 1/2 Cb et Cr.

Vous pourriez même avoir quelque chose comme selon la norme JPEG.

4Y = 3Cb = 1Co Y = 3/4CB = 1/4 Cr

ou

3Y = 2Cb = 1Co Y = 2/3Cb = 1/3Cr

Mais la plupart les décodeurs ne pouvaient pas gérer cela.

Les libellés tels que "4: 4: 4", "4: 2: 2" et "4: 4: 0" ne sont que des libellés qui ne figurent pas dans la norme JPEG. Franchement, je ne sais même pas d'où viennent ces termes et ils ne sont pas du tout intuitifs (il n'y a jamais d'échantillonnage nul). Permettez-moi d'ajouter une autre façon d'aborder ce problème. Mais d'abord, vous devez garder à l'esprit que la norme JPEG elle-même n'est pas implémentable. Les choses nécessaires pour encoder les images ne sont pas définies et la norme est tentaculaire avec des choses inutiles.

Si un balayage est entrelacé (les trois composants), il est codé en unités codées minimales (MCU). Un MCU est constitué de blocs codés 8x8. Le taux d'échantillonnage spécifie le nombre de blocs 8x8 dans un MCU.

Vous avez 2x1 pour Y + 1x1 pour Cb et 1x1 pour Cr. Cela signifie qu'un total de 4 blocs 8x8 sont dans un MCU. Alors que j'ai mentionné d'autres valeurs théoriques ci-dessus, le nombre maximum de blocs dans une MCU est de 10. Ainsi, 4x4 + 3x3 + 2x2 n'est pas possible.

La norme JPEG ne précise pas comment ces blocs sont mappés aux pixels d'une image. Nous utilisons généralement la valeur la plus grande et disons que cette onde est une zone 2x1 ou 16x8 pixels.

Mais toutes sortes de bizarreries est possible en vertu de la norme, tels que:

Y = 2x1, Cb = 1X2 Cr = 1x1

Cela signifierait probablement une carte MCU à un bloc de 16x16 pixels mais votre décodeur ne supporterait probablement pas cela. Alternativement, cela peut signifier qu'un MCA correspond à un bloc de 16x8 pixels et que le composant Cb a plus de valeurs dans la direction 8. Une dernière façon de voir cela (la manière pratique) est d'utiliser le composant Y comme point de référence. Supposons que Y aura toujours 1 ou 2 (et peut-être 4) comme taux d'échantillonnage dans les directions X et Y et que les taux sur Cb et Cr vont être 1 (et peut-être 2). Le composant Y toujours définit les pixels de l'image.

Ceux-ci seraient alors des possibilités réalistes:

Y Cb Cr 
1x1, 1x1, 1x1 
2x2, 1x1, 1x1 
4x4, 1x1, 1x1 
2x1, 1x1, 1x1 
1x2, 1x1, 1x1 
+0

Merci pour cette grande réponse détaillée. – juFo