Lectores como tú ayudan a apoyar a MUO. Cuando realiza una compra utilizando enlaces en nuestro sitio, podemos ganar una comisión de afiliado. Leer más. Es posible que desee digitalizar un documento para ahorrar espacio físico o crear una copia de seguridad. De cualquier manera, escribir un programa que pueda convertir fotos de sus archivos en papel a un formato estándar es una tarea en la que Python sobresale. Usando una combinación de bibliotecas apropiadas, puede crear una pequeña aplicación para digitalizar documentos. Su programa tomará una imagen de un documento físico como entrada, le aplicará varias técnicas de procesamiento de imágenes y generará una versión escaneada de la entrada. googletag.cmd.push(function() { googletag.display(‘div-gpt-ad-1494450502098-primis’); }); Preparación de su entorno Para seguir este artículo, debe estar familiarizado con los conceptos básicos de Python. También debe comprender cómo trabajar con la biblioteca NumPy Python. Abra cualquier IDE de Python y cree dos archivos de Python. Nombra uno main.py y el otro transform.py. Luego ejecute el siguiente comando en la terminal para instalar las bibliotecas requeridas. pip install OpenCV-Python imutils scikit-image NumPy Utilizará OpenCV-Python para tomar la entrada de imagen y realizar algún procesamiento de imagen. Imutils para cambiar el tamaño de las imágenes de entrada y salida. scikit-image para aplicar un umbral en la imagen. NumPy te ayudará a trabajar con arreglos. Espere a que finalice la instalación y que el IDE actualice los esqueletos del proyecto. Una vez completada la actualización de los esqueletos, está listo para comenzar a codificar. El código fuente completo está disponible en un repositorio de GitHub. Importación de las bibliotecas instaladas Abra el archivo main.py e importe las bibliotecas que instaló en el entorno. Esto le permitirá llamar y utilizar sus funciones cuando sea necesario. import cv2import imutilsfrom skimage.filters import threshold_localfrom transform import outlook_transform Ignore el error arrojado en la perspectiva_transform. Desaparecerá cuando termine de trabajar en el archivo transform.py. Tomar y cambiar el tamaño de la entrada Tome una imagen clara del documento que desea escanear. Asegúrese de que las cuatro esquinas del documento y su contenido estén visibles. Copie la imagen en la misma carpeta en la que está almacenando los archivos del programa. Pase la ruta de la imagen de entrada a OpenCV. Haga una copia de la imagen original, ya que la necesitará durante la transformación de perspectiva. Divide la altura de la imagen original por la altura a la que deseas cambiar su tamaño. Esto mantendrá la relación de aspecto. Finalmente, imprima la imagen redimensionada. # Pasando la imagen pathoriginal_img = cv2.imread(‘sample.jpg’)copy = original_img.copy()# La altura redimensionada en cientosratio = original_img.shape[0] / 500.0img_resize = imutils.resize(original_img, height=500)# Mostrando salidacv2.imshow(‘Imagen redimensionada’, img_resize)# Esperando a que el usuario presione cualquier teclacv2.waitKey(0) El resultado del código anterior es el siguiente : Ahora ha cambiado el tamaño de la altura de la imagen original a 500 píxeles. Conversión de la imagen redimensionada a escala de grises Convierta la imagen RGB redimensionada a escala de grises. La mayoría de las bibliotecas de procesamiento de imágenes solo funcionan con imágenes en escala de grises, ya que son más fáciles de procesar. gray_image = cv2.cvtColor(img_resize, cv2.COLOR_BGR2GRAY)cv2.imshow(‘Grayed Image’, gray_image)cv2.waitKey(0) Observe la diferencia entre la imagen original y la gris. La mesa de colores se ha convertido en blanco y negro. Aplicación de un detector de bordes Aplique un filtro de desenfoque gaussiano en la imagen atenuada para eliminar el ruido. Luego llame a la función Canny de OpenCV para detectar los bordes presentes en la imagen. imagen_borrosa = cv2.GaussianBlur(imagen_gris, (5, 5), 0)edge_img = cv2.Canny(imagen_borrosa, 75, 200)cv2.imshow(‘Bordes de la imagen’, edged_img)cv2.waitKey(0) Los bordes son visibles en La salida. Los bordes con los que trabajará son los del documento. Búsqueda del contorno más grande Detecte los contornos presentes en la imagen con bordes. Ordenarlos en orden descendente manteniendo solo los cinco contornos más grandes. Aproxime el contorno más grande con cuatro lados recorriendo los contornos ordenados. cnts, _ = cv2.findContours(edged_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[:5]for c in cnts: peri = cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, 0.02 * peri, True) if len(approx) == 4: doc = approx break Es probable que el contorno con cuatro lados contener el documento. Rodear las cuatro esquinas del contorno del documento Encierre en un círculo las esquinas del contorno del documento detectado. Esto lo ayudará a determinar si su programa pudo detectar el documento en la imagen. p = []para d en doc: tuple_point = tuple(d[0]) cv2.circle(img_resize, tuple_point, 3, (0, 0, 255), 4) p.append(tuple_point)cv2.imshow(‘Puntos de esquina en un círculo’, img_resize)cv2.waitKey(0) Implementar círculos en el tamaño modificado imagen RGB. Habiendo detectado el documento, ahora necesita extraer el documento de la imagen. Uso de la perspectiva Warp para obtener la imagen deseada La perspectiva Warp es una técnica de visión artificial para transformar una imagen para corregir las distorsiones. Transforma una imagen en un plano diferente permitiéndole ver la imagen desde un ángulo diferente. imagen_deformada = perspectiva_transform(copiar, doc.reformar(4, 2) * proporción)imagen_deformada = cv2.cvtColor(imagen_deformada, cv2.COLOR_BGR2GRAY)cv2.imshow(“Imagen deformada”, imutils.resize(imagen_deformada, altura=650))cv2 .waitKey(0) Para obtener una imagen deformada, debe crear un módulo simple que realizará la transformación de la perspectiva. Módulo de transformación El módulo ordenará los puntos de las esquinas del documento. También transformará la imagen del documento en un plano diferente y cambiará el ángulo de la cámara a una toma desde arriba. Abra el archivo transform.py que creó anteriormente. Importe bibliotecas OpenCV y NumPy. import numpy as npimport cv2 Este módulo contendrá dos funciones. Cree una función que ordenará las coordenadas de los puntos de las esquinas del documento. La primera coordenada será la de la esquina superior izquierda, la segunda será la de la esquina superior derecha, la tercera será la de la esquina inferior derecha y la cuarta coordenada será la de la esquina inferior izquierda. def order_points(pts): # inicializando la lista de coordenadas a ordenar rect = np.zeros((4, 2), dtype = “float32″) s = pts.sum(axis = 1) # el punto superior izquierdo tendrá la suma mas pequeña recta[0] = puntos[np.argmin(s)]# el punto inferior derecho tendrá la suma más grande rect[2] = puntos[np.argmax(s)]”’Al calcular la diferencia entre los puntos, el punto de arriba a la derecha tendrá la diferencia más pequeña, mientras que el de abajo a la izquierda tendrá la diferencia más grande”’ diff = np.diff(pts, axis = 1) rect[1] = puntos[np.argmin(diff)]rectificar[3] = puntos[np.argmax(diff)]# devuelve las coordenadas ordenadas return rect Cree una segunda función que calculará las coordenadas de las esquinas de la nueva imagen y obtendrá una toma desde arriba. Luego calculará la matriz de transformación de perspectiva y devolverá la imagen deformada. def transformación_perspectiva(imagen, pts): # desempaquetar las coordenadas ordenadas individualmente rect = order_points(pts) (tl, tr, br, bl) = rect ”’calcular el ancho de la nueva imagen, que será la distancia máxima entre la parte inferior -coordenadas x derecha e inferior izquierda o coordenadas x superior derecha e izquierda ”’ widthA = np.sqrt(((br[0] – bl[0]) ** 2) + ((br[1] – bl[1]) ** 2)) anchoB = np.sqrt(((tr[0] – tl[0]) ** 2) + ((tr[1] – tl[1]) ** 2)) maxWidth = max(int(widthA), int(widt hB)) ”’calcular la altura de la nueva imagen, que será la distancia máxima entre las coordenadas y superior izquierda e inferior izquierda’ ” alturaA = np.sqrt(((tr[0] – hermano[0]) ** 2) + ((tr[1] – hermano[1]) ** 2)) alturaB = np.sqrt(((tl[0] – bl[0]) ** 2) + ((tl[1] – bl[1]) ** 2)) maxHeight = max(int(heightA), int(heightB)) ”’construye el conjunto de puntos de destino para obtener un plano cenital”’ dst = np.array([      [0, 0],[maxWidth – 1, 0],[maxWidth – 1, maxHeight – 1],[0, maxHeight – 1]], dtype = “float32″) # calcular la matriz de transformación de perspectiva transform_matrix = cv2.getPerspectiveTransform(rect, dst) # Aplicar la matriz de transformación warped = cv2.warpPerspective(image, transform_matrix, (maxWidth, maxHeight)) # devolver la imagen deformada return warped Ahora ha creado el módulo de transformación. El error en la importación de outlook_transform ahora desaparecerá. Observe que la imagen que se muestra tiene un plano cenital. Aplicar el umbral adaptativo y guardar la salida escaneada En el archivo main.py, aplique el umbral gaussiano a la imagen deformada. Esto le dará a la imagen deformada un aspecto escaneado. Guarde la salida de la imagen escaneada en la carpeta que contiene los archivos del programa. T = umbral_local(imagen_distorsionada, 11, desplazamiento=10, método=”gaussiano”)distorsionado = (imagen_distorsionada > T).astype(“uint8”) * 255cv2.imwrite(‘./’+’scan’+’.png’ ,deformado) Guardar el escaneo en formato PNG mantiene la calidad del documento. Visualización de la salida Emita la imagen del documento escaneado: cv2.imshow(“Imagen escaneada final”, imutils.resize(warped, height=650))cv2.waitKey(0)cv2.destroyAllWindows() La siguiente imagen muestra la salida de el programa, una toma cenital del documento escaneado. Cómo avanzar en la visión por computadora La creación de un escáner de documentos cubre algunas áreas centrales de la visión por computadora, que es un campo amplio y complejo. Para avanzar en la visión por computadora, debe trabajar en proyectos interesantes pero desafiantes. También debe leer más sobre cómo puede usar la visión por computadora con las tecnologías actuales. Esto lo mantendrá informado y le dará nuevas ideas para proyectos en los que trabajar. Read Now

Diposting pada

Es posible que desee digitalizar un documento para ahorrar espacio físico o crear una copia de seguridad. De cualquier manera, escribir un programa que pueda convertir fotos de sus archivos en papel a un formato estándar es una tarea en la que Python sobresale.


Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *