opencv learning once: binarización de imágenes

Imagen en color: tres canales 0-255, 0-255, 0-255, por lo que puede haber 2 ^ imágenes en escala de grises de espacio de 24 bits: un canal 0-255, por lo que hay 256 colores de imágenes binarias: solo dos colores, negro y blanco, 1 blanco, 0 negro
Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquíInserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Realización de binarización de imágenes

1. Umbral global

Por lo general, no sabemos qué umbral establecer para obtener un mejor efecto de binarización, por lo que solo podemos intentarlo. Por ejemplo, para una imagen bimodal (entendida como la existencia de dos picos en el histograma de la imagen), el valor de umbral que especifiquemos debe ser lo más cercano posible al valle entre los dos picos. En este momento, puede utilizar el cuarto parámetro THRESH_OTSU, que calcula automáticamente el umbral apropiado para una imagen bimodal basándose en su histograma (para imágenes no bimodales, los resultados obtenidos por este método pueden no ser ideales).

Para el gráfico bimodal, necesitamos pasar un parámetro más cv2.THRESH_OTSU y establecer el umbral de umbral en 0, y otros números en 0 por defecto. El algoritmo encontrará el umbral óptimo y lo devolverá como el primer valor de retorno ret.

cv2.THRESH_BINARY: Umbral binario. Procese los brillantes en blanco y los oscuros en negro

cv2.THRESH_BINARY_INV: Umbral anti-binario. Trate los brillantes como negros y los oscuros como blancos
cv2.THRESH_TRUNC: umbral de corte. Luz no demasiado brillante, con un límite superior, la misma oscuridad
cv2.THRESH_TOZERO: umbral de umbral en cero parte relativamente brillante constante, la parte relativamente oscura se trata en negro 0
cv2.THRESH_TOZERO_INV: valor de umbral anti-umbral en 0, la parte más brillante se procesa en 0 como negro, y los píxeles menores o iguales al umbral permanecen sin cambios

Inserte la descripción de la imagen aquí
cv2.THRESH_BINARY: Umbral binario. Trate los brillantes como blancos y los oscuros como negros
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
cv2.THRESH_BINARY_INV: umbral binario inverso. Procese los brillantes en negro y los oscuros en blanco
Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí

cv2.THRESH_TRUNC: umbral de truncamiento. Luz no demasiado brillante, con un límite superior, la misma oscuridad
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
cv2.THRESH_TOZERO: umbral de umbral en cero parte relativamente brillante constante, la parte relativamente oscura se trata en negro 0
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
cv2.THRESH_TOZERO_INV: valor de umbral anti-umbral en 0, la parte más brillante se procesa en 0 como negro, y los píxeles menores o iguales al umbral permanecen sin cambios

Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí

import cv2 as cv
import numpy as np

def threshold_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    #ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)#cv.THRESH_OTSU计算阈值
    #ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)  # cv.THRESH_TRIANGLE计算阈值
    #不同方法阈值不同,判断二值化的方法好坏 是看信息有没有丢失
    #ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY) #手动指定阈值为127,大于127的是白色,小于127的是黑色
    ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV)  #bin反 手动指定阈值为127,大于127的是黑色,小于127的是白色
    ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_TRUNC)  # 截断TRUNC, 大于的话直接变成127(截断)
    ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_TOZERO)  # 截断TRUNC, 大于的话直接变成保留,小于127的全变成0
    print("threshold value %s" % ret)
    cv.imshow("binary", binary)

src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/lena.jpg")  #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
threshold_demo(src)
#local_demo(src)
#custom_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

