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.
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)
Busco obtener algo así como esto como salida, una imagen en escala de grises/blanco y negro solo mostrando las carreteras/líneas.
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:
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óncv2.cvtColor()
. A continuación, aplicamos la umbralización adaptativa a la imagen en escala de grises usando la funcióncv2.adaptiveThreshold()
. La opcióncv2.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óncv2.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óncv2.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.
En este código, primero cargamos la imagen umbralizada usando la función
cv2.imread()
y especificamos la opcióncv2.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ónnp.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ónprint()
.