web-dev-qa-db-ja.com

インライン画像の品質が低い

Scikit-imageでTIFファイルを読み込んで、ipythonノートブック(バージョン2.2.0)にインラインで表示しています。これは機能しますが、最初に表示されたときの画像は非常に小さく、画像の右下にあるドラッグ可能なハンドルを使用してサイズを変更すると、元の解像度を保持しながら画像を再スケーリングするため、拡大すると非常にぼやけます。基本的に、ipythonが私の画像をその場でサムネイルに変換しているようです。

Matplotlibのplt.imshow()も使用してみましたが、まったく同じ結果になります。 ipython notebook --pylab inlineでノートブックを開始しています。

from skimage import io
import matplotlib.pyplot as plt
image_stack = io.MultiImage("my_image.tif")
image = image_stack[0]  # it's a multi-page TIF, this gets the first image in the stack

io.imshow(image)  # or plt.imshow(image)
io.show()  # or plt.show()
29
jimbotron

ノートブックの「%matplotlib inline」の図の解像度を変更するには、次の操作を行います。

import matplotlib as mpl
mpl.rcParams['figure.dpi']= dpi

download/print ノートブックを使用する場合は、dpiを150〜300の間に設定することをお勧めします。 %matplotlib inlinempl.rcParams['figure.dpi']= dpiの前に実行されることを確認してください。そうでない場合、magicコマンドはdpiをデフォルト値にリセットします(これに気づいたのは@fabioedoardoluigialbertoの功績です)。

以下のスニペットは、savefigメソッドで保存された図のdpiのみを変更し、インラインで生成された図の変更は行いません。

import matplotlib as mpl
mpl.rc("savefig", dpi=dpi)
28

https://www.reddit.com/r/IPython/comments/1kg9e2/ipython_tip_for_getting_better_quality_inline/

セルでこの魔法を実行することもできます。

%config InlineBackend.figure_format = 'svg'

印刷品質が大幅に向上します。 svgretinaに変更して、高解像度のPNG(Niceではない)を使用することもできます。それでも、画像が複雑になりすぎると、svg画像のサイズがretina画像のサイズよりもはるかに大きくなることに注意してください

16
Costa Huang

インラインmatplotlibの図の解像度は、おそらくノートブックファイルのスペースを節約するために、GUIウィンドウまたは保存された画像に表示されるものより少し縮小されます。変更するには、次のことができます。

import matplotlib as mpl
mpl.rc("savefig", dpi=dpi)

dpiは、インラインプロットのサイズ/解像度を制御する数値です。インラインのデフォルトは80で、matplotlibのデフォルトは100です。

ハンドルをドラッグして結果のプロットを拡大縮小できないのは、プロットがpngとしてレンダリングされるため、拡大縮小しても固有の解像度は変更されないためです。

7
mwaskom

これは、イメージをドラッグしてサイズ変更するときにiPythonノートブック(インライン%matplotlib)で発生するものと同じであると仮定すると、修正は非常に簡単です。

異なるデフォルトサイズのFigureを作成する場合、デフォルトのサイズとともに解像度も増加します( ipythonでimshowの解像度を変更 )。例えば:

fig = plt.figure(figsize = (10,10))
ax = fig.add_subplot(111)
ax.imshow(array)

このような何かは、あなたがプロットしようとしているものの解像度を高めるはずです。これはあなたのコードで私にとってうまくいくようです:

from skimage import io
import matplotlib.pyplot as plt
%matplotlib inline

image_stack = io.MultiImage("my_image.tif")
image = image_stack[0] 

fig = plt.figure(figsize= (20,20)) #create an empty figure to plot into with 20x20 size
io.imshow(image)
io.show()
2
nanoman