【问题标题】:Increase image dpi for publication purpose为发布目的增加图像 dpi
【发布时间】:2021-10-17 17:21:26
【问题描述】:

图像是从 Nanonis 软件获得的典型 STM(扫描隧道显微镜)形貌,因此图像像素由软件设置固定,始终为 512 x 512 像素。然而,出于发布的目的,我们经常需要通过自制的 LabVIEW 程序来校正图像背景(进行线性背景减法等操作)。

问题是 LabVIEW 处理后导出的图像给我们一个非常低的 DPI 值(我认为它是 72 dpi)。但是对于任何学术期刊来说,它们都对图像dpi值有要求,通常,我们提交的文章中的图像至少需要300dpi。 (我们一直在尝试通过修改 LabVIEW 程序来解决这个问题,但是它太复杂了,到目前为止还没有运气......这就是为什么我意识到 Python 可能会拯救我们的一天......?)

所以我想知道,谁能帮我写一个 Python 代码来定义一个函数(LabVIEW 只能调用 Python 函数)来增加图像的 dpi(png),而不改变图像大小(宽度和高度) ?

(也许通过PIL 包?不幸的是,我对那个不是很熟悉) 一个PNG图像样本在这里:

【问题讨论】:

  • StackOverflow 不是一个代码编写服务。您可能应该去搜索 python 代码来调整/放大图像。
  • @balmy 她不想改变大小。我也认为这违反了 dpi 的定义,但实际上并非如此
  • @Maggie 我不确定你为什么必须与 LABVIEW 集成(不知道这个软件)。您可以在导出后直接处理 png 而无需在 LABVIEW 中编写脚本吗?
  • 问:像素是什么“大小”? A:像素没有大小,由元数据决定。你想要更多的像素来调整图像的大小 - 听起来你可能还需要调整 DPI 以使其在更高 DPI 下的“大小”相同
  • 在您想要打印之前,dpi 完全无关紧要。如果您想要 300dpi 的 7 英寸边的打印件,则需要 2,100 像素——仅此而已。如果您只有 512 个,则必须通过猜测额外的像素将其扩展到 2,100 个。

标签: python image image-processing python-imaging-library


【解决方案1】:

我认为这可以满足您使用 PIL 的要求。请注意,我使用的测试图像是您问题中的图像,它是 RGB 图像,而不是灰度图像,因此转换后的图像也是如此。如果在调整大小之前将图像转换为灰度,图像会小很多(PIL 也可以轻松做到这一点)。

代码还假设图像是正方形的。但是可以通过独立的宽度和高度遵循相同的模式来扩展处理任意大小。

from PIL import Image


print_dpi = 300
print_size = 3.46  # Inches

filename = 'STM_topography.png'
new_filename = 'STM_topography_resized.png'

img = Image.open(filename)
print(f'{img.size=}')
width, height = img.size

new_size = int(print_dpi * print_size)
img = img.resize((new_size, new_size), resample=Image.BICUBIC)
# img.show()
img.save(new_filename, dpi=(print_dpi, print_dpi))

【讨论】:

  • 奇迹发生了!!谢谢!!我看到我必须先 resize 它,然后再用 PIL 保存它
  • @Maggie 你确实不想想要这样做。您应该以在显微镜中获得的分辨率在纸上显示图像。这个“技巧”只是在你的论文的 PDF 中增加了很多兆字节,而没有添加任何信息。发布者对最小 DPI 的要求是针对生成的图像(例如,图表的图片),否则会显得块状且难看。您可以告诉发布者提交的图片是自然分辨率,他们会接受。
  • @Maggie:如果来自 STM 的图像不符合生成图像的条件,我不知道是什么,哈哈。从某种意义上说,克里斯是正确的,这基本上只是改变了图像中的像素数并将其 dpi 元数据设置为 300——根据你told me 的最后一件事。这样做的另一种方法可能是将其 dpi 设置为round(512 / 3.46),即148。哪个正确取决于目标是什么。
  • @Maggie:我的答案中的代码计算了一个 1,038 像素宽的值,因此您可能希望将 new_size 硬编码为 1040 以满足数字的文章提交指南。您可以通过更改new_filename = 'STM_topography_resized.tif' 并使用img.save(new_filename, fomat='TIFF', dpi=(print_dpi, print_dpi)) 将调整大小的图像保存为TIFF。在此之前,您还可以通过img = img.convert('L', (1, 0, 0, 1)) 将其转换为灰度。
  • @Cris Luengo 谢谢大家的提醒,我明白你的观点。我只是想在这里稍微探索一下我的选择。
【解决方案2】:

您应该尝试使用 PIL 的 Image.save

img.save(fn, dpi=(300,300))

我实际上不得不用谷歌搜索,因为对我来说 dpi 直接取决于图像比例和屏幕。然而,围绕这个术语似乎有很多混淆。它用于不同的事情,也可以独立设置为大小作为打印机打印大小的提示。

更多信息here

【讨论】:

  • 这样做将使原始 512 x512 图像被视为 512/3001.7 英寸正方形。我认为做事的方法是决定图像在现实世界坐标中应该有多大,然后确定需要多少像素,并将图像像素缩放为所需的数字——除了提供dpi参数。
  • @log0 谢谢!我试过这个,结果证明这个“快速修复”牺牲了图像大小。原始图像为 7.1 英寸高 x 7.1 英寸宽,dpi 为 72,在简单地“放大”dpi 数字后,现在图像的 dpi 为 300,但尺寸变为 1.7" x 1.7"。再说一次,我真的很困惑,为什么 Photoshop 可以制作“魔术”,似乎它可以在保留尺寸的同时提升 dpi(也许这就是它不是免费的原因......)无论如何,要求出版商提供一定的 dpi 是可以理解的,但是我们也希望能够为我们的论文呈现“体面”大小的图像/照片......
  • @Maggie:Photoshop 会自动执行我在评论中描述的操作。
  • @martineau 我们用于获取此类 STM 图像的软件(Nanonis)正在为每个图像设置像素,这在显微镜研究领域有点“惯例”,512 是人们的最大像素通常为他们的设备设置。
  • @Maggie:如果你有一个 512 x 512 像素的 .png 图像,你可以告诉我你希望它在 300 dpi 时的尺寸(英寸),那么我可以告诉你怎么做它与 PIL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
相关资源
最近更新 更多