ret, binary = cv.threshold (gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
print ("valor umbral% s"% ret) # Imprime el
valor umbral, el procesamiento de la escala de grises 0-255 se realizó primero, usamos El valor de umbral se procesa, la parte de la imagen por debajo del valor de umbral es toda negra y la parte de la imagen por encima del valor de umbral es el
Inserte la descripción de la imagen aquívalor de umbral de blanco : 140.0 # El umbral adquirido es 140

ret, binary = cv.threshold (gris, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
Inserte la descripción de la imagen aquí valor de umbral: 67.0

ret, binary = cv.threshold (gris, 127, 255, cv.THRESH_BINARY_INV)
umbral binario inverso. La luz se procesa en negro y la oscuridad en blanco.
Inserte la descripción de la imagen aquí
Valor de umbral: 127.0

ret, binary = cv.threshold (gray, 127, 255, cv.THRESH_TRUNC)
umbral de truncamiento. Los brillantes no deben ser demasiado brillantes, hay un límite superior y los oscuros permanecen sin cambios.
Inserte la descripción de la imagen aquí
Ret, binary = cv.threshold (gray, 127, 255, cv.THRESH_TOZERO)
umbral Umbral a 0, la parte más brillante permanece sin cambios , y la parte más oscura se trata como negra.
Inserte la descripción de la imagen aquíLa función de umbral de OpenC es 0 para el umbral global. El prototipo de la función es: umbral (src, thresh, maxval, type [, dst]) -> retval, dst El
parámetro src representa la imagen de entrada (multicanal, coma flotante de 8 bits o 32 bits).
El parámetro de umbral representa el umbral.
El parámetro maxval representa el valor máximo establecido cuando se usa con los tipos de umbral THRESH_BINARY y THRESH_BINARY_INV.
El parámetro de tipo indica el tipo de umbral.
El parámetro retval representa el umbral de retorno. Si se trata de un algoritmo de umbral fijo global, se devuelve el valor del parámetro de umbral. Si se trata de un algoritmo de umbral adaptativo global, devuelve el umbral apropiado obtenido por cálculo adaptativo.
El parámetro dst significa generar una imagen del mismo tamaño y tipo que src y el mismo número de canales

Algoritmo OTSU

La función cv2.threshold tiene dos valores de retorno, el primer valor de retorno es el valor de umbral de la imagen y el segundo valor de retorno es la imagen después del procesamiento de umbral,
cv.threshold (gray, 0,255, cv.THRESH_BINARY | cv .THRESH_OTSU) #Esta es nuestra propia configuración.
Es posible que no podamos encontrar el mejor umbral para dividir la imagen, por lo que necesitamos el algoritmo para encontrar un umbral por nosotros mismos, y cv.THRESH_OTSU puede satisfacer esta necesidad de encontrar el mejor umbral Bueno. Nota: Es muy adecuado para el caso en que el histograma en escala de grises de la imagen tenga picos dobles. Encontrará un valor entre los picos dobles como umbral. Para imágenes que no sean de picos dobles, puede que no sea muy útil. Debido a que el método cv.THRESH_OTSU genera un umbral, el segundo parámetro (umbral de configuración) de la función cv2.threshold es 0 (Ninguno), y la instrucción cv2.THRESH_OTSU debe agregarse a los parámetros del método de cv2.threshold.
El tercer parámetro, maxval, indica el valor máximo establecido cuando se usa con los tipos de umbral THRESH_BINARY y THRESH_BINARY_INV. La imagen máxima en escala de grises que usamos es 255, así que configúrela en 255.

Triangulación del procesamiento de imágenes

ret, binary = cv.threshold (gray, 0,255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
THRESH_OTSU y THRESH_TRIANGLE se utilizan en combinación con el método de binarización mencionado anteriormente. La ventaja es que no necesita especificar el valor de umbral usted mismo, el sistema lo calculará y lo usará a medida que se devuelva el valor de retorno. La diferencia es: THRESH_OTSU es más adecuado para crestas dobles THRESH_TRIANGLE es más adecuado para crestas simples, originalmente utilizado para la división médica de células, etc.

2. Umbral adaptativo de umbral local

cv2.adaptiveThreshold ()

ADAPTIVE_THRESH_MEAN_C: divide la imagen en regiones pequeñas y establece el umbral de cada región. El umbral de cada región es el valor medio de esta región menos la constante c. Si el umbral es mayor que el umbral, es blanco y si el umbral es menor , es negro. Toda la imagen tiene muchos umbrales.

ADAPTIVE_THRESH_GAUSSIAN_C: Divide la imagen en áreas pequeñas, el umbral es el peso de la media de cada área (la distribución media es gaussiana, cuanto más cerca está el centro, mayor es el peso) menos la constante c, toda la imagen tiene solo una umbral de
tamaño de bloque: tamaño del área, debe ser un número impar.
C: Al binarizar, si un punto de píxel menos el valor promedio es mayor que C, entonces este punto se establece en blanco, lo que puede reducir la influencia del ruido. Es equivalente a decir que umbral = media-C

import cv2 as cv
import numpy as np

def local_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    #binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 25, 10)
    binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)
    #ADAPTIVE_THRESH_GAUSSIAN_C 换高斯

    cv.imshow("binary", binary)
   
src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/lena.jpg")  #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
#threshold_demo(src)
local_demo(src)
#custom_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

def local_threshold (imagen): gray = cv.cvtColor (image, cv.COLOR_RGB2GRAY) #Para binarizar la imagen, primero realice el procesamiento de escala de grises dst = cv.adaptiveThreshold (gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 25) cv.imshow ("local_threshold", dst)
Inserte la descripción de la imagen aquíbinary = cv.adaptiveThreshold (gris, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)
Inserte la descripción de la imagen aquí
La función adaptiveThreshold de OpenCV realiza un umbral local. El prototipo de la función es: adaptiveThreshold (src, maxValue, adaptiveMethod ,resholdType, blockSize, C [, dst]) -> dst El
parámetro src representa la imagen de entrada (imagen de un solo canal de 8 bits).
El parámetro maxValue indica el valor máximo de THRESH_BINARY y THRESH_BINARY_INV. El parámetro adaptiveMethod indica el algoritmo de umbral adaptativo, promedio (ADAPTIVE_THRESH_MEAN_C) o Gaussiano (ADAPTIVE_THRESH_GAUSSIAN_C).
El parámetro parameterType indica el tipo de umbral, que debe ser THRESH_BINARY o THRESH_BINARY_INV.
El parámetro blockSize representa el tamaño del bloque (número impar y mayor que 1, como 3, 5, 7 ...).
El parámetro C es una constante y representa el número restado del promedio o promedio ponderado. Normalmente, este es un valor positivo, pero también puede ser cero o negativo.

En el caso de utilizar algoritmos gaussianos y promedio, el umbral adaptativo se puede obtener calculando el promedio ponderado de los bloques de píxeles blockSize x blockSize alrededor de cada píxel y restando la constante C. 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 cada píxel se obtienen mediante la ecuación gaussiana de acuerdo con la distancia desde el punto central.

Inserte la descripción de la imagen aquí

3. Calcule el promedio usted mismo como umbral y realice una segmentación binaria en la imagen.

def custom_threshold(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)#转换为灰度图
    h, w = gray.shape[:2]#高宽
    m = np.reshape(gray, [1, w*h])#将图像转换为1维数组,1行多列
    mean = m.sum() / (w*h)#求均值,把均值作为阈值
    print("mean : ", mean)
    ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)
    cv.imshow("binary", binary)

Inserte la descripción de la imagen aquíLa función de remodelación de numpy es darle a la matriz una nueva forma sin cambiar sus datos El prototipo de función: reshape (a, newshape, order = 'C') El
parámetro a representa la matriz original que necesita ser reformada .
El parámetro newshape representa una tupla de tipo int o int. Si es (1, 3), significa que la nueva matriz generada es de 1 fila y 3 columnas.
La tabla de parámetros de orden indica que los elementos de a se leen utilizando este orden de índice, y los elementos se colocan en la matriz reformada utilizando este orden de índice. Valor de retorno de la función: si es posible, será un nuevo objeto de vista; de lo contrario, se convertirá en una copia.
Nota: Para convertir la imagen en una matriz unidimensional, el tamaño de la dimensión de conversión no debe modificarse, y la forma de la noticia -> [fila, columna] debe ser una línea yn columnas, y el tamaño no debe modificarse

Supongo que te gusta

Origin blog.csdn.net/weixin_44145452/article/details/112508204
Recomendado
Clasificación