I’m am somewhat of a beginner regarding Python and currently stumbling over a problem that sounds easy to do but already cost me hours because I can’t figure it out. This is what I want to do:
- Read in an image from disk (pngs in my case)
- Draw some shapes into it, like rectangles, …
- Display the resulting image in my jupyter notebook and also save it back to file
I’m currently using matplotlib for the drawing part. The issue: This process does not preserve resolution. The resulting png written to file is scaled by some random amount. As far as I understand, this is because matplotlib is using physical units and everything is dependent on screen size etc. That’s a problem for me because I want to have pixel perfect drawing of the shapes and draw/save the image in the exact same resolution. I’m beginning to think that matplotlib might not be the right tool for what I want to do.
Any advice? Below is the code I am currently using.
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import matplotlib.patches as patches
# Read the image.
image_path = 'input_image.png'
output_image_path = 'output_image.png'
image = mpimg.imread(image_path)
# Create a figure.
fig, ax = plt.subplots(1)
ax.axis('off')
# Create a rectangle patch and add it.
rect = patches.Rectangle((100, 100), 20, 20, linewidth=1, edgecolor='r', facecolor='none')
ax.add_patch(rect)
ax.imshow(image)
# Save result.
plt.savefig(output_image_path, bbox_inches='tight', pad_inches=0)
# Input image: (1200x800)
# Output image: (496x330)