[Reproducido] Umbral de imagen de la serie OpenCV-Python (16)

Desde el comienzo de este tutorial, hemos entrado en el aprendizaje de algunas operaciones básicas de procesamiento de imágenes. El llamado umbral de imagen es la binarización de imágenes. Lo que es la binarización es solo 0 y 1, y nada más. En las imágenes OpenCV, la binarización significa que los píxeles de la imagen son 0 y 255, y no hay otros valores, es diferente a la escala de grises. Sin embargo, si desea lograr la binarización, es mejor escalar la imagen en escala de grises primero, porque la imagen que necesitamos no puede tener el canal ternario GBR.

Umbral simple

Veamos primero el prototipo de la función:

ret, dst = cv2.threshold (src, thresh, maxval, type)

src: imagen de entrada, solo se puede ingresar una imagen de un solo canal, generalmente una imagen gris

dst: mapa de salida

Thresh: umbral

maxval: cuando el valor del píxel supera el umbral (o menos que el umbral, según el tipo), el valor asignado

type: el tipo de operación binaria , incluidos los siguientes 5 tipos: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO; cv2.THRESH_TOZERO_INV

Esta función devuelve dos valores, pero normalmente solo usamos el segundo valor, que representa la imagen después de la binarización.

Echemos un vistazo a varias definiciones de tipo:
Inserte la descripción de la imagen aquí

Aprenda sobre operaciones específicas a través de ejemplos:

	view plaincopy to clipboardprint?
import cv2 as cv  
import numpy as np  
from matplotlib import pyplot as plt  
img = cv.imread("cat.jpg",0)  
ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY)  
ret,thresh2 = cv.threshold(img,127,255,cv.THRESH_BINARY_INV)  
ret,thresh3 = cv.threshold(img,127,255,cv.THRESH_TRUNC)  
ret,thresh4 = cv.threshold(img,127,255,cv.THRESH_TOZERO)  
ret,thresh5 = cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)  
titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']  
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]  
for i in range(6):  
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')  
    plt.title(titles[i])  
    plt.xticks([]),plt.yticks([])  
plt.show()  

Inserte la descripción de la imagen aquí

Demostramos los cinco parámetros a la vez para facilitar la comparación. Para dibujar varias imágenes, usamos la función plt.subplot ().

Umbral adaptativo

Lo que acabamos de describir es el método más simple de umbral, también conocido como umbral fijo, pero sus limitaciones son grandes. Ahora hagamos un experimento para ver sus deficiencias. Usamos esta imagen:
Inserte la descripción de la imagen aquí

Usamos el método anterior:

	view plaincopy to clipboardprint?
import cv2 as cv  
  
img = cv.imread("text.png",0)  
ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY)  
cv.imshow("res",thresh1)  
cv.waitKey(0)  
cv.destroyAllWindows()  

Inserte la descripción de la imagen aquí

Como puede ver, la imagen procesada se ha colapsado por completo y no hay forma de realizar el siguiente paso. Sin embargo, este no es un caso aislado La desventaja de los umbrales fijos es que las imágenes con diferentes grados de oscuridad y brillo no se pueden manejar bien.

Ahora introduciremos la binarización adaptativa. En comparación con la binarización de umbral fijo, el umbral adaptativo no necesita determinar un umbral fijo, sino que puede adaptarse a las características locales de la imagen de acuerdo con el método adaptativo correspondiente. Establezca el valor de umbral para el proceso de binarización.

Primero entendamos una función:
dst = cv.adaptiveThreshold (src, maxValue, adaptiveMethod ,resholdType, blockSize, C [, dst])

src: La imagen a binarizar La imagen solo puede ser del tipo de datos CV_8UC1.

dst: la imagen binarizada, que tiene el mismo tamaño y tipo de datos que la imagen de entrada.

maxValue: el valor máximo de binarización.

adaptiveMethod: métodos de elaboración propia para determinar el umbral, que se dividen en dos métodos: el método de la media ADAPTIVE_THRESH_MEAN_C y el método gaussiano ADAPTIVE_THRESH_GAUSSIAN_C.

UmbralType: seleccione el indicador del método de binarización de imágenes, que solo puede ser THRESH_BINARY y THRESH_BINARY_INV.

blockSize: determina de forma adaptativa el tamaño de la vecindad de píxeles del umbral, generalmente un número impar de 3, 5 y 7.

C: La constante restada del valor medio o del valor medio ponderado, puede ser positiva o negativa.

La función admite dos métodos adaptativos, a saber, ADAPTIVE_THRESH_MEAN_C (promedio) y ADAPTIVE_THRESH_GAUSSIAN_C (gaussiano). En ambos casos, el umbral adaptativo T (x, y). Se obtiene calculando el promedio ponderado de bloques de píxeles de tamaño bxb alrededor de cada píxel y restando la constante C. Entre ellos, b viene dado por blockSize, y el tamaño debe ser un número impar; si se usa el método de promedio, los pesos alrededor de todos los píxeles son los mismos; si se usa el método gaussiano, los pesos de los píxeles alrededor de (x, y) se basan en el La distancia del punto central se obtiene mediante la ecuación gaussiana.

Echemos un vistazo al ejemplo de código:

view plaincopy to clipboardprint?
import cv2 as cv  
import matplotlib.pyplot as plt  
  
img = cv.imread('text.png',0)  

#自适应阈值

th2 = cv.adaptiveThreshold(  
    img, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 15, 4)  
th3 = cv.adaptiveThreshold(  
    img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 15, 8)  
  
cv.imshow("th2",th2)  
cv.imshow("th3",th3)  
cv.waitKey(0)  

La salida de la primera imagen se obtiene mediante el método de la media y la segunda imagen se obtiene mediante el método gaussiano:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Se puede ver que el efecto es mucho mejor que el método de umbral fijo. En este método, usaremos muchos ejemplos, como reconocimiento de texto OCR de documentos y determinación de hojas de respuestas, etc., estos casos usarán adaptativos La binarización preprocesa la imagen para facilitar las operaciones posteriores.

Por supuesto, el umbral de imagen es más que eso. En el próximo tutorial, hablaremos de otros métodos de umbral de imagen. Serán más prácticos y efectivos, pero en consecuencia, el algoritmo es bastante complicado.

Consulte la página de resumen del artículo https://blog.csdn.net/weixin_44237705/article/details/107864965
Se puede intercambiar más información técnica de openvino en el grupo ~
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_44237705/article/details/108214047
Recomendado
Clasificación