opencv learning doce: binarización de imágenes súper grandes

Método de binarización de imagen súper grande

分块处理超大图像的二值化问题
  (1) 全局阈值处理
  (2) 局部阈值(效果更好)
空白区域过滤
先缩放进行二值化,然后还原大小

El problema de la binarización de procesar imágenes de gran tamaño en bloques

import cv2 as cv
import numpy as np

def big_image_binary(image):
    print(image.shape) #图像大小
    ch, cw = 255, 255  #每个小块的高和宽
    h, w = image.shape[:2]#整个图像高,宽
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #进行二值化必须先转成灰度图
    for row in range(0, h, ch):#遍历每一小块高
        for col in range(0, w, cw):#遍历每一块宽
            roi = gray[row:row+ch, col:col+cw] #获取分块
            mean, std = cv.meanStdDev(roi)
            print("the picture mean:%s, std:%s" % (mean, std)) #打印小块均值,方差
            # ret, dst = cv.threshold(roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)  #全局阈值
            dst = cv.adaptiveThreshold(roi, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 127, 10) #局部阈值
            gray[row:row+ch, col:col+cw] = dst #对每个个块进行二值化处理
    cv.imwrite("binary2.jpg",gray)


src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/xiannvbang.jpg")
big_image_binary(src)
cv.waitKey(0)
cv.destroyAllWindows()

Captura de pantalla en ejecución:
Inserte la descripción de la imagen aquícada bloque pequeño utiliza un umbral global. Debido a la influencia del ruido, la sombra del cuadrado rojo aparecerá primero y el efecto es relativamente pobre.

Umbral local

dst = cv.adaptiveThreshold(roi, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 127, 10)

Captura de pantalla del código:
Inserte la descripción de la imagen aquíel efecto del umbral local es mejor, porque hay un valor C en el umbral local, que puede eliminar algo de ruido

Filtrado de espacios en blanco

import cv2 as cv
import numpy as np

def big_image_binary(image):
    ch, cw = 200, 200  #分块每个块的大小
    h, w = image.shape[:2]
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #转成灰度图
    for row in range(0, h, ch):
        for col in range(0, w, cw):
            roi = gray[row:row+ch, col:col+cw]
            mean, std = cv.meanStdDev(roi)
            print("the picture mean:%s, std:%s" % (mean, std))
            if std < 10 and mean > 80: #如果标准差小于10或者均值大于80,将此处的值设为255
                gray[row:row + ch, col:col + cw] = 255
            else:
                ret, dst = cv.threshold(roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)  #全局阈值
                gray[row:row+ch, col:col+cw] = dst #对每个个块进行二值化处理
    cv.imshow("binary", gray)


src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/xiannvbang.jpg")
cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image", src)
big_image_binary(src)
cv.waitKey(0)
cv.destroyAllWindows()

Zoom primero, luego binarizar

Función de zoom de imagen cv.resize

 resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)

src: input, la imagen original, es decir, la imagen a cambiar de tamaño;
dst: output, la imagen modificada. Esta imagen tiene el mismo contenido que la imagen original, pero el tamaño es diferente al de la imagen original;
dsize: el tamaño de la imagen de salida. Si este parámetro no es 0, significa que la imagen original se escala al tamaño especificado por este Tamaño (ancho, alto); si este parámetro es 0, entonces se usa la siguiente fórmula para calcular:
dsize = Size (round (fxsrc .cols), round (fysrc.rows))
Entre ellos, fx y fy son los dos parámetros que se mencionarán a continuación, que son las relaciones de zoom de las direcciones de ancho y alto de la imagen.
fx: la relación de zoom en la dirección de la anchura, si es 0, se calculará de acuerdo con (doble) dsize.width / src.cols;
fy: la relación de zoom en la dirección de la altura, si es 0, entonces se calculará de acuerdo con (doble) dsize.height / src.rows;
interpolación: esta es la forma de especificar la interpolación. Después de escalar la imagen, los píxeles deben recalcularse. Este parámetro se utiliza para especificar la forma de recalcular la píxeles. Existen los siguientes:
INTER_NEAREST-interpolación del vecino más cercano
INTER_LINEAR-interpolación bilineal, si no especifica el último parámetro, este método se usa por defecto
INTER_AREA-remuestreo usando la relación de área de píxeles. Puede ser un método preferido para diezmar la imagen, ya que da resultados sin muaré. Pero cuando se amplía la imagen, es similar al método
INTER_NEAREST . INTER_CUBIC-Área de 4x4 píxeles en el vecindario Interpolación cúbica
INTER_LANCZOS4-Interpolación de Lanczos en el entorno de 8x8 píxeles

suplemento de conocimiento numpy

np.mean() 返回数组元素的平均值
np.std()  返回数组元素的标准差

Supongo que te gusta

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