分享

Magick 1.0:高级图形和图像处理R

 昵称49420501 2017-11-09

Jeroen Ooms  

 
2017年8月15日

上个星期,magick软件包的1.0版出现在了CRAN上:这是一个雄心勃勃的工作,用于在R中实现现代化和简化高质量的图像处理。这个R包建立在Magick ++ STL上,它向着名的ImageMagick库公开了一个强大的C ++ API。

RStudio屏幕截图

开始学习magick最好的地方是小插曲,它给出了这个软件包中绝大多数功能的简要概述。

迈向版本1.0

围绕去年的这个时候rOpenSci 公布的magick包的第一个版本:用于图像读取一个新的强大的工具包,写作,转换,编辑,转换,注释和动画R.由于初始版本已经出现了一些更新的附加功能,许多使用者已经开始发现这个软件包的功能,使R的可视化达到了一个新的水平。

例如,鲍勃·鲁迪斯(Bob Rudis)使用magick来从美国干旱监测中可视化加州干旱数据(点击图片了解更多信息):

干旱

R女士Lucy D'Agostino McGowanMaëlleSalmon展示了如何制作美丽的拼贴画:

大学

丹尼尔P.哈德利让文森特维加解释汽车:

特拉沃尔塔

现在,1年后,1.0版本标志着一个重要的里程碑:添加一个新的本地图形设备(作为一个magick图像对象和R图的混合体)弥合了图形和图像处理之间的差距。

这篇博客文章解释了magick设备如何让您无缝地将图形与R中的图像处理结合起来。您可以使用它来后期处理R图形,也可以使用本地R绘图机制绘制导入的图像。我们希望这个统一的界面能够更容易的生成漂亮,可复制的图像。

本地Magick图形

image_graph()功能打开一个新的图形设备类似于png()x11()它返回一个图像对象,图形将被写入。绘图设备中的每个页面将成为图像对象中的一个框架(图层)。

# Produce image using graphics device
fig <- image_graph(res = 96)
ggplot2::qplot(mpg, wt, data = mtcars, colour = cyl)
dev.off()

fig对象现在包含我们可以轻松进行后期处理的图像。例如,我们可以覆盖另一个图像:

logo <- image_read("https://www./logo/Rlogo.png")
out <- image_composite(fig, image_scale(logo, "x150"), offset = "+80+380")

# Show preview
image_browse(out)

# Write to file
image_write(out, "myplot.png")

出

绘图设备

image_draw()功能打开一个图形设备,使用像素坐标在现有图像的顶部绘制。

# Open a file
library(magick)
frink <- image_read("http://image109.360doc.com/DownloadImg/2017/11/0909/115710545_6_20171109094237298.png")
drawing <- image_draw(frink)

弗林克

 

现在我们可以使用R的原生低级图形函数在图像顶部绘图:

rect(20, 20, 200, 100, border = "red", lty = "dashed", lwd = 5)
abline(h = 300, col = 'blue', lwd = '10', lty = "dotted")
text(10, 250, "Hoiven-Glaven", family = "courier", cex = 4, srt = 90)
palette(rainbow(11, end = 0.9))
symbols(rep(200, 11), seq(0, 400, 40), circles = runif(11, 5, 35),
  bg = 1:11, inches = FALSE, add = TRUE)

在任何时候你都可以检查当前的结果:

image_browse(drawing)

画画

 

完成后,可以关闭设备并保存结果。

dev.off()
image_write(drawing, 'drawing.png')

默认情况下,image_draw()将所有边距设置为0,并使用图形坐标来匹配以像素为单位的图像大小(宽x高),其中(0,0)是左上角。请注意,这意味着y轴从顶部到底部增加,这与典型的图形坐标相反。你可以通过自定义覆盖所有这一切xlimylimmarimage_draw()

动画图形

该图形设备支持多个框架,这使得创建动画图形变得容易。下面的例子展示了如何使用magick 实现非常酷的gganimate包中的例子

library(gapminder)
library(ggplot2)
library(magick)
img <- image_graph(res = 96)
datalist <- split(gapminder, gapminder$year)
out <- lapply(datalist, function(data){
  p <- ggplot(data, aes(gdpPercap, lifeExp, size = pop, color = continent)) +
    scale_size("population", limits = range(gapminder$pop)) +
    scale_x_log10(limits = range(gapminder$gdpPercap)) +
    geom_point() + ylim(20, 90) +  ggtitle(data$year) + theme_classic()
  print(p)
})
dev.off()
animation <- image_animate(img, fps = 2)
image_write(animation, "animation.gif")

动画

我们希望magick软件包能够为诸如gganimate之类的软件包提供更强大的后端,以便在R中生成交互式图形,而无需用户手动安装外部图像编辑软件。

将ImageMagick命令移植到R

现在,magick 1.0版本具有图像处理软件包期望的核心图像处理功能。但是,仍然有改进,使magick很多房间在R图像处理包

目前很多R用户和软件包都是用于执行图像操作的ImageMagick命令行工具。目标是在magick软件包中支持所有这些操作,以便在任何平台上生成(再现)图像,而不需要用户安装额外的软件。

请注意,ImageMagick库已有26年的历史,并在这些年中积累了大量的功能。将所有这些移植到R是相当多的工作,用户的反馈是重要的。如果您想在R中执行imagemagick操作,但是您无法弄清楚,请在GitHub上打开一个问题如果功能目前还不支持,我们会尝试将其添加到下一个版本。

图像分析

目前magick专注于生成和编辑图像。还有另一个完全不同的功能,我们喜欢支持分析图像。图像分析可能涉及从计算颜色分布到更复杂的特征提取和视觉工具。我对这个领域不太熟悉,所以我们可以再次使用用户和专家的建议。

一个已经可用的image_ocr()功能使用rOpenSci tesseract软件包从图像中提取文本功能使用图像分析的另一个很酷的例子是拼贴包,其计算颜色直方图以选择合适的拼贴图像来创建拼贴。

作为支持分析工具的一部分,我们计划将位图(栅格)类提取到一个单独的包中。这将使软件包作者能够编写R扩展来分析和处理原始图像数据,而不一定取决于magick。然而,用户总是可以依靠magick作为一个强大的工具包来导入/导出图像和图形到这样的低级别的位图。


 


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多