2016-01-13 122 views
3

我無法保存圖像沒有白色邊框,並且在初始分辨率(1037x627Matplotlib - 無法在相同的分辨率的圖像保存爲原始圖像

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) 

初始圖像

Initial img

結果

Resulting img

此外,我需要白色文本PA=something在圖像上而不會改變分辨率。根據我的理解,添加另一個文字像可能會自動更改分辨率。

謝謝您的時間!

回答

12

有兩個因素在起作用這裏:

  1. Axes默認不
  2. matplotlib佔據整個Figure,該Figure的大小是固定的,其內容被拉伸/擠壓/內插以適應該圖。你想Figure的大小由其內容定義。

做你想要做什麼,有三個步驟:

  1. 創建基於圖像的大小和一組DPI
  2. 的人物添加一個插曲/軸,佔用整個數字
  3. 保存數字與DPI你用來計算數字的大小

讓我們使用一個隨機的哈勃圖像從NASA http://www.nasa.gov/sites/default/files/thumbnails/image/hubble_friday_12102015.jpg 。這是一個1280x1216像素的圖像。

這裏有一個詳細的註釋例子來引導您完成它:

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

enter image description here

保存的test.jpg將完全1280x1216像素。當然,因爲我們對輸入和輸出都使用有損壓縮格式,所以由於壓縮僞影,您無法獲得完美的像素匹配。但是,如果你使用無損輸入和輸出格式,你應該。

+1

噢,我的天啊,非常感謝你! 這個解釋正是我需要的,僅僅解決問題還不夠,我真的想知道未來應該避免什麼。我從來沒有使用註釋,但只是純文本,這是超級有用的,我不能再感激! – Tigs

+2

@Tigs - 樂意幫忙! –