Umbral adaptativo de OpenCV en Python con cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Umbral adaptable de OpenCV en Python con cv2.adaptiveThreshold()

Introducción

La umbralización es una técnica simple y eficiente para realizar una segmentación básica en una imagen y para binarizarla (convertirla en una imagen binaria) donde los píxeles son 0 or 1 (o 255 si está utilizando números enteros para representarlos).

Por lo general, puede usar el umbral para realizar una segmentación simple de fondo y primer plano en una imagen, y se reduce a variantes en una técnica simple para cada píxel:

if pixel_value > threshold:
    pixel_value = MAX
else:
    pixel_value = 0

El umbral simple tiene problemas evidentes y requiere una entrada bastante clara, lo que hace que no sea tan práctico para muchos casos de uso. El principal infractor es un umbral global que se aplica a toda la imagen, mientras que las imágenes rara vez son lo suficientemente uniformes como para que funcionen los umbrales generales, a menos que sean artificiales.

Un umbral global funcionaría bien para separar caracteres en un libro en blanco y negro, en páginas escaneadas. Es muy probable que un umbral global falle en una imagen de teléfono de esa misma página, ya que las condiciones de iluminación pueden variar entre partes de la página, lo que hace que un punto de corte global sea demasiado sensible a los datos reales.

Para combatir esto, podemos emplear local umbrales, usando una técnica conocida como umbral adaptativo. En lugar de tratar todas las partes de la imagen con la misma regla, podemos cambiar el umbral para cada área local eso le parece adecuado. Esto hace que el umbral sea parcialmente invariable a los cambios en la iluminación, el ruido y otros factores. Si bien es mucho más útil que la umbralización global, la umbralización en sí misma es una técnica limitada y rígida, y se aplica mejor para ayudar con el preprocesamiento de imágenes (especialmente cuando se trata de identificar imágenes para descartar), en lugar de segmentación.

Para aplicaciones más delicadas que requieren contexto, es mejor que emplee técnicas más avanzadas, incluido el aprendizaje profundo, que ha estado impulsando los avances recientes en la visión artificial.

Umbral adaptativo con OpenCV

Carguemos una imagen con condiciones de iluminación variables, donde una parte de la imagen está más enfocada que otra, y la imagen se toma desde un ángulo. Una foto que tomé de Harold McGee “Sobre la comida y la cocina” servirá genial!

img = cv2.imread('book.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)

Ahora, usando un umbral regular, podemos intentar separar las letras del fondo, ya que hay una clara diferencia de color entre ellas. Todo el color del papel se tratará como fondo. Como realmente no sabemos cuál debería ser el umbral, apliquemos el método de Otsu para encontrar un buen valor, anticipando que la imagen es algo bimodal (dominada principalmente por dos colores):

img = cv2.imread('book.jpg')


gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)

ret, mask = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
print(f'Threshold: {ret}')

fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))

Echemos un vistazo al resultado:

Umbral adaptativo de OpenCV en Python con cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Ay. La parte izquierda del texto está principalmente desvanecida, la sombra alrededor de la canaleta se comió por completo una parte de la imagen y el texto está demasiado saturado. Esta es una imagen “en estado salvaje”, y las reglas generales, como el umbral global, no funcionan bien. ¿Cuál debería ser el umbral? ¡Depende de la parte de la imagen!

La cv2.adaptiveThreshold() El método nos permite hacer exactamente esto:

cv2.adaptiveThreshold(img, 
                      max_value, 
                      adaptive_method, 
                      threshold_method, 
                      block_size, 
                      C)

La adaptive_method puede ser una cv2.ADAPTIVE_THRESH_MEAN_C or cv2.ADAPTIVE_THRESH_GAUSSIAN_C, Donde C es el último argumento que establece. Ambos métodos calculan el umbral según los vecinos del píxel en cuestión, donde el block_size dicta el número de vecinos a considerar (el área del barrio).

ADAPTIVE_THRESH_MEAN_C toma la media de los vecinos y deduce C, mientras ADAPTIVE_THRESH_GAUSSIAN_C toma la suma ponderada gaussiana de los vecinos y deduce C.

Consulte nuestra guía práctica y práctica para aprender Git, con las mejores prácticas, los estándares aceptados por la industria y la hoja de trucos incluida. Deja de buscar en Google los comandos de Git y, de hecho, aprenden ella!

También le permite establecer una estrategia de binarización, pero se limita a THRESH_BINARY y THRESH_BINARY_INV, y cambiar entre ellos cambiará efectivamente lo que es "fondo" y lo que es "primer plano".

El método solo devuelve la máscara de la imagen, no el código de retorno ni la máscara. Intentemos segmentar los personajes en la misma imagen que antes, usando el umbral adaptativo:


img = cv2.imread('book.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)


mask = cv2.adaptiveThreshold(blurred, 
                              255, 
                              cv2.ADAPTIVE_THRESH_MEAN_C, 
                              cv2.THRESH_BINARY, 
                              31, 
                              10)


fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))
plt.tight_layout()

Esto da como resultado una imagen mucho más clara:

Umbral adaptativo de OpenCV en Python con cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Nota: La block_size argumento debe ser un número impar.

De la misma manera, podemos aplicar el umbral gaussiano:

mask = cv2.adaptiveThreshold(blurred, 
                              255, 
                              cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                              cv2.THRESH_BINARY, 
                              31, 
                              10)

