圖像處理R包magick學習筆記

簡介

本文主要簡單介紹一下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()則可以顯示圖像的一些屬性數(shù)據(jù)。

#讀取網(wǎng)上隨便選的圖片
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提供一系列函數(shù)對圖片進行裁剪以及編輯,主要有以下函數(shù):

  • image_crop(image, "100x150+50"):裁剪
  • image_scale(image, "200"):按寬比例進行放大縮小
  • image_scale(image, "x200"):按高比例進行放大縮小
  • image_fill(image, "blue", "+100+200"):對特定部位著色
  • image_border(image, "red", "20x10"):添加邊框

下面我們來試試這些函數(shù)

#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)

這個函數(shù)最難掌握,我本來是想將wolf的眼睛渲染成紅色,但是不斷調整point以及fuzz都沒弄成,感興趣的可以自己搗鼓搗鼓。

#Add randomness
image_blur(wolf, 10, 5)

可以通過調整參數(shù)來設置模糊度

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除了支持管道操作外,還支持圖層疊加、拼圖以及動圖處理,來個經(jīng)典的動態(tài)地球

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)

還有一些有趣的功能這里我就不講了,有興趣的可以試試,還是很好玩的。

SessionInfo

sessionInfo()

## R version 3.4.1 (2017-06-30)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 15063)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=Chinese (Simplified)_China.936 
## [2] LC_CTYPE=Chinese (Simplified)_China.936   
## [3] LC_MONETARY=Chinese (Simplified)_China.936
## [4] LC_NUMERIC=C                              
## [5] LC_TIME=Chinese (Simplified)_China.936    
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] magrittr_1.5 magick_1.2  
## 
## loaded via a namespace (and not attached):
##  [1] compiler_3.4.1  backports_1.1.0 rprojroot_1.2   tools_3.4.1    
##  [5] htmltools_0.3.6 curl_2.8.1      yaml_2.1.14     Rcpp_0.12.12   
##  [9] stringi_1.1.5   rmarkdown_1.6   knitr_1.17      stringr_1.2.0  
## [13] digest_0.6.12   evaluate_0.10.1

聯(lián)系方式:

wechat: yt056410
Email: tyan@zju.edu.cn
QQ: 1051927088
GitHub: https://github.com/YTLogos
簡書: http://m.itdecent.cn/u/bd001545cf0b
博客: https://ytlogos.github.io/

個人簡介:

嚴濤
浙江大學作物遺傳育種在讀研究生(生物信息學方向)
偽碼農(nóng),R語言愛好者,愛開源

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容