图像处理R包magick学习笔记

作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语言爱好者,爱开源

简介


本文主要简单介绍一下magick包,主要用于图像处理

#安装的话就直接从CRAN安装进行
install.packages("magick")
#Load the package
library(magick)
#查看支持哪些格式
str(magick_config())
## List of 21
##  $ version           :Class 'numeric_version'  hidden list of 1
##   ..$ : int [1:4] 6 9 9 9
##  $ modules           : logi FALSE
##  $ cairo             : logi TRUE
##  $ fontconfig        : logi FALSE
##  $ freetype          : logi TRUE
##  $ fftw              : logi TRUE
##  $ ghostscript       : logi TRUE
##  $ jpeg              : logi TRUE
##  $ lcms              : logi TRUE
##  $ libopenjp2        : logi FALSE
##  $ 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 FALSE

可以看出大部分格式都是支持的

读取图像


读取的话可以直接从本地读取,也可以读取URL格式的图片,主要通过image_read()来读取,image_info()则可以显示图像的一些属性数据。

#读取网上随便选的图片
night_king <- image_read("http://ov520p4qw.bkt.clouddn.com/ytlogos/170903/ha6Cchfk38.jpg?imageslim")
image_info(night_king)
##   format width height colorspace filesize
## 1   JPEG   189    267       sRGB     6449
#通过image_write()可以讲图片以任何格式输出,比如将刚读取的图片以png格式输出。
image_write(night_king, path = "night_king.png", format = "png")

转换格式


通过image_convert()可以将图片转换为我们需要的格式,比如这里我们可以将night_king的格式转换为png格式

night_king.png <- image_convert(night_king, "png")
image_info(night_king.png)
##   format width height colorspace filesize
## 1    PNG   189    267       sRGB        0

可以看到这里的filesize为0,直到被渲染(这里涉及到ImageMagick方面,我不是很懂)。

预览


在RStudio中可以查看我们读取的图片

转换(transformations)

magick提供一系列函数对图片进行裁剪以及编辑,主要有以下函数:

  • image_crop(image, “100x150+50”):裁剪
  • image_scale(image, “200”):按宽比例进行放大缩小
  • image_scale(image, “x200”):按高比例进行放大缩小
  • image_fill(image, “blue”, “+100+200”):对特定部位着色
  • image_border(image, “red”, “20x10”):添加边框

下面我们来试试这些函数

#Example image
wolf <- image_read("http://ov520p4qw.bkt.clouddn.com/ytlogos/170903/4h96Df21AI.png?imageslim")
print(wolf)
#Add 20px left/right and 10px top/bottom
image_border(image_background(wolf, "hotpink"), "#000080", "20x10")
#trim margins
image_trim(wolf)
#裁剪
image_crop(wolf, "500x300+50")
#Resize
image_scale(wolf, "300")#width:300px
#Resize
image_scale(wolf, "x300")#heigth:300px
#Rotate or mirror
image_rotate(wolf, 45)
#Flip
image_flip(wolf)
#Flop
image_flop(wolf)
#Paint 
image_fill(wolf, "red", point = "+190+100", fuzz = 4000)

这个函数最难掌握,我本来是想将wolf的眼睛渲染成红色,但是不断调整point以及fuzz都没弄成,感兴趣的可以自己捣鼓捣鼓。

#Add randomness
image_blur(wolf, 10, 5)

可以通过调整参数来设置模糊度

image_noise(wolf)
#Silly filters
image_charcoal(wolf)
image_oilpaint(wolf)
image_negate(wolf)

文字注释


#Add some text on the image
image_annotate(wolf, "I am the King of wolf", size=25, gravity = "southeast", color="gold")

自定义text

#customize the text
image_annotate(wolf, "I am the King", size=30, color="red", boxcolor = "pink", degrees = 45, location = "+30+30")

设置字体

#Set the font times-new-roman
image_annotate(wolf, "I am the King", size=30, color="red", boxcolor = "pink", degrees = 45, location = "+30+30", font = 'times-new-roman')

管道操作


你没看错,magick支持管道操作,下面试试

library(magrittr)
wolf%>%
  image_rotate(270)%>%
  image_background("white", flatten = TRUE)%>%
  image_border("red", "10x10")%>%
  image_annotate("I am the King", color='red', size = 25, location = "+100+300")

图片向量


magick除了支持管道操作外,还支持图层叠加、拼图以及动图处理,来个经典的动态地球

