ITPub博客

首页 > 大数据 > 数据挖掘 > R语言高级图像处理

R语言高级图像处理

原创 数据挖掘 作者:tecdat 时间:2020-10-22 08:41:33 0 删除 编辑

原文 http://tecdat.cn/?p=3431

 

ImageMagick的库具有大量功能.Magick的当前版本暴露了相当大的一部分,但作为第一个版本,文档仍然很少。本文简要介绍了最重要的入门概念。

安装  magick

在的Windows或OS-X上,通过CRAN最容易安装软件包。

<span style="color:#333333"><span style="color:#333333"><code>install.packages(<span style="color:#dd1144">"magick"</span>)</code></span></span>

二进制CRAN包开箱即用,并启用了最重要的功能。使用 magick_config哪些功能格式状语从句:由您的ImageMagick的的版本支持。

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#990000"><strong>library</strong></span>(magick)</code></span></span>
## Linking to ImageMagick 6.9.9.39## Enabled features: cairo, fontconfig, freetype, lcms, pango, rsvg, webp## Disabled features: fftw, ghostscript, x11
<span style="color:#333333"><span style="color:#333333"><code>str(magick::magick_config())</code></span></span>
## List of 21##  $ version           :Class 'numeric_version'  hidden list of 1##   ..$ : int [1:4] 6 9 9 39##  $ modules           : logi FALSE##  $ cairo             : logi TRUE##  $ fontconfig        : logi TRUE##  $ freetype          : logi TRUE##  $ fftw              : logi FALSE##  $ ghostscript       : logi FALSE##  $ jpeg              : logi TRUE##  $ lcms              : logi TRUE##  $ libopenjp2        : logi TRUE##  $ lzma              : logi TRUE##  $ pangocairo        : logi TRUE##  $ pango             : logi TRUE##  $ png               : logi TRUE##  $ rsvg              : logi TRUE##  $ tiff              : logi TRUE##  $ webp              : logi TRUE##  $ wmf               : logi FALSE##  $ x11               : logi FALSE##  $ xml               : logi TRUE##  $ zero-configuration: logi TRUE

从源头构建

sudo apt-get install libmagick++-dev
sudo yum install ImageMagick-c++-devel

要在OS-X上从源代码安装,需要您 imagemagick@6自制软件。

brew reinstall imagemagick@6 --with-fontconfig --with-librsvgbrew link --force imagemagick@6

自制软件中的默认imagemagick配置会禁用一系列功能。建议至少酿造 --with-fontconfig并 --with-librsvg支持高质量的字体/ svg渲染(CRAN OSX二进制包也支持这些)。

图像IO

是什么让magick如此神奇,它会自动转换并呈现所有常见的图像格式.ImageMagick支持许多格式并自动检测类型。使用 magick::magick_config()列出您的ImageMagick的的版本支持的格式。

读和写

可以使用带有图像数据的文件路径,URL或原始向量直接读取图像 image_read。该 image_info函数显示了一些关于图像的元型态数据,类似于ImageMagick的   identify命令行实用程序。

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#990000"><strong>library</strong></span>(magick)tiger <- image_read_svg(<span style="color:#dd1144">'http://jeroen.github.io/images/tiger.svg'</span>, width = <span style="color:#009999">400</span>)print(tiger)</code></span></span>
##   format width height colorspace matte filesize density## 1    PNG   400    400       sRGB  TRUE        0   72x72

 

使用我们 image_write以任何格式将图像导出到磁盘上的文件或内存中 path = NULL。

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Render svg to png bitmap</em></span>image_write(tiger, path = <span style="color:#dd1144">"tiger.png"</span>, format = <span style="color:#dd1144">"png"</span>)</code></span></span>

如果 path的英文文件名,则 image_write报道查看 path成功,以便可以将结果传送到采用文件路径的函数。

转换格式

Magick以原始格式将图像保存在内存中。要指定为转换格式其他的 format参数 image_write。在应用转换之前,您还可以在内部将图像转换为其他格式。如果您的原始格式有损,这可能很有用。

