Exploiter le gradient local
L'idée clé de PVD est que la perception humaine n'est pas uniforme. Dans une zone lisse (ciel, mur uni), même une variation de 1 sur 255 peut être perceptible. Dans une zone de fort gradient (bord d'un objet, texture complexe), des variations de 20, 30 ou même 60 sur 255 sont imperceptibles.
PVD mesure ce gradient via la différence absolue entre deux pixels adjacents : d = |p₁ - p₂|. Plus d est grand, plus on peut cacher de bits dans cette paire de pixels, sans que l'œil ne détecte la modification.
Exemple concret — deux paires de pixels adjacents : Paire A (zone lisse) : p1 = 100, p2 = 101 → d = |100 - 101| = 1 → zone lisse, capacité 1 bit (d ∈ [0, 7]) Paire B (zone de bord) : p1 = 45, p2 = 198 → d = |45 - 198| = 153 → zone de fort gradient, capacité 4 bits (d ∈ [128, 255]) Bilan : même avec une image entière, PVD cache plus de bits dans les textures et les bords qu'aux zones uniformes — exactement là où l'œil est le moins sensible aux modifications.
Tableaux de rangées (range table)
PVD utilise un tableau de rangées prédéfini qui associe chaque plage de différences à un nombre de bits cachables. Ce tableau est partagé entre l'encodeur et le décodeur. La conception de ce tableau détermine le compromis capacité / qualité visuelle.
| Plage de d | Bits cachables | Zone typique |
|---|---|---|
| [0, 7] | 1 bit | Zone lisse |
| [8, 15] | 2 bits | Zone peu texturée |
| [16, 31] | 3 bits | Légère texture |
| [32, 63] | 4 bits | Texture modérée |
| [64, 127] | 5 bits | Forte texture |
| [128, 255] | 6 bits | Bords nets |
→ Ce tableau est le paramètre clé de PVD. On peut le modifier pour augmenter la capacité (plus de bits par rangée) ou améliorer la discrétion (moins de bits). L'essentiel : encodeur et décodeur doivent utiliser le même tableau.
Algorithme encode/decode
PVD ENCODE (paire de pixels p1, p2) : 1. Calculer d = p2 - p1 (avec signe) 2. |d| → chercher dans range table → nb bits t à cacher (ex: t=3) 3. Extraire t bits du message → valeur m (ex: m = 0b101 = 5) 4. Calculer nouvelle différence : d' = borne_basse_plage + m (si d ≥ 0) d' = -(borne_basse_plage + m) (si d < 0) 5. Ajuster les deux pixels pour que p2 - p1 = d' : Δ = (d' - d) / 2 p1' = p1 - floor(Δ) p2' = p2 + ceil(Δ) 6. Vérifier que p1' et p2' restent dans [0, 255] (cas limite → utiliser règle de bord) PVD DECODE (paire stéganographiée p1', p2') : 1. Calculer d' = p2' - p1' 2. |d'| → chercher dans range table → nb bits t + borne basse 3. m = |d'| - borne_basse_plage 4. Convertir m en t bits binaires → bits du message
L'ajustement des deux pixels est symétrique : la moitié de la variation est appliquée à chaque pixel de la paire. Cela minimise la perturbation visuelle par rapport à une modification d'un seul pixel, et maintient le gradient perçu dans la même zone de la range table.
Capacité et variantes
La capacité de PVD est adaptative : elle dépend du contenu de l'image. Une photo avec beaucoup de textures et de bords offre une capacité bien supérieure à une image très lisse. En moyenne, PVD offre 2 à 4 bits par paire de pixels sur des photos naturelles.
PVD tri-directionnel
VARIANTEApplique PVD dans trois directions (horizontal, vertical, diagonal) pour tripler la capacité. Chaque pixel participe à plusieurs paires.
PVD + LSB hybride
HYBRIDEZones lisses → LSB classique 1 bit. Zones de gradient → PVD 3-6 bits. Combine les avantages des deux méthodes.
PVD adaptatif (APD)
AVANCÉLa range table est calculée dynamiquement selon la distribution des différences dans l'image. Optimise le compromis PSNR/capacité.
PVD multi-canal
MULTI-CANALApplique PVD indépendamment sur les canaux R, G et B. Triple la capacité mais augmente le risque d'artefacts de couleur.
Détection et limites
PVD laisse une signature statistique caractéristique : la distribution des différences entre pixels adjacents présente des ruptures artificielles aux frontières des rangées. L'histogramme des différences montre des pics inhabituels aux valeurs limites (0, 7, 8, 15, 16, 31...).
De plus, PVD peut créer des artefacts de débordement(pixel values < 0 ou > 255) si les ajustements sont mal gérés aux bords des plages. Les implémentations naïves sont détectables par analyse de la distribution des valeurs de pixels.
⚠ Vulnérabilité principale : l'analyse statistique des différences entre pixels adjacents révèle les transitions abruptes aux frontières des rangées. Des outils comme StegExpose et StegoGAN peuvent détecter PVD.
Résistance visuelle
Indétectable à l'œil nu dans les zones texturées. PSNR typique > 42 dB sur photos naturelles.
Adaptatif au contenu
Cache plus là où c'est possible. Bien meilleur que LSB naïf en termes de capacité utile vs distorsion.
Artefacts de bord
Aux frontières des plages de la range table, des ruptures statistiques apparaissent dans la distribution.
Pas résistant aux transformations
Toute opération (redimensionnement, filtre, JPEG) détruit les données. Domaine spatial uniquement.
Questions fréquentes
Quelle est la différence entre PVD et LSB classique ?
LSB modifie le bit de poids faible de chaque pixel indépendamment, toujours 1 bit, qu'on soit dans une zone lisse ou texturée. PVD regarde la différence entre deux pixels adjacents (le gradient) pour décider combien de bits cacher : 1 bit dans les zones lisses, jusqu'à 6 bits dans les zones de fort gradient. Résultat : plus de capacité là où l'œil ne verra rien, moins là où ça serait visible.
Quelles images donnent les meilleurs résultats avec PVD ?
Les photos naturelles avec beaucoup de textures et de bords : portraits (cheveux, vêtements), paysages (feuillage, eau), photos urbaines (bâtiments, panneaux). Évitez les images très lisses (ciel uniforme, aplats de couleur) — PVD ne peut y cacher que peu de bits et risque de créer des artefacts visibles si on force la capacité.
Est-ce que PVD résiste à la recompression JPEG ?
Non. PVD opère dans le domaine spatial (sur les valeurs de pixels directement) et nécessite un format sans perte comme PNG ou BMP. Toute compression JPEG modifie les valeurs de pixels et détruira le message caché. Si l'image doit transiter par JPEG, préférez DCT ou Spread Spectrum.
Comment les analystes détectent-ils PVD ?
PVD laisse une signature statistique caractéristique : des ruptures artificielles dans la distribution des différences entre pixels adjacents, aux frontières des plages de la range table (valeurs 7, 8, 15, 16, 31, 32...). Des outils comme StegExpose analysent cet histogramme des différences et peuvent détecter PVD avec une bonne précision.
PVD peut-il servir au watermarking de photos ?
Oui, mais avec des limites. PVD est plutôt utilisé pour cacher des messages (stéganographie de communication) que pour le watermarking robuste. Un recadrage ou un redimensionnement modifiera les paires de pixels et détruira le message. Pour le watermarking robuste, préférez DWT ou Spread Spectrum qui résistent mieux aux transformations géométriques.
Expérimenter la stéganographie
PVD n'est pas encore disponible en outil interactif. Essayez LSB image, la technique la plus accessible pour débuter.