SWAPQR← Guía

Códigos QR de semitono vs códigos QR con dithering

Ambos enfoques meten una imagen dentro de un código QR funcional. No son la misma técnica, y puedes distinguirlos desde el otro lado de una sala: uno parece una imagen detrás de una mosquitera, el otro grano fotográfico. Este artículo explica qué hace cada uno, por qué se ven distintos, dónde uno gana claramente y dónde no gana ninguno.

Crea un código QR en el navegador →Imprime el cuadrado una vez. Decide después adónde lleva.

El método de semitono

El generador QR de semitono clásico, en circulación desde alrededor de 2013, triplica el tamaño del código. Cada módulo se convierte en un bloque de 3×3 subpíxeles. El subpíxel central se fija al color que exige el módulo; los otros ocho quedan libres para tomar lo que diga la imagen (ya umbralizada). Un escáner muestrea los centros de los módulos, así que los centros son lo que debe estar bien — y lo están. Funciona, y produce un aspecto reconocible: una rejilla regular de puntos sobre la imagen, porque cada tercer píxel en ambas direcciones está fijado y esos píxeles fijados se alinean perfectamente. Tu ojo es extremadamente bueno encontrando una retícula regular. Una vez que la ves, no puedes dejar de verla. El enfoque es sencillo de implementar y fácil de razonar, y por eso tantos generadores lo usan, y para un código que solo se verá en una pantalla a su tamaño nativo es perfectamente útil. Sus limitaciones aparecen en la impresión, donde nada se ve nunca a tamaño nativo y un solo píxel fijado por módulo tiene que sobrevivir por sí solo a la impresora, el papel, la iluminación y el remuestreo de la cámara.

El método con dithering

El enfoque con dithering cambia una cosa y eso lo cambia todo. En lugar de umbralizar la imagen primero y luego sobrescribir píxeles, aplica dithering a la imagen con difusión de error y trata un píxel forzado como parte de ese proceso: fuerza el valor, mide el error que el forzado causó y empuja ese error a los píxeles vecinos como Floyd–Steinberg empuja cualquier otro error. El resultado es que los píxeles forzados quedan compensados. Los píxeles de alrededor se desplazan para mantener correcto el promedio local, de modo que los puntos forzados se asientan dentro del mismo moteado irregular que el resto de la imagen. No hay retícula en la que el ojo pueda fijarse, y la imagen se lee como una imagen y no como una imagen detrás de una mosquitera. La región forzada tampoco tiene por qué ser un solo píxel: puede ser un bloque en el centro de cada módulo cuyo tamaño es un ajuste, que es lo que controla el balance Photo ↔ Code de SWAPQR. El resto del módulo — y la imagen que contiene — es lo que deja la difusión de error, que por construcción tiene el tono medio correcto para el módulo al que pertenece.

Lado a lado

En el método de semitono la imagen se umbraliza antes de colocar el código; en el método con dithering las dos cosas ocurren juntas, en una sola pasada. El semitono fuerza un subpíxel por módulo, en una rejilla perfecta; el dithering fuerza un bloque central de tamaño ajustable, escondido en el moteado. La firma visual del semitono es una retícula regular de puntos sobre la imagen; la del dithering, grano fotográfico. El semitono ofrece poco ajuste — uno de nueve píxeles está fijado y punto — mientras que el dithering ofrece una elección continua de cuánto de cada módulo se fuerza. Y en robustez en primer plano, el semitono es débil, porque un píxel por módulo no sobrevive a ningún remuestreo, mientras que el resultado con dithering es ajustable y, como muestra el artículo sobre primer plano de esta guía, medible: por debajo de aproximadamente la mitad del módulo forzado, los lectores antiguos de umbral por bloques tienen dificultades en primer plano extremo; por encima, no. Los dos métodos no son variaciones de un mismo tema; responden a la pregunta "dónde va la imagen" en órdenes distintos, y ese orden es lo que el ojo ve.

Dónde el dithering gana por mucho

Como la cantidad de forzado es un dial y no un uno-de-nueve fijo, un generador con dithering puede intercambiar imagen por fiabilidad a propósito. Eso no es una diferencia cosmética: con un píxel forzado por módulo, el código depende de que un solo píxel sobreviva a cada paso de remuestreo entre la impresora y el sensor, y a menudo no lo hace. Una impresora de inyección lo esparce, una láser lo redondea, un plastificado lo difumina, una cámara en ángulo lo extiende sobre dos píxeles del sensor y el propio reescalado del decodificador lo promedia con sus vecinos. Forzar un bloque en su lugar — y dejar que la difusión de error lo pague — es lo que hace que la técnica aguante en impresión. También significa que el mismo generador puede producir un código casi liso para una pegatina contra la que la gente pegará el teléfono, y una fotografía casi pura para un póster escaneado desde un metro, a partir de la misma imagen y el mismo enlace, moviendo un solo control. El semitono no tiene ese control: su fiabilidad y su aspecto los fija el método, y la única forma de hacerlo más robusto es abandonarlo por una región fijada mayor, momento en el que se ha convertido en el método con dithering con peor compensación.

Dónde no gana ninguno

Ningún enfoque convierte una mala fotografía en buena, y ninguno sobrevive a una carga útil larga. Ambos necesitan la corrección de errores en su nivel más alto, lo que en sí hace el código más denso. Una imagen plana y de bajo contraste falla en ambos, por la misma razón: produce una textura uniforme que compite con los módulos. Un enlace largo falla en ambos, porque los módulos se vuelven demasiado pequeños para contener imagen alguna. Y ambos son, al final, un intercambio deliberado: gastas fiabilidad para comprar una imagen. Gástala donde la imagen valga algo, y prueba la impresión. Hay una tercera familia que merece nombrarse: generadores que colocan una imagen intacta detrás de un código normal y simplemente aclaran los módulos, o que recortan un logotipo del centro. Esos no codifican la imagen en absoluto — confían en que la corrección de errores absorba el daño. Perfectamente válidos, mucho menos interesantes y mucho más limitados en cuánta imagen consigues, porque todo el coste se paga del presupuesto de corrección de errores sin nada que lo compense.

AspectoSemitono (3×3)Dithering (difusión de error)
Cuándo se umbraliza la imagenAntes de colocar el códigoJunto con el código
Píxeles forzadosUno por módulo, en una rejilla perfectaUn bloque central, escondido en el moteado
Firma visualRetícula regular de puntos sobre la imagenGrano fotográfico
Ajuste disponiblePoco — 1 de 9 píxeles está fijadoContinuo — eliges cuánto de cada módulo se fuerza
Robustez en primer planoDébil — un píxel por módulo no sobrevive a ningún remuestreoAjustable, y medible

Preguntas frecuentes

¿Cuál usa SWAPQR?

El método con dithering. La imagen se reduce con difusión de error de Floyd–Steinberg, los píxeles que el código necesita se fuerzan y su error se difunde a los vecinos, y el tamaño del bloque forzado es el balance Photo ↔ Code.

¿Por qué un código de semitono parece tener una rejilla encima?

Porque exactamente un subpíxel de cada bloque de 3×3 está fijado y esos píxeles fijados se alinean perfectamente en ambas direcciones. El ojo encuentra una retícula regular de inmediato.

¿Un logotipo recortado del centro es lo mismo?

No. Eso confía en que la corrección de errores absorba una región dañada; nada compensa el daño. Es válido, pero permite mucha menos imagen que el método de semitono o el de dithering.

¿Ambos necesitan la corrección de errores más alta?

Sí. Ambos gastan parte del presupuesto de recuperación del código en la imagen, así que ambos se generan al nivel más alto, lo que hace el código más denso y es una razón más para mantener el enlace corto.

Imprime el cuadrado una vez. Decide después adónde lleva. SWAPQR crea códigos QR estáticos gratis, con todas las opciones de estilo, sin cuenta y sin marca de agua. Un plan de pago convierte un código en dinámico: el cuadrado impreso sigue igual mientras tú cambias su destino, y ves cuántas veces se escaneó, por día y por dispositivo.

Crea un código QR en el navegador
Idioma: TR EN DE ES FR IT PT AR RU JA KO