使用 Magick(在 R 中)通过变换处理多个图像

2023-12-06

我需要自动化一些图像转换来执行以下操作: - 读取 16,000 多张又短又宽的图像,尺寸不一样。 - 将每个图像重新缩放至 90 像素高 - 在图像的宽度上裁剪 90 像素,因此在 1 个图像上进行多次 90x90 裁剪 - 然后对下一个图像重复一遍 - 每个90x90图像需要按顺序保存为file-name_1.png、file-name_2.png等

我已经完成了对 8 个图像的测试,并且使用 magick 包我能够手动重新缩放每个图像并创建多个裁剪。问题是当我尝试执行多个操作时,我可以轻松调整图像大小,但在保存它们时出现问题。

# capture images, file paths in a list
img_list <- list.files("./orig_images", pattern = "\\.png$", full.names = TRUE)

# get all images in a list
all_images <- lapply(img_list, image_read)

# scale each image height - THIS DOESN'T WORK, GET NULL VALUE
scale_images <- 
  for (i in 1:length(all_images)) {
  scale_images(all_images[[i]], "x90")
    }

# all images added into one
all_images_joined <- image_join(all_images)

# scale images - THIS WORKS to scale, but problems later
all_images_scaled <- 
  image_scale(all_images_joined, "x90")

# Test whether a single file will be written or multiple files; 
# only writes one file (even if I 
for (i in 1:length(all_images_scaled)) {
  image_write(all_images_scaled[[i]], path = "filepath/new_cropimages/filename")
}

理想情况下,我会使用 for 循环缩放图像。这样我就可以将缩放后的图像保存到目录中。这不起作用 - 我没有收到错误,但是当我检查变量的内容时,它是空的。 image_join 函数将它们全部放在一起并将高度缩放到 90(宽度也按比例缩放),但我无法将单独的图像写入目录。另外,下一步是沿宽度裁剪每个图像并保存新图像 file-name_1.png,依此类推,对于每个 90x90 图像,移动超过 90 像素,裁剪 90x90,依此类推。我选择 magic 是因为它很容易单独缩放和裁剪,但我对其他想法持开放态度(或学习如何使该包发挥作用)。谢谢你的帮助。

以下是一些图片:

[Original Image, untransformed][1]
[Manual 90x90 crop][2]
[Another manual 90x90 crop, farther down the same image][3]


  [1]: https://i.stack.imgur.com/8ptXv.png
  [2]: https://i.stack.imgur.com/SF9pG.png
  [3]: https://i.stack.imgur.com/NyKxS.png

我不会说 R,但我希望能够在 ImageMagick 方面提供帮助并处理 16,000 张图像。

当您使用 Mac 时,您可以使用以下命令轻松安装 2 个非常有用的软件包homebrew, using:

brew install imagemagick
brew install parallel

所以,你的原始句子图像是 1850x105 像素,你可以在终端中看到,如下所示:

magick identify sentence.png
sentence.png PNG 1850x105 1850x105+0+0 8-bit Gray 256c 51626B 0.000u 0:00.000

如果将高度调整为 90 像素,并按比例保留宽度,则它将变为 1586x90 像素:

magick sentence.png -resize x90 info:
sentence.png PNG 1586x90 1586x90+0+0 8-bit Gray 51626B 0.060u 0:00.006

因此,如果您调整大小,然后裁剪成 90 像素宽的块:

magick sentence.png -resize x90 -crop 90x chunk-%03d.png

您将得到 18 个块,除了最后一个块外,每个块宽 90 px,如下所示:

-rw-r--r--  1 mark  staff  5648  6 Jun 08:07 chunk-000.png
-rw-r--r--  1 mark  staff  5319  6 Jun 08:07 chunk-001.png
-rw-r--r--  1 mark  staff  5870  6 Jun 08:07 chunk-002.png
-rw-r--r--  1 mark  staff  6164  6 Jun 08:07 chunk-003.png
-rw-r--r--  1 mark  staff  5001  6 Jun 08:07 chunk-004.png
-rw-r--r--  1 mark  staff  6420  6 Jun 08:07 chunk-005.png
-rw-r--r--  1 mark  staff  4726  6 Jun 08:07 chunk-006.png
-rw-r--r--  1 mark  staff  5559  6 Jun 08:07 chunk-007.png
-rw-r--r--  1 mark  staff  5053  6 Jun 08:07 chunk-008.png
-rw-r--r--  1 mark  staff  4413  6 Jun 08:07 chunk-009.png
-rw-r--r--  1 mark  staff  5960  6 Jun 08:07 chunk-010.png
-rw-r--r--  1 mark  staff  5392  6 Jun 08:07 chunk-011.png
-rw-r--r--  1 mark  staff  4280  6 Jun 08:07 chunk-012.png
-rw-r--r--  1 mark  staff  5681  6 Jun 08:07 chunk-013.png
-rw-r--r--  1 mark  staff  5395  6 Jun 08:07 chunk-014.png
-rw-r--r--  1 mark  staff  5065  6 Jun 08:07 chunk-015.png
-rw-r--r--  1 mark  staff  6322  6 Jun 08:07 chunk-016.png
-rw-r--r--  1 mark  staff  4848  6 Jun 08:07 chunk-017.png