earth <- image_read("http://ov520p4qw.bkt.clouddn.com/ytlogos/170903/a9CjAEGiC5.gif")
 length(earth)
 print(earth)
rev(earth) %>% 
  image_flip() %>% 
  image_annotate("This is the Earth", size = 20, color = "white")

不知什么鬼,图片竟然显示出来乱的,电脑渣的话还是别搞动画

图层


bigdata <- image_read("http://ov520p4qw.bkt.clouddn.com/ytlogos/170903/JclK3efbB3.jpg?imageslim")
logo <- image_read("http://ov520p4qw.bkt.clouddn.com/ytlogos/170903/JdjdB88CLm.png?imageslim")
frink <- image_read("http://ov520p4qw.bkt.clouddn.com/ytlogos/170903/E5fbmb1FIb.png?imageslim")
img <- c(bigdata, logo, frink)
img <- image_scale(img, "300x300")
image_mosaic(img)

动画


image_animate(image_scale(img, "200x200"), fps = 1, dispose = "previous")#fps控制放映速度

静图+动图


静图就用我以前绘制过的,具体可看博客

image1 <- image_read("http://ov520p4qw.bkt.clouddn.com/ytlogos/170903/kLeL888DbI.png?imageslim")
dance_man <- image_read("http://ov520p4qw.bkt.clouddn.com/ytlogos/170903/86iEDe36lf.gif")
dance_man <- image_scale(dance_man, "200")
#Background image
background <- image_background(image_scale(image1, "800"), "white", flatten = TRUE)
#Combine and flatten frames
frames <- image_apply(dance_man, function(frame){
  image_composite(background, frame, offset = "+500+270")
})
#Turn frames into animation
animation <- image_animate(frames, fps = 10)
print(animation)

还有一些有趣的功能这里我就不讲了,有兴趣的可以试试,还是很好玩的。

本文分享自微信公众号 - 生信宝典(Bio_data)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏点滴积累

geotrellis使用(九)使用geotrellis进行栅格渲染

目录 前言 图像渲染 总结 参考链接 一、前言        前面几篇文章讲解了如何使用Geotrellis进行数据处理、瓦片生成等,今天主要表一下如何使用Ge...

38850
来自专栏程序员互动联盟

【专业技术】Win32 SDK编程:我们如何输出文本

在使用Win32编程时,我们常常需要输出文本到窗口上,Windows所有的文本字符或者图形输出都是通过图形设备接口(GDI)进行的,Windows的三大组件之一...

40550
来自专栏ytkah

css自动换行如何设置?url太长会撑开页面

  我们更新文章时如果有引用其他文章一般会带一个原文url,但这个链接如果太长的话会把内容的版块撑开,整个排版乱了。那我们能不能设置css自动换行呢?如下图所示...

32750
来自专栏小灰灰

Java 借助ImageMagic实现图片编辑服务

Java 借助ImageMagic实现图片编辑服务 java原生对于图片的编辑处理并没有特别友好,而且问题也有不少,那么作为一个java后端,如果要提供图片的编...

91760
来自专栏macOS 开发学习

Mac开发跬步积累(四):ImageIO解析Gif 图像数据

这里可以看到Gif 是保存了多幅图像的一个图像文件,有了这个基础认识,我们就可以使用代码来解析Gif图像了.

16430
来自专栏数据小魔方

动态图表系列1|数据有效性(index+match函数)

今天开始跟大家分享动态图表的技巧1——数据有效性(index+match函数)! 动态图表之——数据有效性(index+match) 首先利用数据验证制作下拉菜...

50070
来自专栏前端杂货铺

不要使用浏览器嗅探,尽量使用特性检测和特性模拟

平淡的描述   在js中,能使用特征监测就尽量不要使用浏览器嗅探。嗅探浏览器目的是判断可否使用这个对象或者API,但是抛开浏览器 的各个版本的userAgent...

32550
来自专栏非典型技术宅

Quartz2D进行渲染1. 渲染模式2. even-odd rule:奇偶填充规则3. nonzero winding number rule:非零绕数规则4. 其他会用到的渲染模式5. 混合模式

16530
来自专栏数据科学学习手札

(数据科学学习手札05)Python与R数据读入存出方式的总结与比较

在数据分析的过程中,外部数据的导入和数据的导出是非常关键的部分,而Python和R在这方面大同小异,且针对不同的包或模块,对应着不同的函数来完成这部分功能: P...

30870
来自专栏hotqin888的专栏

microstation vba起步——建立实体

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

14730

扫码关注云+社区

领取腾讯云代金券