<span style="color:#333333"><span style="color:#333333"><code>tiger_png <- image_convert(tiger, <span style="color:#dd1144">"png"</span>)image_info(tiger_png)</code></span></span>
##   format width height colorspace matte filesize density## 1    PNG   400    400       sRGB  TRUE        0   72x72

请注意,大小目前为0,因为ImageMagick的是懒惰的(在很好的意义上)并且在必须之前不会渲染。

预习

具有内置的Web浏览器(例如RStudio)的IDE会自动在查看器中显示magick图像。

 

 

或者,在Linux的上,可以您使用 image_display在X11窗口中预览图像。求最后 image_browse在系统-的默认应用程序中打开给定类型的图像。

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># X11 only</em></span>image_display(tiger)<span style="color:#999988"><em># System dependent</em></span>image_browse(tiger)</code></span></span>

另一种方法是将图像转换为光栅对象并将其绘制在R的图形显示上。然而,这非常慢,仅与其他绘图功能结合使用。见下面的 #raster。

转换

了解可用转换的最佳方法是浏览 ?transformationsRStudio帮助页面中的示例。下面举几个例子来了解什么是可能的。

剪切和编辑

转换一些函数采用一个 geometry参数,该参数需要表单的特殊语法, AxB+C+D。其中每个元素都是可选的一些例子:

  • image_crop(image, "100x150+50"): 裁剪 width:100px并从左侧 height:150px开始 +50px
  • image_scale(image, "200"): 按比例调整宽度: 200px
  • image_scale(image, "x200"): 按比例调整高度: 200px
  • image_fill(image, "blue", "+100+200"): 洪水从蓝点开始填充 x:100, y:200
  • image_border(frink, "red", "20x10"): 添加左侧+右侧20像素和顶部+底部10px的的边框

完整语法在 Magick :: Geometry文档中指定。

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Example image</em></span>frink <- image_read(<span style="color:#dd1144">"https://jeroen.github.io/images/frink.png"</span>)</code></span></span>
<span style="color:#333333"><span style="color:#333333"><code>print(frink)</code></span></span>
##   format width height colorspace matte filesize density## 1    PNG   220    445       sRGB  TRUE    73494   72x72

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Add 20px left/right and 10px top/bottom</em></span>image_border(image_background(frink, <span style="color:#dd1144">"hotpink"</span>), <span style="color:#dd1144">"#000080"</span>, <span style="color:#dd1144">"20x10"</span>)</code></span></span>

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Trim margins</em></span>image_trim(frink)</code></span></span>

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Passport pica</em></span>image_crop(frink, <span style="color:#dd1144">"100x150+50"</span>)</code></span></span>

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Resize</em></span>image_scale(frink, <span style="color:#dd1144">"300"</span>) <span style="color:#999988"><em># width: 300px</em></span></code></span></span>

 

<span style="color:#333333"><span style="color:#333333"><code>image_scale(frink, <span style="color:#dd1144">"x300"</span>) <span style="color:#999988"><em># height: 300px</em></span></code></span></span>

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Rotate or mirror</em></span>image_rotate(frink, <span style="color:#009999">45</span>)</code></span></span>

<span style="color:#333333"><span style="color:#333333"><code>image_flip(frink)</code></span></span>

<span style="color:#333333"><span style="color:#333333"><code>image_flop(frink)</code></span></span>

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Brightness, Saturation, Hue</em></span>image_modulate(frink, brightness = <span style="color:#009999">80</span>, saturation = <span style="color:#009999">120</span>, hue = <span style="color:#009999">90</span>)</code></span></span>

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Paint the shirt orange</em></span>image_fill(frink, <span style="color:#dd1144">"orange"</span>, point = <span style="color:#dd1144">"+100+200"</span>, fuzz = <span style="color:#009999">20</span>)</code></span></span>

随着 image_fill我们可以淹没填补开始像素 point。该 fuzz参数允许填充与具有相似颜色的相邻像素交叉。

过滤器和效果