Lo que también produce una imagen bastante satisfactoria al final:

Umbral adaptativo de OpenCV en Python con cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Tanto el tamaño del bloque (área vecina) como C son hiperparámetros para sintonizar aquí. Pruebe diferentes valores y elija el que mejor se adapte a su imagen. En general, el umbral gaussiano es menos sensible al ruido y producirá imágenes un poco más nítidas y limpias, pero esto varía y depende de la entrada.

Limitaciones de la umbralización adaptativa

Con la umbralización adaptativa, pudimos evitar la limitación general de la umbralización, pero sigue siendo relativamente rígida y no funciona muy bien para entradas coloridas. Por ejemplo, si cargamos una imagen de tijeras y un pequeño kit con diferentes colores, incluso el umbral adaptativo tendrá problemas para segmentarlo correctamente, con ciertas características oscuras delineadas, pero sin considerar objetos completos:

Umbral adaptativo de OpenCV en Python con cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Si ajustamos el tamaño del bloque y C, podemos hacer que considere parches más grandes como parte del mismo objeto, pero luego tenga problemas para hacer los tamaños vecinos demasiado global, recurriendo a los mismos problemas generales con el umbral global:

Umbral adaptativo de OpenCV en Python con cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Conclusión

En los últimos años, la segmentación binaria (como la que hicimos aquí) y la segmentación de etiquetas múltiples (donde puede codificar un número arbitrario de clases) se ha modelado con éxito con redes de aprendizaje profundo, que son mucho más potentes y flexibles. Además, pueden codificar contexto global y local en las imágenes que están segmentando. La desventaja es que necesita datos para capacitarlos, así como tiempo y experiencia.

Para la creación de umbrales simple y sobre la marcha, puede usar OpenCV y combatir algunas de las limitaciones utilizando estrategias de umbralización adaptativa en lugar de estrategias de umbralización global. Para una segmentación precisa a nivel de producción, querrá usar redes neuronales.

Yendo más lejos: aprendizaje profundo práctico para la visión por computadora

¿Tu naturaleza inquisitiva te hace querer ir más allá? Recomendamos revisar nuestro Curso: “Aprendizaje Profundo Práctico para Visión por Computador con Python”.

Umbral adaptativo de OpenCV en Python con cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

¿Otro curso de visión artificial?

No haremos clasificación de dígitos MNIST o moda MNIST. Cumplieron su parte hace mucho tiempo. Demasiados recursos de aprendizaje se centran en conjuntos de datos básicos y arquitecturas básicas antes de permitir que las arquitecturas avanzadas de caja negra carguen con la carga del rendimiento.

queremos centrarnos en desmitificación, sentido práctico, comprensión, intuición y proyectos reales. Querer aprender cómo ¿Tu puedes hacer la diferencia? Lo llevaremos en un viaje desde la forma en que nuestros cerebros procesan imágenes hasta escribir un clasificador de aprendizaje profundo de grado de investigación para el cáncer de mama y redes de aprendizaje profundo que "alucinan", enseñándole los principios y la teoría a través del trabajo práctico, equipándolo con el conocimientos y herramientas para convertirse en un experto en la aplicación del aprendizaje profundo para resolver la visión artificial.

¿Qué hay adentro?

  • Los primeros principios de la visión y cómo se puede enseñar a las computadoras a “ver”
  • Diferentes tareas y aplicaciones de la visión artificial
  • Las herramientas del oficio que facilitarán tu trabajo
  • Encontrar, crear y utilizar conjuntos de datos para la visión por computadora
  • La teoría y aplicación de las Redes Neuronales Convolucionales
  • Manejo de cambio de dominio, co-ocurrencia y otros sesgos en conjuntos de datos
  • Transfiera el aprendizaje y utilice el tiempo de capacitación y los recursos computacionales de otros para su beneficio
  • Construyendo y entrenando un clasificador de cáncer de mama de última generación
  • Cómo aplicar una buena dosis de escepticismo a las ideas principales y comprender las implicaciones de las técnicas ampliamente adoptadas
  • Visualización del "espacio conceptual" de ConvNet usando t-SNE y PCA
  • Casos prácticos de cómo las empresas utilizan técnicas de visión artificial para lograr mejores resultados
  • Evaluación adecuada del modelo, visualización del espacio latente e identificación de la atención del modelo.
  • Realizar investigaciones de dominio, procesar sus propios conjuntos de datos y establecer pruebas modelo
  • Arquitecturas de vanguardia, la progresión de las ideas, qué las hace únicas y cómo implementarlas
  • KerasCV: una biblioteca WIP para crear canalizaciones y modelos de última generación
  • Cómo analizar y leer documentos e implementarlos usted mismo
  • Selección de modelos en función de su aplicación
  • Creación de una canalización de aprendizaje automático de extremo a extremo
  • Panorama e intuición sobre la detección de objetos con Faster R-CNN, RetinaNets, SSD y YOLO
  • Instancia y segmentación semántica
  • Reconocimiento de objetos en tiempo real con YOLOv5
  • Capacitación de detectores de objetos YOLOv5
  • Trabajando con Transformers usando KerasNLP (biblioteca WIP de fuerza industrial)
  • Integrando Transformers con ConvNets para generar subtítulos de imágenes
  • sueño profundo
  • Optimización del modelo de Deep Learning para visión artificial

Sello de tiempo:

Mas de Abuso de pila