v0.26 — Edición 2026. Un plan de estudios de 5 episodios sobre el uso de scikit-image v0.26 (Edición 2026) como motor central de preprocesamiento de imágenes y data augmentation en pipelines modernos de IA y deep learning.
Procesamiento de imágenesCiencia de datosVisión por ordenador
Descubre cómo scikit-image representa las imágenes como ndarrays de NumPy. Aprende por qué este diseño lo convierte en el motor de preprocesamiento perfecto para frameworks de deep learning como PyTorch y TensorFlow.
4m 31s
2
Hablando el mismo idioma: dtypes y OpenCV
Domina los tipos de datos de imágenes para prevenir los errores silenciosos más comunes en visión por ordenador. Aprende a integrar scikit-image a la perfección con OpenCV y las entradas de redes neuronales.
5m 09s
3
Contraste, exposición y robustez de la IA
Aprende a utilizar el ajuste de contraste y la ecualización de histogramas para estandarizar datasets. Estas técnicas son cruciales para hacer que los modelos de IA sean robustos ante condiciones de iluminación variables.
4m 32s
4
Transformaciones geométricas para data augmentation
Explora cómo redimensionar imágenes para ajustarlas a las entradas de las redes neuronales y aplicar transformaciones afines. Esencial para construir pipelines robustos de data augmentation.
4m 59s
5
Segmentación clásica para impulsar la IA
Descubre cómo usar la segmentación clásica watershed para generar automáticamente máscaras de entrenamiento con precisión de píxel para modelos de deep learning, ahorrando horas de etiquetado manual.
4m 26s
Episodios
1
El pipeline de imágenes de IA: NumPy en el núcleo
4m 31s
Descubre cómo scikit-image representa las imágenes como ndarrays de NumPy. Aprende por qué este diseño lo convierte en el motor de preprocesamiento perfecto para frameworks de deep learning como PyTorch y TensorFlow.
Hola, soy Alex de DEV STORIES DOT EU. scikit-image: El pipeline de imágenes con IA, episodio 1 de 5. Antes de que un modelo de deep learning pueda reconocer una cara, tiene que digerir una cuadrícula de números. Si le pasas esa cuadrícula en el orden equivocado, tu modelo no aprende nada y tu procesamiento se vuelve lentísimo. El pipeline de imágenes con IA: NumPy en el core es la solución para estructurar esa cuadrícula correctamente.
Cuando cargas una imagen usando scikit-image, no obtienes un objeto de imagen propietario. Obtienes un array N-dimensional estándar, conocido como ndarray. Una imagen es simplemente una matriz de píxeles. Como es un array de NumPy normal, puedes usar cualquier operación estándar para hacer un slice, aplicar un mask o manipular los datos de la imagen directamente.
Aquí está la clave. La forma en que scikit-image indexa estos arrays confunde a muchos developers. En geometría estándar, usas coordenadas x e y, donde la x es horizontal y la y es vertical. scikit-image abandona esto por la notación matricial. El primer índice es la fila, que corresponde a la posición vertical. El segundo índice es la columna, que corresponde a la posición horizontal. Si tienes una imagen en color, el tercer índice es el canal de color. Una imagen en color bidimensional estándar es, en realidad, un array tridimensional ordenado como fila, columna y canal.
Supón que estás preparando un batch de imágenes en color para pasárselo a una Convolutional Neural Network. Tu red espera un shape específico. Si tu imagen tiene 256 píxeles de alto y 256 píxeles de ancho con canales rojo, verde y azul, el shape de una sola imagen es 256, 256, 3. Pero un batch de estas imágenes añade una cuarta dimensión al principio, que representa el número de imágenes.
Cuando aplicas funciones de scikit-image a estos datos, la función necesita saber qué dimensión contiene los valores de color para no procesarlos como datos espaciales. Esto se maneja con el argumento channel axis. Al poner el argumento channel axis en -1, le dices a la función que los canales de color siempre están en la última dimensión del array. Esto asegura que la función apunte a los datos de color correctos, independientemente de si le pasas una sola imagen o un batch grande con dimensiones espaciales extra.
Esto nos lleva a la memoria. Esta es la parte que importa para la velocidad de procesamiento. Los arrays de NumPy se guardan en bloques contiguos de memoria, usando un orden tipo C por defecto. Esto significa que la última dimensión en el shape del array cambia más rápido en la memoria física. En nuestro array de imagen estándar de fila, columna y canal, los canales de color individuales para un solo píxel están justo uno al lado del otro en la memoria RAM de tu hardware.
Si escribes código a medida para hacer un loop sobre estos píxeles, tienes que respetar este memory layout. La regla es absoluta: la dimensión más a la derecha de tu array debería procesarse en el loop más interno. Iteras sobre las filas en el loop exterior, luego las columnas, y luego los canales en el interior. Si inviertes esto y haces el loop sobre las filas en el interior, fuerzas a la CPU a saltar de un lado a otro por direcciones de memoria fragmentadas. Esto destruye el cache locality y hace que tu código se ejecute mucho más lento.
Lo más crítico que debes recordar es que scikit-image no usa coordenadas horizontales y verticales; usa una indexación matricial estricta de fila, columna y canal, y hacer que tus loops coincidan con ese orden exacto de memoria es lo que mantiene rápido tu data pipeline.
Si quieres ayudar a que este podcast siga adelante, puedes apoyar el programa buscando DevStoriesEU en Patreon. Eso es todo por este episodio. Gracias por escuchar, y ¡sigue construyendo!
2
Hablando el mismo idioma: dtypes y OpenCV
5m 09s
Domina los tipos de datos de imágenes para prevenir los errores silenciosos más comunes en visión por ordenador. Aprende a integrar scikit-image a la perfección con OpenCV y las entradas de redes neuronales.
Hola, soy Alex de DEV STORIES DOT EU. scikit-image: El pipeline de imágenes de IA, episodio 2 de 5. El bug silencioso más común en la IA de computer vision no está en la arquitectura de la red neuronal. Es un mismatch de data types. Le pasas una imagen a un modelo, el código se ejecuta sin lanzar errores, pero los outputs son pura basura. Esto ocurre cuando tus librerías no se ponen de acuerdo en cómo se debe representar numéricamente un píxel. Hoy solucionaremos esto hablando el mismo idioma: Dtypes y OpenCV.
En scikit-image, las imágenes se almacenan como arrays de numpy estándar. Pero los números dentro de esos arrays se comportan de forma diferente según su data type exacto. El formato por defecto de las webcams y los archivos de imagen estándar es un unsigned integer de ocho bits, conocido como uint8. Estos valores van de cero a 255, donde cero es negro absoluto y 255 es la intensidad máxima.
Sin embargo, las funciones de procesamiento de imágenes científicas y los frameworks de deep learning casi siempre prefieren números en coma flotante. En scikit-image, una imagen float espera que las intensidades de los píxeles se escalen en un rango estricto, normalmente de cero a uno.
Aquí está la clave. No uses el método astype de numpy para convertir tus imágenes uint8 a floats. Si coges un array uint8 y simplemente llamas a astype float, numpy solo cambia el tipo de memoria subyacente. Un valor de píxel brillante de 255 simplemente se convierte en 255 punto cero. No reescala los valores. Si pasas ese array a una función de scikit-image o a un modelo de PyTorch que espera un brillo máximo en uno punto cero, las matemáticas explotan. Tus blancos de repente se tratan como si fueran 255 veces más brillantes que el valor máximo posible.
En su lugar, tienes que usar las funciones de utilidad integradas de scikit-image. La más importante se llama img_as_float. Esta función comprueba el data type de entrada y gestiona el reescalado matemático automáticamente. Comprime de forma segura un rango uint8 de cero a 255 a un rango float preciso de cero a uno punto cero.
Los data types son solo la mitad de la batalla. También tienes que alinear los canales de color, especialmente si estás capturando vídeo. Si lees un frame usando OpenCV, te devuelve un array de numpy uint8. Pero OpenCV tiene una peculiaridad histórica. Almacena los canales de color en orden Azul Verde Rojo, conocido como BGR. scikit-image y la mayoría de los modelos de IA modernos esperan Rojo Verde Azul, o RGB. Si te olvidas de intercambiar los canales, las manzanas rojas se ven azules y la piel humana parece completamente alienígena.
No necesitas llamar a una función pesada de conversión de color de OpenCV para solucionar esto. Como la imagen es simplemente un array de numpy, puedes usar array slicing básico. Haces un slice del array a través de sus tres dimensiones. Coges todas las filas, todas las columnas, y luego para la dimensión final que representa los canales de color, especificas un step de menos uno. Esto le dice a numpy que retroceda a través de los canales, invirtiendo BGR a RGB instantáneamente en memoria.
Vamos a repasar un pipeline de ingesta completo para un modelo de deep learning. Primero, coges un frame de un video stream de OpenCV, lo que te da un array BGR uint8. A continuación, inviertes los canales de color usando numpy slicing para convertirlo a RGB. Después, pasas ese array a img_as_float. El array es ahora una matriz floating-point, perfectamente escalada entre cero y uno. Finalmente, conviertes este array de numpy limpio en un tensor de PyTorch.
Una red neuronal no puede decirte cuándo su input data está escalado incorrectamente, simplemente aprende los patrones equivocados o falla silenciosamente. Controlar tus data types y el orden de los canales justo en el paso de ingesta asegura que tu pipeline se asiente sobre una base matemática sólida.
Eso es todo por este episodio. ¡Gracias por escuchar, y sigue construyendo!
3
Contraste, exposición y robustez de la IA
4m 32s
Aprende a utilizar el ajuste de contraste y la ecualización de histogramas para estandarizar datasets. Estas técnicas son cruciales para hacer que los modelos de IA sean robustos ante condiciones de iluminación variables.
Hola, soy Alex de DEV STORIES DOT EU. scikit-image: El AI Image Pipeline, episodio 3 de 5. Las redes neuronales son excelentes para encontrar patrones, pero memorizan fácilmente la iluminación específica de una habitación en lugar del objeto que quieres que detecten. Para solucionar esto, necesitamos estandarizar la varianza en nuestros datasets mediante el contraste, la exposición y la robustez de la IA.
Imagina un dataset de radiografías médicas recopiladas de una docena de hospitales diferentes. Los escáneres provienen de distintas máquinas con calibraciones muy variables. Algunas imágenes son oscuras y turbias, mientras que otras están descoloridas y brillantes. Si le pasas esta raw data a una red neuronal, es muy probable que haga overfit a las condiciones de iluminación de escáneres específicos en lugar de aprender a identificar la patología subyacente. Tienes que normalizar la exposición antes de que empiece el training.
El primer paso en esta estandarización suele ser eliminar la información irrelevante. Si lo único que importa es la estructura, el color es una distracción. Puedes usar una función llamada rgb to gray para convertir imágenes en color en arrays de escala de grises de un solo canal. Esto reduce la dimensionalidad de tus datos y obliga al modelo a evaluar la luminancia pura.
Una vez que trabajas estrictamente con la luminancia, necesitas alinear el brillo base en todo tu dataset. Aquí es donde entra en juego rescale intensity. Esta función realiza un estiramiento lineal en los datos de tu imagen. Toma el píxel más oscuro y lo mapea al valor más bajo posible, como cero, y mapea el píxel más brillante al valor más alto posible, como doscientos cincuenta y cinco. Cada píxel intermedio se escala linealmente.
Aquí está la clave. Un simple estiramiento de mínimo a máximo es frágil. Un solo píxel muerto negro o un artefacto brillante por una mota de polvo en el sensor dictará toda la escala. El estiramiento comprimirá tus datos anatómicos reales en una banda de grises estrecha e inútil solo para acomodar ese outlier extremo.
Para solucionar esto, usas el percentile clipping. En lugar de estirar desde el mínimo y el máximo absolutos, calculas los percentiles dos y noventa y ocho de los valores de los píxeles de tu imagen. Luego, le pasas esos percentiles a la función rescale intensity como tu input range. La función recortará el dos por ciento extremo de los píxeles claros y oscuros, ajustándolos a blanco puro y negro puro, y estirará linealmente el noventa y seis por ciento restante de los datos. Esto garantiza que la mayor parte de tus datos estructurales utilice todo el rango dinámico, ignorando por completo los artefactos aleatorios.
A veces, un estiramiento lineal no es suficiente. Puede que tengas una radiografía donde se capturan los datos, pero todos los píxeles están agrupados en torno a unos pocos tonos de gris específicos, haciendo que la imagen se vea plana y ocultando los detalles. Para esto, usas equalize hist, que significa ecualización de histograma.
La ecualización de histograma es un proceso no lineal. En lugar de simplemente estirar los límites, analiza la frecuencia de cada valor de píxel en la imagen. Luego, distribuye los valores de intensidad más frecuentes por todo el espectro disponible. Si una gran parte de tu radiografía está atrapada en una banda estrecha de grises oscuros, la ecualización de histograma separará esos grises, asignándoles nuevos valores que van del negro al blanco. Esto aumenta artificialmente el contraste local, revelando texturas y contornos sutiles que antes estaban ocultos en las zonas turbias del escáner.
Estandarizar tu dataset con estas técnicas garantiza que tu modelo evalúe la forma y textura reales del sujeto. Un pipeline robusto elimina la varianza irrelevante de la calibración del hardware, obligando a la red neuronal a aprender la señal en lugar del ruido. Gracias por pasar unos minutos conmigo. Hasta la próxima, cuídate.
4
Transformaciones geométricas para data augmentation
4m 59s
Explora cómo redimensionar imágenes para ajustarlas a las entradas de las redes neuronales y aplicar transformaciones afines. Esencial para construir pipelines robustos de data augmentation.
Hola, soy Alex de DEV STORIES DOT EU. scikit-image: El pipeline de imágenes para IA, episodio 4 de 5. Una red neuronal convolucional puede reconocer a un gato a la perfección. Pero dale la vuelta a ese gato, o desplázalo tres píxeles a la izquierda, y de repente el modelo se vuelve completamente ciego. Esto lo solucionas con transformaciones geométricas para Data Augmentation.
Antes de aumentar nada, tenemos que preparar la baseline. Las redes neuronales requieren input shapes fijos. Esto lo gestionas usando la función resize en scikit-image. Le pasas una imagen y tus dimensiones de output objetivo, y estira o encoge matemáticamente el array de píxeles para que encaje, interpolando los nuevos valores de los píxeles automáticamente. Pero hacer solo un resize deja a tu modelo vulnerable al overfitting. Memorizará exactamente dónde se sitúan los objetos en el frame. Para evitar esto, construyes un pipeline de data augmentation que aplica transformaciones aleatorias a las imágenes de training al vuelo.
En scikit-image, las transformaciones espaciales manipulan el espacio de coordenadas de la imagen usando matemáticas de matrices. Mover o rotar una imagen significa multiplicar sus coordenadas de píxeles por una matriz de transformación. Aquí está la clave. La traslación, que es desplazar una imagen a través del eje x o y, no se puede calcular usando una multiplicación de matrices de dos por dos estándar. La multiplicación de matrices maneja el escalado y la rotación, pero el desplazamiento requiere una suma.
Para solucionar esto, scikit-image usa coordenadas homogéneas. Al añadir una tercera coordenada ficticia, un uno, a cada punto bidimensional, el sistema mejora las matemáticas. Esto permite que las traslaciones, rotaciones y escalados se calculen simultáneamente como una única multiplicación de matrices de tres por tres.
No tienes que escribir estas matrices de tres por tres a mano. scikit-image proporciona clases de transformación para hacer los cálculos por ti. Para nuestro pipeline anti-overfitting, usas la clase Euclidean transform. Una transformación euclidiana conserva las distancias y los ángulos, lo que significa que solo maneja rotación y traslación. La inicializas pasándole un ángulo de rotación y un vector de traslación. Si necesitaras añadir shearing o cambiar la escala, subirías a un Affine transform. Si necesitaras simular un cambio de perspectiva, usarías un Projective transform. Pero para giros y desplazamientos aleatorios, Euclidean es exactamente lo que necesitas.
Una vez que tu matriz de transformación está definida, tienes que aplicarla a tu imagen. Esto lo haces usando la función warp. Le pasas a la función warp tu imagen de input y tu objeto Euclidean transform.
Aquí es donde se pone interesante. La función warp no calcula a dónde deberían ir los píxeles de input en la nueva imagen. Si empujas los píxeles hacia adelante en un nuevo grid, las matemáticas de rotación crean coordenadas fraccionarias. Cuando esas se redondean al píxel entero más cercano, acabas con píxeles faltantes, o agujeros, dispersos por tu imagen de output. En su lugar, warp funciona hacia atrás. Toma la inversa de tu matriz de transformación. Mira cada coordenada de píxel vacía en la imagen de output objetivo, la mapea hacia atrás al espacio de la imagen original, e interpola el valor de color correcto. Este mapeo inverso garantiza un output sólido y sin agujeros.
Para tu pipeline de augmentation, la lógica es simple. Genera un ángulo aleatorio y un conjunto aleatorio de desplazamientos. Pásaselos a un Euclidean transform. Pasa ese transform y tu imagen de training a la función warp. El output va directo a tu red neuronal. Las transformaciones geométricas no solo crean más datos de training; obligan a tu modelo a separar el objeto que necesita reconocer de las coordenadas arbitrarias que da la casualidad que ocupa.
Eso es todo por este episodio. ¡Gracias por escuchar, y sigue construyendo!
5
Segmentación clásica para impulsar la IA
4m 26s
Descubre cómo usar la segmentación clásica watershed para generar automáticamente máscaras de entrenamiento con precisión de píxel para modelos de deep learning, ahorrando horas de etiquetado manual.
Hola, soy Alex de DEV STORIES DOT EU. scikit-image: El pipeline de imágenes de IA, episodio 5 de 5. Los modelos de segmentación de deep learning son increíblemente potentes, pero son increíblemente exigentes. Requieren miles de máscaras dibujadas a mano, pixel-perfect, antes de poder aprender nada en absoluto. La segmentación clásica para hacer bootstrap de IA cierra esa brecha.
Estás entrenando una U-Net moderna para detectar células o monedas que se tocan. Necesitas etiquetas ground-truth. Dibujar estas máscaras a mano lleva semanas. Podrías intentar ejecutar un detector de bordes simple como Canny para automatizar el proceso. Canny es excelente para encontrar transiciones nítidas, pero a menudo falla al cerrar los bucles. Te da contornos fragmentados, no regiones sólidas. Una IA entrenada con contornos rotos dará como output contornos rotos.
La segmentación basada en regiones resuelve esto. En concreto, el algoritmo Watershed. Trata tu imagen como un paisaje topográfico. Los valores altos de los píxeles son montañas, y los valores bajos son valles. Aquí está la clave. En lugar de intentar conectar bordes rotos, Watershed inunda la imagen desde puntos de partida conocidos hasta que el agua se encuentra en las crestas más altas. Esto garantiza regiones cerradas y sólidas.
Primero, construyes el terreno. Esto lo haces generando un mapa de elevación usando un filtro Sobel. El filtro Sobel calcula gradientes espaciales, resaltando los bordes. Cuando lo aplicas a tu imagen, los bordes entre tus monedas superpuestas se convierten en las crestas altas de tu mapa. Las superficies planas de las monedas y el fondo se convierten en los valles.
A continuación, colocas los marcadores. Tienes que decirle al algoritmo dónde debe empezar a subir el agua. Si te saltas esto, el algoritmo inundará desde cada pequeño mínimo local y romperá tu imagen en cientos de fragmentos inútiles. Creas un array de marcadores exactamente del mismo tamaño que tu imagen original. Encuentras el fondo definitivo seleccionando píxeles por debajo de un umbral de intensidad específico y les asignas un valor de uno. Luego, encuentras el foreground definitivo, que son los centros sólidos de las monedas, seleccionando píxeles por encima de un umbral de intensidad más alto. A esos les asignas un valor de dos.
Finalmente, activas la inundación. Le pasas tu mapa de elevación y tu array de marcadores a la función watershed del módulo de segmentación de scikit-image. El algoritmo rellena las regiones empezando por los unos y los doses. A medida que el agua simulada sube, las regiones se expanden. Cuando finalmente se encuentran en las crestas altas del mapa de elevación de Sobel, el algoritmo construye un límite.
La función devuelve un array de enteros de regiones cerradas y perfectamente etiquetadas. Los objetos que se tocan se separan exactamente en el límite. Ahora tienes un array de máscaras limpio donde cada moneda es un objeto sólido distinto. Puedes ejecutar este pipeline en todo tu dataset sin etiquetar para generar miles de máscaras automáticamente. Luego, le pasas esas máscaras directamente a tu U-Net como datos de entrenamiento ground-truth.
Hacer bootstrap de una IA no requiere trabajo humano si sabes cómo combinar la lógica de terreno del procesamiento de imágenes clásico con arquitecturas de modelos modernas. Te animo a explorar la documentación oficial de scikit-image y a intentar construir un mapa de elevación de forma práctica, y si tienes una idea para nuestra próxima serie, pásate por devstories.eu y cuéntamelo. Eso es todo por este episodio. ¡Gracias por escuchar, y sigue construyendo!
Tap to start playing
Browsers block autoplay
Share this episode
Episode
—
Copy this episode in another language:
Este sitio web no utiliza cookies. Nuestro proveedor de alojamiento puede registrar tu dirección IP con fines analíticos. Saber más.