ImageMagick的还有一堆值得检查的标准效果。

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Add randomness</em></span>image_blur(frink, <span style="color:#009999">10</span>, <span style="color:#009999">5</span>)</code></span></span>

<span style="color:#333333"><span style="color:#333333"><code>image_noise(frink)</code></span></span>

 

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Silly filters</em></span>image_charcoal(frink)</code></span></span>

<span style="color:#333333"><span style="color:#333333"><code>image_oilpaint(frink)</code></span></span>

<span style="color:#333333"><span style="color:#333333"><code>image_negate(frink)</code></span></span>

内核卷积

该 image_convolve()函数在图像上应用 内核内核卷积意味着使用内核矩阵中定义的加权邻域来状语从句:重新计算每个像素值例如,让我们看看这个简单的内核。:

<span style="color:#333333"><span style="color:#333333"><code>kern <- matrix(<span style="color:#009999">0</span>, ncol = <span style="color:#009999">3</span>, nrow = <span style="color:#009999">3</span>)kern[<span style="color:#009999">1</span>, <span style="color:#009999">2</span>] <- <span style="color:#009999">0.25</span>kern[<span style="color:#009999">2</span>, c(<span style="color:#009999">1</span>, <span style="color:#009999">3</span>)] <- <span style="color:#009999">0.25</span>kern[<span style="color:#009999">3</span>, <span style="color:#009999">2</span>] <- <span style="color:#009999">0.25</span>kern</code></span></span>
##      [,1] [,2] [,3]## [1,] 0.00 0.25 0.00## [2,] 0.25 0.00 0.25## [3,] 0.00 0.25 0.00

此内核将每个像素更改为其水平和垂直相邻像素的平均值,这会在下面的右侧图像中产生轻微的模糊效果:

<span style="color:#333333"><span style="color:#333333"><code>img <- image_resize(logo, <span style="color:#dd1144">"300x300"</span>)img_blurred <- image_convolve(img, kern)image_append(c(img, img_blurred))</code></span></span>

使用或者任何 标准内核

<span style="color:#333333"><span style="color:#333333"><code>img %>% image_convolve(<span style="color:#dd1144">'Sobel'</span>) %>% image_negate()</code></span></span>

<span style="color:#333333"><span style="color:#333333"><code>img %>% image_convolve(<span style="color:#dd1144">'DoG:0,0,2'</span>) %>% image_negate()</code></span></span>

文本注释

最后,在图像上打印一些文本会很有用:

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Add some text</em></span>image_annotate(frink, <span style="color:#dd1144">"I like R!"</span>, size = <span style="color:#009999">70</span>, gravity = <span style="color:#dd1144">"southwest"</span>, color = <span style="color:#dd1144">"green"</span>)</code></span></span>

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Customize text</em></span>image_annotate(frink, <span style="color:#dd1144">"CONFIDENTIAL"</span>, size = <span style="color:#009999">30</span>, color = <span style="color:#dd1144">"red"</span>, boxcolor = <span style="color:#dd1144">"pink"</span>,degrees = <span style="color:#009999">60</span>, location = <span style="color:#dd1144">"+50+100"</span>)</code></span></span>

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Fonts may require ImageMagick has fontconfig</em></span>image_annotate(frink, <span style="color:#dd1144">"The quick brown fox"</span>, font = <span style="color:#dd1144">'Times'</span>, size = <span style="color:#009999">30</span>)</code></span></span>

所支持的大多数平台上的字体包括 "sans", "mono", "serif", "Times", "Helvetica", "Trebuchet", "Georgia", "Palatino"或 "Comic Sans"。

结合管道

图像每个函数变换原始报道查看图像的 修改副本。它不会影响原始图像。

<span style="color:#333333"><span style="color:#333333"><code>frink <- image_read(<span style="color:#dd1144">"https://jeroen.github.io/images/frink.png"</span>)frink2 <- image_scale(frink, <span style="color:#dd1144">"100"</span>)image_info(frink)</code></span></span>
##   format width height colorspace matte filesize density## 1    PNG   220    445       sRGB  TRUE    73494   72x72
<span style="color:#333333"><span style="color:#333333"><code>image_info(frink2)</code></span></span>
##   format width height colorspace matte filesize density## 1    PNG   100    202       sRGB  TRUE        0   72x72

