内嵌图像质量低

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: E​​xception 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 inlinempl.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

以上是关于内嵌图像质量低的主要内容,如果未能解决你的问题,请参考以下文章

调整大小后的图像质量非常低——Java

使用自定义相机的图像质量很差

一种基于FSIM对视频编码图像质量客观评价的方法

基于SPIHT小波变换的图像解压缩matlab仿真,输出PSNR值评价图像解压后质量

微软专利用缓存和基图渲染实现移动VR低延迟高质量视觉显示

HTML5 Canvas Resize (Downscale) 图像质量高吗?