Matplotlib-无法以与原始图像相同的分辨率保存图像 [英] Matplotlib - unable to save image in same resolution as original image
问题描述
我无法保存没有白色边框和初始分辨率(1037x627
)的图像
I am unable to save the image without the white borders and at the initial resolution (1037x627
)
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import pyplot, lines
import matplotlib.image as mpimg
from matplotlib.patches import Ellipse
x=[0,0,0,0,0]
y=[0,0,0,0,0]
a=10**1.3*15
inc=25
b=np.cos(np.radians(inc))*a
x[0],y[0]=516.667,313.021
x[1],y[1]=x[0]-a,y[0]
x[2],y[2]=x[0]+a,y[0]
x[3],y[3]=x[0],y[0]+b
x[4],y[4]=x[0],y[0]-b
for pa in range(0,10,5):
fig, ax = plt.subplots()
img=mpimg.imread('IC342.png')
imgplot = plt.imshow(img)
x[1],y[1]=x[0]-a/2*np.cos(np.radians(pa)),y[0]-a/2*np.sin(np.radians(pa))
x[2],y[2]=x[0]+a/2*np.cos(np.radians(pa)),y[0]+a/2*np.sin(np.radians(pa))
x[3],y[3]=x[0]+b/2*np.cos(np.radians(pa+90)),y[0]+b/2*np.sin(np.radians(pa+90))
x[4],y[4]=x[0]-b/2*np.cos(np.radians(pa+90)),y[0]-b/2*np.sin(np.radians(pa+90))
ell = Ellipse(xy=[516.667,313.021], width=a, height=b, angle=pa, edgecolor='b',lw=4, alpha=0.5, facecolor='none')
name='plt'+str(pa)+'.png'
leg='PA='+str(pa)
#ax.text(10, 10, leg, fontsize=15,color='white')
ax.add_artist(ell)
xn=[x[1],x[2],x[0]]
yn=[y[1],y[2],y[0]]
xnw=[x[3],x[4],x[0]]
ynw=[y[3],y[4],y[0]]
line = lines.Line2D(xn, yn, linestyle='-.',lw=5., color='r', alpha=0.4)
line1 = lines.Line2D(xnw, ynw, linestyle='-.',lw=5., color='g', alpha=0.4)
ax.add_line(line)
ax.add_line(line1)
plt.axis('off')
fig.savefig(name, transparent=True, bbox_inches='tight', pad_inches=0,dpi=150 )
初始图像
结果
我还需要白色文本PA=something
出现在图像上,而无需更改分辨率.据我了解,添加其他图形(例如文本)可能会自动更改分辨率.
Also I need the white text PA=something
to be on the image without changing the resolution. From what I understand adding another figure like text might automatically change the resolution.
谢谢您的时间!
推荐答案
这里有两个因素在起作用:
There are two factors at play here:
- 默认情况下,
Axes
不会占用整个Figure
- 在
matplotlib
中,Figure
的大小是固定的,并且内容被拉伸/压缩/内插以适合图形.您希望Figure
的大小由其内容来定义.
- An
Axes
doesn't take up the entireFigure
by default - In
matplotlib
, theFigure
's size is fixed, and the contents are stretched/squeezed/interpolated to fit the figure. You want theFigure
's size to be defined by its contents.
要做您想做的事,分三个步骤:
To do what you want to do, there are three steps:
- 根据图像的大小和设置的DPI创建图形
- 添加占用整个图形的子图/轴
- 使用用于计算图形尺寸的DPI保存图形
我们使用来自美国国家航空航天局(Nasa)的随机哈勃图像 http://www.nasa.gov/sites/default/files/thumbnails/image/hubble_friday_12102015.jpg .这是1280x1216像素的图像.
Let's use a random Hubble image from Nasa http://www.nasa.gov/sites/default/files/thumbnails/image/hubble_friday_12102015.jpg. It's a 1280x1216 pixel image.
以下是一个受到严重评论的示例,可以指导您完成操作:
Here's a heavily commented example to walk you through it:
import matplotlib.pyplot as plt
# On-screen, things will be displayed at 80dpi regardless of what we set here
# This is effectively the dpi for the saved figure. We need to specify it,
# otherwise `savefig` will pick a default dpi based on your local configuration
dpi = 80
im_data = plt.imread('hubble_friday_12102015.jpg')
height, width, nbands = im_data.shape
# What size does the figure need to be in inches to fit the image?
figsize = width / float(dpi), height / float(dpi)
# Create a figure of the right size with one axes that takes up the full figure
fig = plt.figure(figsize=figsize)
ax = fig.add_axes([0, 0, 1, 1])
# Hide spines, ticks, etc.
ax.axis('off')
# Display the image.
ax.imshow(im_data, interpolation='nearest')
# Add something...
ax.annotate('Look at This!', xy=(590, 650), xytext=(500, 500),
color='cyan', size=24, ha='right',
arrowprops=dict(arrowstyle='fancy', fc='cyan', ec='none'))
# Ensure we're displaying with square pixels and the right extent.
# This is optional if you haven't called `plot` or anything else that might
# change the limits/aspect. We don't need this step in this case.
ax.set(xlim=[0, width], ylim=[height, 0], aspect=1)
fig.savefig('test.jpg', dpi=dpi, transparent=True)
plt.show()
保存的test.jpg
将恰好是1280x1216像素.当然,由于我们对输入和输出都使用了有损压缩格式,因此由于压缩伪像,您将无法获得完美的像素匹配.但是,如果您使用无损输入和输出格式,则应该这样做.
The saved test.jpg
will be exactly 1280x1216 pixels. Of course, because we're using a lossy compressed format for both input and output, you won't get a perfect pixel match due to compression artifacts. If you used lossless input and output formats you should, though.
这篇关于Matplotlib-无法以与原始图像相同的分辨率保存图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!