因此,要组合转换,您需要链接它们:

<span style="color:#333333"><span style="color:#333333"><code>test <- image_rotate(frink, <span style="color:#009999">90</span>)test <- image_background(test, <span style="color:#dd1144">"blue"</span>, flatten = <span style="color:#990073">TRUE</span>)test <- image_border(test, <span style="color:#dd1144">"red"</span>, <span style="color:#dd1144">"10x10"</span>)test <- image_annotate(test, <span style="color:#dd1144">"This is how we combine transformations"</span>, color = <span style="color:#dd1144">"white"</span>, size = <span style="color:#009999">30</span>)print(test)</code></span></span>
##   format width height colorspace matte filesize density## 1    PNG   465    240       sRGB  TRUE        0   72x72

使用 magrittr管道语法使其更具可读性

<span style="color:#333333"><span style="color:#333333"><code>image_read(<span style="color:#dd1144">"https://jeroen.github.io/images/frink.png"</span>) %>%image_rotate(<span style="color:#009999">270</span>) %>%image_background(<span style="color:#dd1144">"blue"</span>, flatten = <span style="color:#990073">TRUE</span>) %>%image_border(<span style="color:#dd1144">"red"</span>, <span style="color:#dd1144">"10x10"</span>) %>%image_annotate(<span style="color:#dd1144">"The same thing with pipes"</span>, color = <span style="color:#dd1144">"white"</span>, size = <span style="color:#009999">30</span>)</code></span></span>

图像矢量

以上示例涉及单个图像。然而,magick中的所有函数都已经过矢量化,以支持使用图层,合成或动画。