现在,如果您有 16,000 个句子要处理,您可以使用GNU 并行让它们全部并行完成,并为所有文件获取合理的名称。让我们先进行一次试运行,这样它实际上不会执行任何操作,而只是向您展示它将执行的操作:

parallel --dry-run magick {} -resize x90 -crop 90x {.}-%03d.png ::: sentence*

样本输出

magick sentence1.png -resize x90 -crop 90x sentence1-%03d.png 
magick sentence2.png -resize x90 -crop 90x sentence2-%03d.png
magick sentence3.png -resize x90 -crop 90x sentence3-%03d.png

看起来不错,所以删除--dry-run并再次执行此操作,您将获得我所做的句子的三个(相同副本)的以下输出:

-rw-r--r--  1 mark  staff  5648  6 Jun 08:13 sentence1-000.png
-rw-r--r--  1 mark  staff  5319  6 Jun 08:13 sentence1-001.png
-rw-r--r--  1 mark  staff  5870  6 Jun 08:13 sentence1-002.png
-rw-r--r--  1 mark  staff  6164  6 Jun 08:13 sentence1-003.png
-rw-r--r--  1 mark  staff  5001  6 Jun 08:13 sentence1-004.png
-rw-r--r--  1 mark  staff  6420  6 Jun 08:13 sentence1-005.png
-rw-r--r--  1 mark  staff  4726  6 Jun 08:13 sentence1-006.png
-rw-r--r--  1 mark  staff  5559  6 Jun 08:13 sentence1-007.png
-rw-r--r--  1 mark  staff  5053  6 Jun 08:13 sentence1-008.png
-rw-r--r--  1 mark  staff  4413  6 Jun 08:13 sentence1-009.png
-rw-r--r--  1 mark  staff  5960  6 Jun 08:13 sentence1-010.png
-rw-r--r--  1 mark  staff  5392  6 Jun 08:13 sentence1-011.png
-rw-r--r--  1 mark  staff  4280  6 Jun 08:13 sentence1-012.png
-rw-r--r--  1 mark  staff  5681  6 Jun 08:13 sentence1-013.png
-rw-r--r--  1 mark  staff  5395  6 Jun 08:13 sentence1-014.png
-rw-r--r--  1 mark  staff  5065  6 Jun 08:13 sentence1-015.png
-rw-r--r--  1 mark  staff  6322  6 Jun 08:13 sentence1-016.png
-rw-r--r--  1 mark  staff  4848  6 Jun 08:13 sentence1-017.png
-rw-r--r--  1 mark  staff  5648  6 Jun 08:13 sentence2-000.png
-rw-r--r--  1 mark  staff  5319  6 Jun 08:13 sentence2-001.png
-rw-r--r--  1 mark  staff  5870  6 Jun 08:13 sentence2-002.png
-rw-r--r--  1 mark  staff  6164  6 Jun 08:13 sentence2-003.png
-rw-r--r--  1 mark  staff  5001  6 Jun 08:13 sentence2-004.png
-rw-r--r--  1 mark  staff  6420  6 Jun 08:13 sentence2-005.png
-rw-r--r--  1 mark  staff  4726  6 Jun 08:13 sentence2-006.png
-rw-r--r--  1 mark  staff  5559  6 Jun 08:13 sentence2-007.png
-rw-r--r--  1 mark  staff  5053  6 Jun 08:13 sentence2-008.png
-rw-r--r--  1 mark  staff  4413  6 Jun 08:13 sentence2-009.png
-rw-r--r--  1 mark  staff  5960  6 Jun 08:13 sentence2-010.png
-rw-r--r--  1 mark  staff  5392  6 Jun 08:13 sentence2-011.png
-rw-r--r--  1 mark  staff  4280  6 Jun 08:13 sentence2-012.png
-rw-r--r--  1 mark  staff  5681  6 Jun 08:13 sentence2-013.png
-rw-r--r--  1 mark  staff  5395  6 Jun 08:13 sentence2-014.png
-rw-r--r--  1 mark  staff  5065  6 Jun 08:13 sentence2-015.png
-rw-r--r--  1 mark  staff  6322  6 Jun 08:13 sentence2-016.png
-rw-r--r--  1 mark  staff  4848  6 Jun 08:13 sentence2-017.png
-rw-r--r--  1 mark  staff  5648  6 Jun 08:13 sentence3-000.png
-rw-r--r--  1 mark  staff  5319  6 Jun 08:13 sentence3-001.png
-rw-r--r--  1 mark  staff  5870  6 Jun 08:13 sentence3-002.png
-rw-r--r--  1 mark  staff  6164  6 Jun 08:13 sentence3-003.png
-rw-r--r--  1 mark  staff  5001  6 Jun 08:13 sentence3-004.png
-rw-r--r--  1 mark  staff  6420  6 Jun 08:13 sentence3-005.png
-rw-r--r--  1 mark  staff  4726  6 Jun 08:13 sentence3-006.png
-rw-r--r--  1 mark  staff  5559  6 Jun 08:13 sentence3-007.png
-rw-r--r--  1 mark  staff  5053  6 Jun 08:13 sentence3-008.png
-rw-r--r--  1 mark  staff  4413  6 Jun 08:13 sentence3-009.png
-rw-r--r--  1 mark  staff  5960  6 Jun 08:13 sentence3-010.png
-rw-r--r--  1 mark  staff  5392  6 Jun 08:13 sentence3-011.png
-rw-r--r--  1 mark  staff  4280  6 Jun 08:13 sentence3-012.png
-rw-r--r--  1 mark  staff  5681  6 Jun 08:13 sentence3-013.png
-rw-r--r--  1 mark  staff  5395  6 Jun 08:13 sentence3-014.png
-rw-r--r--  1 mark  staff  5065  6 Jun 08:13 sentence3-015.png
-rw-r--r--  1 mark  staff  6322  6 Jun 08:13 sentence3-016.png
-rw-r--r--  1 mark  staff  4848  6 Jun 08:13 sentence3-017.png

