es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eliminación de etiquetas de texto de una imagen de mapa básico, mejorando las carreteras mediante la visión por computadora con Python.

Tengo una imagen RGB-A (png) de 760×760 de Azure Maps que se muestra a continuación. Me gustaría quitar el texto si es posible y solo tener visibles las carreteras/líneas, y luego calcular el% del área relativa ocupada por las carreteras.


imagen

He intentado hacer umbrales en los mapas de color y tal vez eliminar la inversión de cada uno, pero no lo he logrado. Simplemente me preguntaba si hay una manera fácil.

img = imagen_mapa
img_gris = 255 - img[:, :, 2]

fig = plt.figure()
ax1 = fig.add_subplot(1,2,1)
ax1.imshow(img_gris, cmap='gray', vmin=5, vmax=14)
ax2 = fig.add_subplot(1,2,2)
ax2.imshow(img_gris, cmap='gray', vmin=0, vmax=50)


imagen

Busco obtener algo así como esto como salida, una imagen en escala de grises/blanco y negro solo mostrando las carreteras/líneas.


imagen

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para eliminar el texto de la imagen RGB-A y mostrar solo las carreteras/líneas, podemos usar la umbralización. La umbralización es una técnica donde convertimos la imagen a una imagen binaria, con solo dos posibles valores de píxeles – negro (0) y blanco (255), basados en un valor umbral.

    Podemos lograr esto en Python con la ayuda de la biblioteca OpenCV. Aquí hay un fragmento de código para empezar:

    import cv2
    
    # Leer la imagen
    img = cv2.imread("map_image.png", cv2.IMREAD_UNCHANGED)
    
    # Convertir la imagen a escala de grises
    gris = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # Aplicar umbralización adaptativa
    umbral = cv2.adaptiveThreshold(gris, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
    
    # Guardar la imagen umbralizada
    cv2.imwrite("thresholded_image.png", umbral)
    

    En este código, primero leemos la imagen usando la función cv2.imread(). Luego, convertimos la imagen a escala de grises usando la función cv2.cvtColor(). A continuación, aplicamos la umbralización adaptativa a la imagen en escala de grises usando la función cv2.adaptiveThreshold(). La opción cv2.ADAPTIVE_THRESH_GAUSSIAN_C aplica la umbralización adaptativa, donde el valor umbral se calcula para cada píxel en función de la media de sus píxeles circundantes. La opción cv2.THRESH_BINARY_INV establece el píxel de salida en blanco si el píxel de entrada está por debajo del umbral, y negro si está por encima de él. Finalmente, guardamos la imagen umbralizada usando la función cv2.imwrite().

    Una vez que tenemos la imagen umbralizada, podemos calcular el porcentaje de área relativa ocupada por las carreteras/líneas dividiendo el número de píxeles en las carreteras/líneas por el número total de píxeles en la imagen.

    import numpy as np
    
    # Cargar la imagen umbralizada
    umbral = cv2.imread("thresholded_image.png", cv2.IMREAD_GRAYSCALE)
    
    # Calcular el porcentaje de área relativa ocupada por las carreteras/líneas
    total_píxeles = umbral.shape[0] * umbral.shape[1]
    píxeles_carretera = np.count_nonzero(umbral == 0)
    porcentaje_área = píxeles_carretera / total_píxeles * 100
    print("Porcentaje de área relativa ocupada por las carreteras/líneas: {:.2f}%".format(porcentaje_área))
    

    En este código, primero cargamos la imagen umbralizada usando la función cv2.imread() y especificamos la opción cv2.IMREAD_GRAYSCALE para cargar la imagen como una imagen en escala de grises. Luego, calculamos el número total de píxeles en la imagen multiplicando sus dimensiones. Contamos el número de píxeles en las carreteras/líneas contando el número de píxeles con valor 0 en la imagen umbralizada usando la función np.count_nonzero(). Finalmente, calculamos el porcentaje de área relativa ocupada por las carreteras/líneas dividiendo el número de píxeles de carretera por el número total de píxeles en la imagen y multiplicando por 100. Imprimimos el resultado usando la función print().

Comments are closed.