A estas alturas ya sabes que vivo entre la ingeniería y la ficción. Además de escribir sobre universos distópicos, me gusta trastear con código. Hoy te traigo un ejercicio práctico que une ambos mundos: un detector heurístico de imágenes generadas por IA.
¿Por qué buscar pistas en las imágenes?
La explosión de generadores como Midjourney o Stable Diffusion nos ha inundado de imágenes artificiales de increíble calidad. Diferenciar un paisaje real de uno fabricado por una red neuronal empieza a ser un reto. En fotografía forense existen métodos para detectar huellas de manipulación y una de las aproximaciones más sencillas parte de analizar la estructura de luz y textura de la imagen.
En el estándar Rec. 709 (utilizado para codificar vídeo de alta definición) la luminancia de un píxel se calcula con una combinación de sus componentes roja, verde y azul usando coeficientes: 0,2126 R + 0,7152 G + 0,0722 B. Esta fórmula se ajusta a cómo percibimos la luz y resulta útil para separar la intensidad de los colores. Al convertir nuestra imagen a luminancia reducimos el ruido del color y nos concentramos en la distribución de luz.
Otro aliado es el análisis de gradientes. Los gradientes describen cómo cambia la intensidad de la imagen de un píxel a otro. Las imágenes reales, capturadas por sensores físicos, presentan gradientes coherentes y patrones ligados a la óptica y la iluminación. Las generadas por modelos de difusión muestran estructuras de alta frecuencia asociadas al proceso de denoise (eliminación de ruido). Calcular estos gradientes nos ofrece un mapa de texturas y bordes que puede delatar irregularidades.
Para resumir toda esa información aplicamos análisis de componentes principales (PCA). Esta técnica estadística convierte un conjunto de variables correlacionadas en un conjunto más pequeño de variables no correlacionadas, llamadas componentes principales. Estas nuevas variables son combinaciones lineales de las originales y capturan la mayor varianza posible. En nuestro caso, nos permiten visualizar el equilibrio entre diferentes patrones de gradiente. En imágenes reales suele aparecer un componente dominante, mientras que en las sintéticas los componentes están más equilibrados.
Cómo funciona el script
He empaquetado estas ideas en un pequeño programa en Python que puedes encontrar en GitHub. Su funcionamiento se resume así:
- Luminancia: convierte la imagen a luminancia usando la fórmula de Rec. 709.
- Gradientes: calcula los gradientes horizontal y vertical mediante el filtro Sobel, con opción de aplicar un desenfoque gaussiano previo.
- PCA de gradientes: aplana los gradientes y obtiene las dos principales componentes mediante PCA. El ratio entre sus varianzas sirve como indicio de autenticidad.
- Probabilidad heurística: a partir de la relación entre componentes principales y la uniformidad de los gradientes estima la probabilidad (0–100 %) de que la imagen sea generada por IA. Se trata de un filtro orientativo, no de un veredicto definitivo.
Requisitos y uso
El repositorio incluye un archivo requirements.txt con las dependencias. Puedes instalarlas con:
python -m pip install -r requirements.txt
Las imágenes se cargan desde un directorio (por defecto img/), aunque puedes especificar otra ruta. Se aceptan formatos comunes como PNG, JPG, JPEG, BMP, TIFF o WEBP. Para analizar todas las imágenes de una carpeta:
python detect_ai_image.py --path img/
O una sola imagen concreta:
python detect_ai_image.py --path img/ejemplo.jpg
Parámetros opcionales:
--blur: tamaño del kernel gaussiano previo al cálculo de gradientes (valor por defecto 3; usa 0 para desactivarlo).--sobel-ksize: tamaño del kernel de Sobel (3 por defecto).
Salida e interpretación
Para cada imagen el programa muestra:
- media y desviación típica de la luminancia;
- media, desviación típica y mediana del módulo de los gradientes;
- ratios de varianza de los dos componentes principales;
- probabilidad heurística de que la imagen sea generada por IA.
Vamos a verlo con dos ejemplos: una imagen real (real.JPEG) y una imagen generada por IA (fake.png):


El resultado es el siguiente (tras probar diferentes combinaciones de blur y sobel-ksize):
python3 detect_ai_image.py --blur 5 --sobel-ksize 3
📄 img/real.jpeg
Luminancia | media: 0.4248 desviación: 0.3087
Gradientes | media: 0.3283 std: 0.3746 mediana: 0.1767
PCA ratios | PC1: 0.6930 PC2: 0.3070 Δ: 0.3860
Prob. IA | 35.5%
📄 img/fake.webp
Luminancia | media: 0.6180 desviación: 0.2453
Gradientes | media: 0.1016 std: 0.1636 mediana: 0.0391
PCA ratios | PC1: 0.6380 PC2: 0.3620 Δ: 0.2761
Prob. IA | 56.0%
Ten en cuenta que es un método heurístico: compresiones agresivas, reescalados o las mejoras en modelos de difusión pueden engañarlo. Úsalo como señal complementaria dentro de un análisis forense, no como prueba concluyente.
¿Y qué tiene que ver esto con Máquinas y memorias?
En mis novelas exploro la frontera entre recuerdos humanos y registros digitales. En un mundo donde las máquinas pueden recrear memorias, ¿cómo distinguimos lo real de lo simulado? Este script es un pequeño guiño: un detector de falsificaciones que intenta descifrar si una imagen proviene de un sensor físico o de una red generativa.
Al igual que en la trama de la saga, donde los protagonistas aprenden a desconfiar de sus propios recuerdos, aquí la tecnología nos obliga a cuestionar la veracidad de lo que vemos. Aunque la herramienta que presento es sencilla, abre la puerta a conversaciones sobre ética, percepción y los límites de la inteligencia artificial. Si aún no conoces la saga, te invito a hacerlo.