Cómo dibujar un rectángulo en una imagen como esta:
matplotlib: cómo dibujar un rectángulo en la imagen

import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
im = np.array(Image.open('dog.png'), dtype=np.uint8)
plt.imshow(im)

No sé qué hacer la próxima.

InformationsquelleAutor KAI ZHAO | 2016-05-25

4 Comentarios

  1. 168

    Puede agregar un Rectángulo parche para el matplotlib Ejes.

    Por ejemplo (usando la imagen del tutorial aquí):

    import matplotlib.pyplot as plt
    import matplotlib.patches as patches
    from PIL import Image
    import numpy as np
    
    im = np.array(Image.open('stinkbug.png'), dtype=np.uint8)
    
    # Create figure and axes
    fig,ax = plt.subplots(1)
    
    # Display the image
    ax.imshow(im)
    
    # Create a Rectangle patch
    rect = patches.Rectangle((50,100),40,30,linewidth=1,edgecolor='r',facecolor='none')
    
    # Add the patch to the Axes
    ax.add_patch(rect)
    
    plt.show()

    matplotlib: cómo dibujar un rectángulo en la imagen

    • Gracias por tu respuesta! Funciona, pero parece que el rectángulo se dibuja en el eje, no la imagen en sí. Si intento guardar la imagen en un archivo, el rectángulo no se guardarán. Hay una manera para que el rectángulo reemplaza los valores de los píxeles en la imagen? Gracias de nuevo!
    • Nunca la mente. He encontrado este enlace y parece estar funcionando : )
    • Si usted todavía está recibiendo un rectángulo lleno, pasar fill=False bandera a Rectangle
    • Esto es extraño. La documentación para patches.Rectangle dice que los primeros dos números son The bottom and left rectangle coordinates. Veo aquí que los dos primeros números, (50,100), corresponden a la parte SUPERIOR e izquierda de coordenadas del rectángulo. Estoy confundido.
    • imshow ha volteado el eje y por lo tanto, 0 es en la parte superior
    • así que, a continuación, usted tiene el rectángulo mostrado en el lugar equivocado, porque imshow volcó?
    • No, el rectángulo que está en el lugar correcto. Es en las coordenadas de los datos. Usted puede cambiar la transformación si lo quieres en ejes de coordenadas

  2. 13

    Usted necesita utilizar parches.

    import matplotlib.pyplot as plt
    import matplotlib.patches as patches
    
    fig2 = plt.figure()
    ax2 = fig2.add_subplot(111, aspect='equal')
    
    ax2.add_patch(
         patches.Rectangle(
            (0.1, 0.1),
            0.5,
            0.5,
            fill=False      # remove background
         ) ) 
    fig2.savefig('rect2.png', dpi=90, bbox_inches='tight')
  3. 9

    No hay necesidad de subtramas, y pyplot puede mostrar PIL imágenes, así que esto se puede simplificar más:

    import matplotlib.pyplot as plt
    from matplotlib.patches import Rectangle
    from PIL import Image
    
    im = Image.open('stinkbug.png')
    
    # Display the image
    plt.imshow(im)
    
    # Get the current reference
    ax = plt.gca()
    
    # Create a Rectangle patch
    rect = Rectangle((50,100),40,30,linewidth=1,edgecolor='r',facecolor='none')
    
    # Add the patch to the Axes
    ax.add_patch(rect)

    O la versión corta:

    import matplotlib.pyplot as plt
    from matplotlib.patches import Rectangle
    from PIL import Image
    
    # Display the image
    plt.imshow(Image.open('stinkbug.png'))
    
    # Add the patch to the Axes
    plt.gca().add_patch(Rectangle((50,100),40,30,linewidth=1,edgecolor='r',facecolor='none'))
  4. 5

    De mi entendimiento matplotlib es un trazado de la biblioteca.

    Si desea cambiar los datos de la imagen (por ejemplo, dibujar un rectángulo en la imagen), puede utilizar PIL del ImageDraw, OpenCV, o algo similar.

    Aquí es PIL del ImageDraw método para dibujar un rectángulo.

    Aquí es uno de OpenCV métodos para dibujar un rectángulo.

    Su pregunta sobre el Matplotlib, pero probablemente debería haber preguntado sobre el dibujo de un rectángulo en una imagen.

    Aquí otra pregunta que se dirige a lo que creo que quería saber:
    Dibuje un rectángulo y un texto en el que el uso de PIL

Dejar respuesta

Please enter your comment!
Please enter your name here