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.

Encuentre el número de celdas de la cuadrícula que contienen puntos x, y.

Entonces, he escrito el siguiente código:

import numpy as np
import matplotlib.pyplot as plt

x = np.random.randint(-960,960,15)
y = np.random.randint(-540,540,15)
fig, ax = plt.subplots(figsize=(20, 11))
ax.scatter(x, y, marker='o', color='red', alpha=0.8)
img = plt.imread(scene_folder)
plt.imshow(img, extent = [-960, 960, -540, 540], aspect='auto')
plt.grid(color='white', linestyle='--', linewidth=1)
plt.show()
plt.close()

Este código genera esta imagen:

Imagen generada por el código

Hasta aquí todo bien. Lo que quiero lograr a continuación es verificar qué cuadrículas contienen puntos (puntos rojos) y obtener una imagen como esta (las cuadrículas que contienen puntos rojos ahora son blancas):

Imagen de cuadrículas con algunos rectángulos blancos donde los puntos están localizados

Luego, quiero obtener el número de cuadrículas que están blancas (o de cualquier otro color) y dividirlo por el número total de cuadrículas en esa imagen. La imagen de arriba tiene 48 cuadrículas, 13 de las cuales son blancas (13/48=27,1%).

¿Alguna idea sobre cómo abordar esto? Gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr este objetivo, puedes crear una cuadrícula usando el método meshgrid() de numpy y luego utilizar la indexación booleana para comprobar qué cuadrículas contienen puntos. Aquí está el código que puedes agregar a tu código existente:

    # Crear una cuadrícula
    x_grid = np.linspace(-960, 960, 97)
    y_grid = np.linspace(-540, 540, 55)
    xx, yy = np.meshgrid(x_grid, y_grid)
    
    # Comprobar qué cuadrículas contienen puntos
    contains_points = np.zeros_like(xx, dtype=bool)
    for i in range(len(x)):
        # Obtener los índices de la cuadrícula que contiene el punto
        xi = np.searchsorted(x_grid, x[i])
        yi = np.searchsorted(y_grid, y[i])
        contains_points[yi-1:yi+2, xi-1:xi+2] = True  # Marcar también las cuadrículas vecinas
    
    # Mostrar el resultado
    fig, ax = plt.subplots(figsize=(20, 11))
    ax.imshow(contains_points, extent=[-960, 960, -540, 540], cmap='gray')
    img = plt.imread(scene_folder)
    plt.imshow(img, extent = [-960, 960, -540, 540], aspect='auto')
    plt.grid(color='white', linestyle='--', linewidth=1)
    plt.show()
    plt.close()
    
    # Calcular el porcentaje de cuadrículas blancas
    num_grids = contains_points.size
    num_white_grids = np.sum(contains_points)
    percentage_white = num_white_grids / num_grids * 100
    print(f"Porcentaje de cuadrículas blancas: {percentage_white:.1f}%")
    

    Este código crea una cuadrícula con una resolución de 20×20 píxeles (97×55 cuadrículas en total), luego recorre todos los puntos y marca también las cuadrículas vecinas (para asegurarse de que el punto se capture correctamente). El array contains_points tendrá el valor True para todas las cuadrículas que contengan puntos y False de lo contrario.

    El código luego muestra el array contains_points como una imagen usando un mapa de colores en escala de grises (para que el blanco sea 1 y el negro sea 0), sobre la imagen original. Finalmente, calcula el porcentaje de cuadrículas blancas e imprime el resultado en la consola.

Comments are closed.