Bhinish Dhiman

Quelle part d'un QR code un logo peut-il couvrir ? Nous l'avons mesuré

Traduit de l’original en anglais. Lire l’original

Un logo centré peut couvrir environ 4.3 % de la surface d'un QR code au niveau de correction d'erreurs L, 9.2 % au niveau M, 14.3 % au niveau Q et 19.3 % au niveau H, d'après environ 5 000 essais de décodage. Le chiffre de 30 %, repris partout, est une mauvaise lecture de la norme : ISO/IEC 18004 indique que le niveau H récupère 30 % des mots de code du symbole, ce qui ne représente pas 30 % de sa surface visible.

Cherchez quelle taille peut avoir un logo sur un QR code et on vous répondra 30 %, sur presque toutes les pages, généralement au niveau H. Nous n’avons pas trouvé la mesure derrière ce chiffre, alors nous l’avons faite.

Ce que dit réellement la norme

La clause 5.1 de la norme ISO/IEC 18004 définit les quatre niveaux de correction d’erreurs par ce qu’ils récupèrent :

permettant la récupération des mots de code du symbole (symbol codeword recovery) à hauteur de : L : 7 % ; M : 15 % ; Q : 25 % ; H : 30 %.

Une seule expression porte tout le malentendu : récupération des mots de code (codeword recovery). Un mot de code représente huit modules de données encodées. Trente pour cent des mots de code, ce n’est pas trente pour cent de l’image, et trois facteurs creusent l’écart.

Les motifs de repérage, de synchronisation et d’alignement ne bénéficient d’aucune correction d’erreurs. C’est grâce à eux qu’un lecteur localise et oriente le symbole avant que le décodage ne commence. Sur un code de version 1, ils occupent 52.8 % de la surface ; sur un code de version 40, 5.4 %. Masquez-en une partie et aucun niveau de correction ne vous sauvera, car la correction n’a pas encore commencé.

Un logo est une tache d’un seul tenant, et un impact partiel vaut une perte totale. La correction d’erreurs travaille sur des mots de code entiers. Un logo qui mord sur le coin d’un mot de code le détruit aussi complètement que s’il le recouvrait en entier.

La correction s’applique bloc entrelacé par bloc entrelacé, sans mise en commun. Un symbole est découpé en blocs, chacun avec son propre budget de récupération. Une tache concentrée sur deux blocs peut les épuiser pendant que le reste du symbole reste intact, avec du budget à revendre.

La mesure

Nous avons encodé quatre contenus à chacun des quatre niveaux de correction d’erreurs, superposé un masque carré centré, agrandi ce masque d’un module à la fois et tenté un décodage après chaque étape. Chaque essai passait par un modèle d’appareil photo plutôt que par un rendu propre : sous-échantillonnage à un nombre fixe de pixels par module, flou de 0.8px, bruit gaussien à σ=6 et compression JPEG à la qualité 70.

Environ 5 000 essais de décodage au total. Pour une URL typique de 54 caractères :

Correction d’erreurs Plus grand logo encore décodable « Récupération » nominale
L 4.3 % de la surface 7 %
M 9.2 % 15 %
Q 14.3 % 25 %
H 19.3 % 30 %

Même au niveau H, sur le contenu le plus long que nous ayons testé, le plafond était de 22.4 %. Rien de ce que nous avons mesuré ne s’est approché de 30 %.

Ce qui devrait changer votre façon de tester

La correction Reed–Solomon ne se dégrade pas progressivement. Sur tous les niveaux et toutes les résolutions testés, un symbole se décodait 100 % du temps jusqu’au dernier module supportable, et 0 % un module plus loin. Il n’existe aucune zone où cela fonctionne de temps en temps.

C’est important à cause de la façon dont on vérifie un QR code : on le scanne avec son téléphone, ça marche, on l’envoie à l’impression. Un scan réussi vous dit que vous êtes du bon côté de la falaise. Il ne vous dit rien de la distance qui vous sépare du bord, et c’est au bord qu’une impression usée, un capteur photo moins cher ou un angle plus prononcé vous fait basculer de l’autre côté.

C’est l’argument pour calculer la marge plutôt que de la tester. Notre générateur de QR code affiche la part du budget de correction d’erreurs que consomme un logo, pour que vous voyiez la distance qui vous sépare de la falaise au lieu de la découvrir après un tirage.

Trois autres résultats qui contredisent les conseils habituels

Les modules arrondis ou en forme de points ne coûtent rien, jusqu’à environ 0.7× de diamètre. L’avertissement courant selon lequel les modules arrondis nuisent à la lisibilité n’est pas confirmé par nos mesures, à condition que les trois motifs de repérage des coins restent des carrés pleins.

Styliser les motifs de repérage, voilà le vrai dégât, et la correction d’erreurs ne peut pas le réparer. Des motifs de repérage en pointillés ont obtenu un taux de lecture identique de 60 % en L, M, Q et H. Un résultat plat sur les quatre niveaux, parce qu’il s’agit d’un échec de détection et non de correction : le lecteur ne parvient pas à localiser le symbole, donc la correction ne s’exécute jamais. C’est l’argument le plus solide contre le « mettez-le en H et tout ira bien ».

La teinte ne compte pas ; seule la luminance compte. Du vert sur du rouge, une association qui paraît manifestement mauvaise, a échoué. Du rouge sur du bleu, tout aussi maladroit à l’œil, s’est décodé de façon fiable. La mesure qui fait foi est le Symbol Contrast de la norme ISO/IEC 15415, une différence de réflectance notée de A à F, et ce n’est pas un rapport WCAG. Le WCAG mesure la lisibilité du texte pour l’œil humain ; un capteur photo est un autre instrument. La plupart des pages qui répondent à « quel contraste faut-il pour un QR code » citent des chiffres WCAG, ce qui est la mauvaise unité pour la question.

La règle de distance 10:1 ne repose sur rien

La règle selon laquelle la distance de lecture peut atteindre dix fois la largeur du symbole est partout, et ne figure dans aucune norme : ISO/IEC 18004 ne fixe aucune taille minimale de module. Ce que nous avons mesuré, c’est un seuil en pixels de capteur par module : en dessous d’environ 2.5 pixels par module, le taux de décodage s’effondre brutalement.

La règle se trompe donc dans les deux sens, car elle ignore le nombre de modules. Un code de version 2 et un code de version 20 imprimés à la même taille ont des modules dont la taille diffère de 2.3×, et donc des distances de lecture très différentes. Un seul chiffre ne peut pas décrire les deux.

À savoir également : les téléphones décodent à partir du flux d’aperçu de l’appareil photo, pas d’une photo en pleine résolution. Un capteur de 12 mégapixels ne vous donne pas 12 mégapixels de décodage, et c’est pourquoi le calcul physique paraît bien plus optimiste que l’expérience quotidienne.

Réserves, dites clairement

Tous les décodages ci-dessus ont utilisé une seule implémentation de décodeur. Elle est mesurablement plus tolérante qu’un vérificateur d’impression, et peut-être plus tolérante que le téléphone médian : considérez donc ces chiffres comme une limite haute plutôt que comme une garantie. Le modèle de budget de notre outil est volontairement réglé du côté prudent de nos mesures : il prédit la falaise à un module près, et penche plutôt vers le message qu’un logo est trop grand.

La méthode, les scripts et les chiffres bruts se trouvent dans le dépôt de ce site. Si vous refaites l’expérience avec un autre décodeur et obtenez d’autres chiffres, nous aimerions le savoir.