标准的基本方法 [  [[, c()并且 length()用来操作其然后可以被视为层或帧中的图像的向量。

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Download earth gif and make it a bit smaller for vignette</em></span>earth <- image_read(<span style="color:#dd1144">"https://jeroen.github.io/images/earth.gif"</span>) %>%image_scale(<span style="color:#dd1144">"200x"</span>) %>%image_quantize(<span style="color:#009999">128</span>)length(earth)</code></span></span>
## [1] 44
<span style="color:#333333"><span style="color:#333333"><code>earth</code></span></span>

 

<span style="color:#333333"><span style="color:#333333"><code>head(image_info(earth))</code></span></span>
##   format width height colorspace matte filesize density## 1    GIF   200    200        RGB FALSE        0   72x72## 2    GIF   200    200        RGB FALSE        0   72x72## 3    GIF   200    200        RGB FALSE        0   72x72## 4    GIF   200    200        RGB FALSE        0   72x72## 5    GIF   200    200        RGB FALSE        0   72x72## 6    GIF   200    200        RGB FALSE        0   72x72
<span style="color:#333333"><span style="color:#333333"><code>rev(earth) %>%image_flip() %>%image_annotate(<span style="color:#dd1144">"meanwhile in Australia"</span>, size = <span style="color:#009999">20</span>, color = <span style="color:#dd1144">"white"</span>)</code></span></span>

 

图层

我们可以像在Photoshop中中一样将图层堆叠在一起:

<span style="color:#333333"><span style="color:#333333"><code>bigdata <- image_read(<span style="color:#dd1144">'https://jeroen.github.io/images/bigdata.jpg'</span>)frink <- image_read(<span style="color:#dd1144">"https://jeroen.github.io/images/frink.png"</span>)logo <- image_read(<span style="color:#dd1144">"https://jeroen.github.io/images/Rlogo.png"</span>)img <- c(bigdata, logo, frink)img <- image_scale(img, <span style="color:#dd1144">"300x300"</span>)image_info(img)</code></span></span>
##   format width height colorspace matte filesize density## 1   JPEG   300    225       sRGB FALSE        0   72x72## 2    PNG   300    232       sRGB  TRUE        0   72x72## 3    PNG   148    300       sRGB  TRUE        0   72x72

马赛克将图像打印在彼此之上,扩展输出画布,使一切都适合:

<span style="color:#333333"><span style="color:#333333"><code>image_mosaic(img)</code></span></span>

 

展平将图层组合成单个图像,该图像具有第一个图像的大小:

<span style="color:#333333"><span style="color:#333333"><code>image_flatten(img)</code></span></span>

 

平和展镶嵌网求允许指定替代 复合运算符:

<span style="color:#333333"><span style="color:#333333"><code>image_flatten(img, <span style="color:#dd1144">'Add'</span>)</code></span></span>

 

<span style="color:#333333"><span style="color:#333333"><code>image_flatten(img, <span style="color:#dd1144">'Modulate'</span>)</code></span></span>

<span style="color:#333333"><span style="color:#333333"><code>image_flatten(img, <span style="color:#dd1144">'Minus'</span>)</code></span></span>

结合

附加意味着简单地将框架彼此相邻:

<span style="color:#333333"><span style="color:#333333"><code>image_append(image_scale(img, <span style="color:#dd1144">"x200"</span>))</code></span></span>

 

用于 stack = TRUE将它们放在彼此的顶部:

<span style="color:#333333"><span style="color:#333333"><code>image_append(image_scale(img, <span style="color:#dd1144">"100"</span>), stack = <span style="color:#990073">TRUE</span>)</code></span></span>

编写允许在特定位置组合两个图像:

<span style="color:#333333"><span style="color:#333333"><code>bigdatafrink <- image_scale(image_rotate(image_background(frink, <span style="color:#dd1144">"none"</span>), <span style="color:#009999">300</span>), <span style="color:#dd1144">"x200"</span>)image_composite(image_scale(bigdata, <span style="color:#dd1144">"x400"</span>), bigdatafrink, offset = <span style="color:#dd1144">"+180+100"</span>)</code></span></span>

 

网页

在阅读PDF文档时,每个页面都成为向量的元素。请注意,PDF会在读取时呈现,因此您需要立即指定密度。

<span style="color:#333333"><span style="color:#333333"><code>manual <- image_read_pdf(<span style="color:#dd1144">'https://cloud.r-project.org/web/packages/magick/magick.pdf'</span>, density = <span style="color:#009999">72</span>)image_info(manual)</code></span></span>
##    format width height colorspace matte filesize density## 1     PNG   612    792       sRGB  TRUE        0   72x72## 2     PNG   612    792       sRGB  TRUE        0   72x72## 3     PNG   612    792       sRGB  TRUE        0   72x72## 4     PNG   612    792       sRGB  TRUE        0   72x72## 5     PNG   612    792       sRGB  TRUE        0   72x72## 6     PNG   612    792       sRGB  TRUE        0   72x72## 7     PNG   612    792       sRGB  TRUE        0   72x72## 8     PNG   612    792       sRGB  TRUE        0   72x72## 9     PNG   612    792       sRGB  TRUE        0   72x72## 10    PNG   612    792       sRGB  TRUE        0   72x72## 11    PNG   612    792       sRGB  TRUE        0   72x72## 12    PNG   612    792       sRGB  TRUE        0   72x72## 13    PNG   612    792       sRGB  TRUE        0   72x72## 14    PNG   612    792       sRGB  TRUE        0   72x72## 15    PNG   612    792       sRGB  TRUE        0   72x72## 16    PNG   612    792       sRGB  TRUE        0   72x72## 17    PNG   612    792       sRGB  TRUE        0   72x72## 18    PNG   612    792       sRGB  TRUE        0   72x72## 19    PNG   612    792       sRGB  TRUE        0   72x72## 20    PNG   612    792       sRGB  TRUE        0   72x72## 21    PNG   612    792       sRGB  TRUE        0   72x72## 22    PNG   612    792       sRGB  TRUE        0   72x72## 23    PNG   612    792       sRGB  TRUE        0   72x72## 24    PNG   612    792       sRGB  TRUE        0   72x72## 25    PNG   612    792       sRGB  TRUE        0   72x72## 26    PNG   612    792       sRGB  TRUE        0   72x72## 27    PNG   612    792       sRGB  TRUE        0   72x72## 28    PNG   612    792       sRGB  TRUE        0   72x72## 29    PNG   612    792       sRGB  TRUE        0   72x72
<span style="color:#333333"><span style="color:#333333"><code>manual[<span style="color:#009999">1</span>]</code></span></span>

 

动画

我们也可以在动画中制作帧,而不是将矢量元素视为图层。

<span style="color:#333333"><span style="color:#333333"><code>image_animate(image_scale(img, <span style="color:#dd1144">"200x200"</span>), fps = <span style="color:#009999">1</span>, dispose = <span style="color:#dd1144">"previous"</span>)</code></span></span>

创建³³变形一系列 n图像,逐渐将一个图像变换为另一个图像。它制作动画

<span style="color:#333333"><span style="color:#333333"><code>newlogo <- image_scale(image_read(<span style="color:#dd1144">"https://jeroen.github.io/images/Rlogo.png"</span>), <span style="color:#dd1144">"x150"</span>)oldlogo <- image_scale(image_read(<span style="color:#dd1144">"https://developer.r-project.org/Logo/Rlogo-3.png"</span>), <span style="color:#dd1144">"x150"</span>)frames <- image_morph(c(oldlogo, newlogo), frames = <span style="color:#009999">10</span>)image_animate(frames)</code></span></span>

 

如果您读入现有的GIF或视频文件,则每个帧都会成为一个图层:

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Foreground image</em></span>banana <- image_read(<span style="color:#dd1144">"https://jeroen.github.io/images/banana.gif"</span>)banana <- image_scale(banana, <span style="color:#dd1144">"150"</span>)image_info(banana)</code></span></span>
##   format width height colorspace matte filesize density## 1    GIF   150    148       sRGB  TRUE        0   72x72## 2    GIF   150    148       sRGB  TRUE        0   72x72## 3    GIF   150    148       sRGB  TRUE        0   72x72## 4    GIF   150    148       sRGB  TRUE        0   72x72## 5    GIF   150    148       sRGB  TRUE        0   72x72## 6    GIF   150    148       sRGB  TRUE        0   72x72## 7    GIF   150    148       sRGB  TRUE        0   72x72## 8    GIF   150    148       sRGB  TRUE        0   72x72

操纵各个帧并将它们放回动画中:

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Background image</em></span>background <- image_background(image_scale(logo, <span style="color:#dd1144">"200"</span>), <span style="color:#dd1144">"white"</span>, flatten = <span style="color:#990073">TRUE</span>)<span style="color:#999988"><em># Combine and flatten frames</em></span>frames <- image_composite(background, banana, offset = <span style="color:#dd1144">"+70+30"</span>)<span style="color:#999988"><em># Turn frames into animation</em></span>animation <- image_animate(frames, fps = <span style="color:#009999">10</span>)print(animation)</code></span></span>
##   format width height colorspace matte filesize density## 1    gif   200    155       sRGB  TRUE        0   72x72## 2    gif   200    155       sRGB  TRUE        0   72x72## 3    gif   200    155       sRGB  TRUE        0   72x72## 4    gif   200    155       sRGB  TRUE        0   72x72## 5    gif   200    155       sRGB  TRUE        0   72x72## 6    gif   200    155       sRGB  TRUE        0   72x72## 7    gif   200    155       sRGB  TRUE        0   72x72## 8    gif   200    155       sRGB  TRUE        0   72x72

 

动画可以保存为MPEG文件的GIF:

<span style="color:#333333"><span style="color:#333333"><code>image_write(animation, <span style="color:#dd1144">"Rlogo-banana.gif"</span>)</code></span></span>

绘图和图形

该软件包的一个相对较新的补充是本机 - [R图形设备,它产生一个magick图像对象。这可以像常规设备一样用于制作绘图,或者可选地打开使用像素坐标绘制到现有图像上的设备。

图形设备

该 image_graph()功能打开一个类似于 png()或新的图形设备 x11()。它返回将要写入绘图的图像对象。绘图设备中的每个“页面”将成为图像对象中的帧。

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Produce image using graphics device</em></span>fig <- image_graph(width = <span style="color:#009999">400</span>, height = <span style="color:#009999">400</span>, res = <span style="color:#009999">96</span>)ggplot2::qplot(mpg, wt, data = mtcars, colour = cyl)dev.off()</code></span></span>

我们可以使用常规图像操作轻松地对图形进行后处理。

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Combine</em></span>out <- image_composite(fig, frink, offset = <span style="color:#dd1144">"+70+30"</span>)print(out)</code></span></span>
##   format width height colorspace matte filesize density## 1    PNG   400    400       sRGB  TRUE        0   72x72

 

绘图设备

使用图形设备的另一种方式是使用像素坐标在现有图像上绘制。

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Or paint over an existing image</em></span>img <- image_draw(frink)rect(<span style="color:#009999">20</span>, <span style="color:#009999">20</span>, <span style="color:#009999">200</span>, <span style="color:#009999">100</span>, border = <span style="color:#dd1144">"red"</span>, lty = <span style="color:#dd1144">"dashed"</span>, lwd = <span style="color:#009999">5</span>)abline(h = <span style="color:#009999">300</span>, col = <span style="color:#dd1144">'blue'</span>, lwd = <span style="color:#dd1144">'10'</span>, lty = <span style="color:#dd1144">"dotted"</span>)text(<span style="color:#009999">30</span>, <span style="color:#009999">250</span>, <span style="color:#dd1144">"Hoiven-Glaven"</span>, family = <span style="color:#dd1144">"monospace"</span>, cex = <span style="color:#009999">4</span>, srt = <span style="color:#009999">90</span>)palette(rainbow(<span style="color:#009999">11</span>, end = <span style="color:#009999">0.9</span>))symbols(rep(<span style="color:#009999">200</span>, <span style="color:#009999">11</span>), seq(<span style="color:#009999">0</span>, <span style="color:#009999">400</span>, <span style="color:#009999">40</span>), circles = runif(<span style="color:#009999">11</span>, <span style="color:#009999">5</span>, <span style="color:#009999">35</span>),bg = <span style="color:#009999">1</span>:<span style="color:#009999">11</span>, inches = <span style="color:#990073">FALSE</span>, add = <span style="color:#990073">TRUE</span>)dev.off()</code></span></span>
<span style="color:#333333"><span style="color:#333333"><code>print(img)</code></span></span>
##   format width height colorspace matte filesize density## 1    PNG   220    445       sRGB  TRUE        0   72x72

 

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

动画图形

图形设备支持多个帧,可以轻松创建动画图形。下面的代码显示了如何使用magick图形设备从非常酷的 gganimate包中实现该示例。

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#990000"><strong>library</strong></span>(gapminder)<span style="color:#990000"><strong>library</strong></span>(ggplot2)img <- image_graph(<span style="color:#009999">600</span>, <span style="color:#009999">340</span>, res = <span style="color:#009999">96</span>)datalist <- split(gapminder, gapminder$year)out <- lapply(datalist, <span style="color:#990000"><strong>function</strong></span>(data){p <- ggplot(data, aes(gdpPercap, lifeExp, size = pop, color = continent)) +scale_size(<span style="color:#dd1144">"population"</span>, limits = range(gapminder$pop)) + geom_point() + ylim(<span style="color:#009999">20</span>, <span style="color:#009999">90</span>) +scale_x_log10(limits = range(gapminder$gdpPercap)) + ggtitle(data$year) + theme_classic()print(p)})dev.off()animation <- image_animate(img, fps = <span style="color:#009999">2</span>)print(animation)</code></span></span>
##    format width height colorspace matte filesize density## 1     gif   600    340       sRGB  TRUE        0   72x72## 2     gif   600    340       sRGB  TRUE        0   72x72## 3     gif   600    340       sRGB  TRUE        0   72x72## 4     gif   600    340       sRGB  TRUE        0   72x72## 5     gif   600    340       sRGB  TRUE        0   72x72## 6     gif   600    340       sRGB  TRUE        0   72x72## 7     gif   600    340       sRGB  TRUE        0   72x72## 8     gif   600    340       sRGB  TRUE        0   72x72## 9     gif   600    340       sRGB  TRUE        0   72x72## 10    gif   600    340       sRGB  TRUE        0   72x72## 11    gif   600    340       sRGB  TRUE        0   72x72## 12    gif   600    340       sRGB  TRUE        0   72x72

 

要将其写入文件,您只需执行以下操作:

<span style="color:#333333"><span style="color:#333333"><code>image_write(animation, <span style="color:#dd1144">"gapminder.gif"</span>)</code></span></span>

光栅图像

Magick图像也可以转换为光栅对象,以便与[R的图形设备一起使用。因此我们可以将它与其他图形工具结合起来。但是要注意 - [R的图形设备非常慢并且具有非常不同的坐标系统,这降低了图像的质量。

Base R rasters

Base R具有 as.raster将图像转换为字符串向量的格式。本文 在R图形光栅图像由保罗·马雷尔给出了一个很好的概述。

<span style="color:#333333"><span style="color:#333333"><code>plot(as.raster(frink))</code></span></span>

 

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Print over another graphic</em></span>plot(cars)rasterImage(frink, <span style="color:#009999">21</span>, <span style="color:#009999">0</span>, <span style="color:#009999">25</span>, <span style="color:#009999">80</span>)</code></span></span>

 

该 grid包

该 grid软件包可以更轻松地在图形设备上叠加光栅,而无需调整图的x / y坐标。

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#990000"><strong>library</strong></span>(ggplot2)<span style="color:#990000"><strong>library</strong></span>(grid)qplot(speed, dist, data = cars, geom = c(<span style="color:#dd1144">"point"</span>, <span style="color:#dd1144">"smooth"</span>))</code></span></span>
## `geom_smooth()` using method = 'loess'
<span style="color:#333333"><span style="color:#333333"><code>grid.raster(frink)</code></span></span>

 

该 raster包

该 raster。软件包有自己的位图类,空间对应用程序很有用将图像转换为栅格的最简单方法的英文将其导出为 tiff文件:

<span style="color:#333333"><span style="color:#333333"><code>tiff_file <- tempfile()image_write(frink, path = tiff_file, format = <span style="color:#dd1144">'tiff'</span>)r <- raster::brick(tiff_file)raster::plotRGB(r)</code></span></span>

 

您也可以手动将位图数组转换为栅格对象,但这似乎会丢弃一些元数据:

<span style="color:#333333"><span style="color:#333333"><code>buf <- as.integer(frink[[<span style="color:#009999">1</span>]])rr <- raster::brick(buf)raster::plotRGB(rr, asp = <span style="color:#009999">1</span>)</code></span></span>

 

光栅包似乎也不支持透明度,这在空间成像的背景下可能是有意义的。

OCR文本提取

。该软件包的最新成员是使用OCR从图像中提取文本这需要正方体包:

<span style="color:#333333"><span style="color:#333333"><code>install.packages(<span style="color:#dd1144">"tesseract"</span>)</code></span></span>
<span style="color:#333333"><span style="color:#333333"><code>img <- image_read(<span style="color:#dd1144">"http://jeroen.github.io/images/testocr.png"</span>)print(img)</code></span></span>
##   format width height colorspace matte filesize density## 1    PNG   640    480       sRGB  TRUE    23359   72x72

<span style="color:#333333"><span style="color:#333333"><code><span style="color:#999988"><em># Extract text</em></span>cat(image_ocr(img))</code></span></span>

非常感谢您阅读本文,有任何问题请在下面留言!


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69982319/viewspace-2728666/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
拓端tecdat分享最in的大数据资讯,提供“一站式”的数据分析学习和咨询体验,让我们一起做有态度的数据人。关注公众号:拓端数据部落、拓端数据。

注册时间:2020-08-21

  • 博文量
    87
  • 访问量
    62169