matplotlib: how to draw a rectangle on image

前端 未结 4 1716
名媛妹妹
名媛妹妹 2020-11-28 02:01

How to draw a rectangle on an image, like this:

import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
im = np.array(Image.open(\'dog.png\'         


        
相关标签:
4条回答
  • 2020-11-28 02:23

    From my understanding matplotlib is a plotting library.

    If you want to change the image data (e.g. draw a rectangle on an image), you could use PIL's ImageDraw, OpenCV, or something similar.

    Here is PIL's ImageDraw method to draw a rectangle.

    Here is one of OpenCV's methods for drawing a rectangle.

    Your question asked about Matplotlib, but probably should have just asked about drawing a rectangle on an image.

    Here is another question which addresses what I think you wanted to know: Draw a rectangle and a text in it using PIL

    0 讨论(0)
  • 2020-11-28 02:24

    You can add a Rectangle patch to the matplotlib Axes.

    For example (using the image from the tutorial here):

    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()
    

    0 讨论(0)
  • 2020-11-28 02:32

    There is no need for subplots, and pyplot can display PIL images, so this can be simplified further:

    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)
    

    Or, the short version:

    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'))
    
    0 讨论(0)
  • 2020-11-28 02:32

    You need use patches.

    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')
    
    0 讨论(0)
提交回复
热议问题