内嵌图像质量低
Posted
技术标签:
【中文标题】内嵌图像质量低【英文标题】:inline images have low quality 【发布时间】:2014-10-14 06:30:24 【问题描述】:我正在加载一个带有 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()
【问题讨论】:
【参考方案1】:内联 matplotlib 图形的分辨率比您在 GUI 窗口或保存的图像中看到的分辨率有所降低,大概是为了节省笔记本文件中的空间。要更改它,您可以这样做:
import matplotlib as mpl
mpl.rc("figure", dpi=dpi)
dpi
是一个控制内联图大小/分辨率的数字。我相信内联默认值是 80,而 matplotlib 其他地方的默认值是 100。
通过拖动手柄来缩放结果图不起作用的原因是该图被渲染为 png,因此缩放它会缩放但不会改变固有分辨率。
【讨论】:
另外,您可以调整图形的大小:plt.figure(figsize=(5, 10)
,这将使您的图像在屏幕上更加详细。
@mwaskom - 这没什么区别
@StefanvanderWalt 这会抛出:FormatterWarning: Exception in image/png formatter: width and height must each be below 32768 (它们都是,所以我不知道如何解释这个异常)跨度>
您需要更具体地说明您所做的工作以及输出的具体情况,否则我们可能无法提供更多帮助。您可以使用此信息编辑原始问题。
为了让它工作,我必须在mpl.rc(..)
调用之前执行%matplotlib inline
。【参考方案2】:
假设这与 iPython 笔记本(使用 %matplotlib 内联)在您拖动图像并调整大小时发生的情况相同,则修复相当简单。
如果你只是创建一个具有不同默认大小的图形,那么分辨率也会随着默认大小(Change resolution of imshow in ipython)的增加而增加。例如:
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()
【讨论】:
【参考方案3】:要更改笔记本上的“%matplotlib inline”图形分辨率,请执行以下操作:
import matplotlib as mpl
mpl.rcParams['figure.dpi']= dpi
如果您要使用笔记本电脑download/print,我建议将 dpi 设置在 150 到 300 之间。确保 %matplotlib inline
在 mpl.rcParams['figure.dpi']= dpi
之前运行,否则魔法命令会将 dpi 重置为其默认值(感谢 @fabioedoardoluigialberto 注意到这一点)。
下面的代码片段只改变通过 savefig 方法保存的图形的 dpi,而不是内联生成的图形。
import matplotlib as mpl
mpl.rc("savefig", dpi=dpi)
【讨论】:
这其实是正确最简单的答案。谢谢 请注意,如果您将所有内容放在同一个单元格中,则会出现错误行为。我认为这是因为魔术命令%matplotlib
触发了异步行为,它在mpl.rcParams['figure.dpi'] = dpi
命令执行之后设置dpi 。一个快速的解决方案是将命令拆分到不同的单元格中。
嗯,好点。我做了一些测试,似乎 %matplotlib inline
魔术命令将 dpi 重置为 matplotlib 默认值(可能是 matplotlib.rc 文件中设置的任何内容)。如果你在魔法命令之后运行mpl.rcParams['figure.dpi']= dpi
应该没问题。
只需添加 %matplotlib inline
不再需要 Python 3,但此解决方案仍然有效。只是在导入命令之后添加。【参考方案4】:
根据https://www.reddit.com/r/IPython/comments/1kg9e2/ipython_tip_for_getting_better_quality_inline/
你也可以在你的牢房中施展这个魔法:
%config InlineBackend.figure_format = 'svg'
打印质量看起来会好很多。您还可以将svg
更改为retina
,以使用更高分辨率的PNG(不太好)。不过请注意,如果您的图片变得过于复杂,svg
的图片会比retina
的图片大很多
【讨论】:
这应该更广为人知:) 出于某种原因,我完全搞砸了 Jupyter 笔记本页面。 @IgorFilippov 很抱歉听到这个消息。也许试试%config InlineBackend.figure_format = 'retina'
?
NB SVG 还不能是 nbconvert
到乳胶。 github.com/jupyter/nbconvert/issues/244以上是关于内嵌图像质量低的主要内容,如果未能解决你的问题,请参考以下文章