关于参数的解释parallel:

  • {}指的是“当前文件”
  • {.}指的是“当前文件,不带扩展名”
  • :::分隔的参数意味着parallel从那些对你来说意味着magick command

警告一点,PNG 图像可以“记住”它们来自哪里,可能有用,也可能非常烦人。如果你从上面看最后一个块,你会看到它是 56x90,但接下来,它“记得”它来自 1586x90 的画布,偏移量为 1530,0:

identify sentence3-017.png 
sentence3-017.png PNG 56x90 1586x90+1530+0 8-bit Gray 256c 4848B 0.000u 0:00.000

这有时会扰乱后续处理,这很烦人,或者有时在重新组装已切碎的图像时非常有用!如果想删除就需要重新分页,所以上面的命令就变成:

magick input.png -resize x90 -crop 90x +repage output.png 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Magick(在 R 中)通过变换处理多个图像 的相关文章

随机推荐

  • 为什么JS函数名与元素ID冲突?

    我有两个几乎相同的简单 JS 小提琴 在选择更改时调用函数 在这两种情况下 函数名称与 select ID 相同 但由于某种原因 第一个小提琴工作得很好 而第二个小提琴因 JavaScript 错误而失败is not a function
  • Heroku + git = ENOENT:生成 git ENOENT

    我是 Ubuntu 17 04 的新手 所以我在 git 和 Heroku 方面遇到了一些麻烦 当我跑步时 heroku create或者尝试克隆在 Windows 上创建的令人兴奋的存储库 应用程序heroku git clone a a
  • 仅使用纯 JavaScript(无 jQuery)将元素添加到给定纯文本 HTML 的 DOM

    我需要能够向给定 HTML 原始文本字符串的页面添加元素 包括任意数量的标签 属性等 理想情况下 我希望能够对任意格式良好的 html 字符串执行类似操作 var theElement document createElement h1 S
  • UIButton:设置选定突出显示状态的图像

    我为按钮的状态 正常 突出显示 和 选定 设置了图像 但是当按钮处于选定状态并且我按下 突出显示它时 我没有看到突出显示的图像 而只是看到灰色的图片 是否可以在选择按钮时设置突出显示状态的图像 my code button setImage
  • 非分区 Parquet 数据上的谓词下推

    我在 S3 中有一个文件夹 其中包含 Parquet 数据 存储桶名称 文件夹名称 年 月 日 eg s3 bucket name folder name 2020 12 10 我在用Apache spark on AWS EMR读取镶木地
  • 苹果 bonjour 安卓版

    我正在寻找适用于 Android 的 Apple bonjour 有推荐的罐子吗 我在 google 上搜索了 apple bonjour 应用程序 找到了 Jmdns 应用程序http home heeere com tech andro
  • Google Api 客户端已使用 id 0 进行管理

    我想连接GoogleApiClient在活动中 当用户第一次单击按钮并出现此对话框时 它工作正常 但是当用户按后退按钮并重新单击负责初始化的按钮时 它工作正常GoogleApiClient 我收到此错误 java lang IllegalS
  • 如何防止同一分支并行运行 GitHub 操作(包括拉取请求)?

    我有一个 GitHub 操作 它可以从分支 拉取请求或手动触发 我想实现以下目标 决不能有两个从同一分支并行运行的操作实例 包括来自该分支的拉取请求 我最好的想法是这样做 伪代码 concurrency if github head ref
  • 当我在 SQL 2005 中删除聚集主键时会发生什么

    我有一个 PK 约束 两列上的聚集索引 我正在删除它 一小时后该命令仍在运行 我本以为 由于我只是删除一个约束 所以操作几乎是瞬时的 有人可以向我解释一下当我放弃 PK 时到底发生了什么吗 聚集索引不仅仅是 一种约束 它是一种存储方法 当您
  • 使用 ASP.NET .ashx 模块下载文件

    我有 ASP NET 页面 上面有一个 iframe 用于在此页面上显示一些 pdf 报告 当用户从下拉列表中选择报告类型时 我将所需的报告数据添加到 ASP NET 会话中 并将 iframe 的属性 src 更改为生成 pdf 报告的
  • 如何解决pandas中由于chunksize而导致的错误?

    我正在尝试读取一个大的 csv 文件并运行代码 我使用块大小来执行相同的操作 file data csv df pd read csv file sep header 0 iterator True chunksize 1000000 dt
  • 简单的 ASP.Net 消息框?

    我想要一个简单的 ASP Net MessageBox 但我尝试的所有方法都不起作用 我不知道为什么 我尝试的最后一件事是this但它也不起作用 对于一个安全工作的简单消息框有什么想法吗 了解更多信息 我无法将任何内容绑定到按钮 我必须从背
  • 选择/选项中的光标错误,IE

    当文本位于选项下方时 我遇到选项光标错误的问题 通常 该选项使用 默认 光标 但是当例如 该段落位于选项下 在 IE 中我看到 文本 光标 Code
  • Xamarin - 将图像转换为字节数组

    我使用媒体插件从 Android 设备或 iOS 设备拍摄或挑选照片 然后我想使用 LINQtoTwitter 将该图像发布到 Twitter 上 为此 图像需要采用 bytes 格式 如何将图像转换为字节以便上传 获取图像的代码 take
  • 如何从当前系统日期中减去 45 天 [重复]

    这个问题在这里已经有答案了 可能的重复 有人知道使用java日历减去X天的日期的简单方法吗 Hi 有人能告诉我如何从当前系统日期中减去 45 天吗 Thanks 您可以使用日历类 Calendar cal Calendar getInsta
  • 按键及其项目过滤对象

    我有一个对象 我想过滤它的键 我试图通过 ID 过滤对象 如下所示 let myKeys Object keys data filter function key console log data key if parseInt key p
  • entityManager.persist 不将任何内容保存到数据库

    I use Spring 4 2 5 and org hibernate 5 1 0 当我使用entityManager persist user 保存user 它无法保存到数据库 并且不会抛出错误 但如果我添加entityManager
  • 如何使用相机 xamarin Forms android 拍摄多张照片

    我正在开发 Xamarin 表单应用程序 在其中 我尝试使用具有相同意图的相机拍摄多张照片 不使用任何nuget包裹 为此 我正在关注此链接Camera MainActivity cs static readonly File file n
  • 提供 .json 文件下载

    我正在尝试通过此函数提供 json 文件 问题是 每次我发出请求时 浏览器都会显示内容而不是下载文件 我认为这可能是由于我正在使用 read 作为 HttpResponse 对象构造函数的参数 但是 如果我仅使用文件对象 则会出现以下异常
  • 使用 Magick(在 R 中)通过变换处理多个图像

    我需要自动化一些图像转换来执行以下操作 读取 16 000 多张又短又宽的图像 尺寸不一样 将每个图像重新缩放至 90 像素高 在图像的宽度上裁剪 90 像素 因此在 1 个图像上进行多次 90x90 裁剪 然后对下一个图像重复一遍 每个9