단일 이미지로 가장 많이 사용하는 것이 잘라내고 크기를 조정하고 색을 채워넣는 등이 포함된다.
# 0. 환경설정 ------
library(magick)
library(tidyverse)
library(tidygraph)
library(particles)
library(animation)
library(magick)
# 1. 이미지 크기조정 ------
suji <- image_read("fig/architecture_101.PNG")
suji_crop <- image_read("fig/architecture_101.PNG") %>%
image_crop("500x350+200+200") %>%
image_scale("300")
suji_resize <- image_read("fig/architecture_101.PNG") %>%
image_scale("300")
suji_border <- image_read("fig/architecture_101.PNG") %>%
image_border("green", "20x10")
suji_img <- c(suji, suji_crop, suji_resize, suji_border)
image_scale(suji_img, "300x300") %>%
image_append()
다수 이미지를 불러 읽어온다. 그리고 나서 이미지를 c()
연산자로 벡터로 묶어낸다. 이미지 크기가 다르기 때문에 적절한 크기로 이미지크기를 재조정한다: 300x300
. image_info()
함수로 각 이미지에 대한 정보 확인이 가능하다.
image_mosaic(imgs)
: image_mosaic()
함수는 이미지를 차곡차곡 올리고자 할 때 사용한다.image_flatten(imgs)
: image_flatten()
함수는 첫번째 이미지 크기에 기반하여 각 이미지를 레이어로 보고 한장에 올린다.image_flatten(imgs, 'Add')
: RGB 색상으로 덧셈image_flatten(imgs, 'Modulate')
: RGB 색상으로 나머지 연산image_flatten(imgs, 'Minus')
: RGB 색상으로 뺄셈혹은, image_append()
함수를 사용해서 이미지를 가로 혹은 세로로 쭉 쌓을 수 있다.
# 3. 다수 이미지 -----
## 3.1. 이미지 가져오기
suji <- image_read("fig/architecture_101.PNG")
rpi <- image_read("fig/raspberrypi-logo.png")
bigdata <- image_read('https://jeroen.github.io/images/bigdata.jpg')
rlogo <- image_read("https://jeroen.github.io/images/Rlogo.png")
## 3.2. 이미지 결합
imgs <- c(suji, rpi, bigdata, rlogo)
imgs <- image_scale(imgs, "300x300")
image_info(imgs)
format width height colorspace matte filesize density
1 PNG 207 300 sRGB TRUE 0 38x38
2 PNG 300 267 sRGB TRUE 0 72x72
3 JPEG 300 225 sRGB FALSE 0 72x72
4 PNG 300 232 sRGB TRUE 0 72x72
## 3.3. 이미지 계층 결합방식
imgs_mosaic <- image_mosaic(imgs)
imgs_flatten <- image_flatten(imgs)
imgs_add <- image_flatten(imgs, 'Add')
imgs_modulate <- image_flatten(imgs, 'Modulate')
imgs_minus <- image_flatten(imgs, 'Minus')
image_scale(c(imgs_mosaic, imgs_flatten, imgs_add, imgs_modulate, imgs_minus), "300x300") %>%
image_append()
## 3.4. 이미지 결합
### 가로 방식
imgs %>%
image_scale("x200") %>%
image_append()
### 세로 쌓기 방식
imgs %>%
image_scale("x100") %>%
image_append(stack=TRUE)
이미지를 레이어로 처리하는 대신 시간을 넣은 개념으로 처리하게 되면 애니메이션을 만들 수 있다. 즉, 각 이미지가 레이어(layer) 대신에 프레임(frame)으로 활용한다.
image_animate()
함수를 사용해서 애니메이션도 가능하고 image_morph()
를 사용해서 중간 프레임 갯수를 지정하면 두 이미지 변화기간 동안 애니메이션 효과를 낼 수 있다.
# 1. 애니메이션 이미지 -----
## 1.1. 이미지 가져오기
koreas <- image_read("fig/two-korea.png")
korea <- image_read("fig/one-korea.png")
image_animate(c(koreas, korea), fps = 0.5, dispose = "previous")
korea_frames <- image_morph(c(koreas, korea), frames = 20)
korea_ani <- image_animate(korea_frames)
image_write(korea_ani, "korea_ani.gif")
라이언(카카오프렌즈)의 .gif
이미지를 받아서 건축학 개론 포스터를 배경이미지로 활용한다.
이때 중요한 것이 배경이미지를 image_composite()
함수를 사용해서 결합시키는 것이다. 다음으로 애니메이션을 만드는 방법은 앞서 image_animate()
함수에 fps = 20
인수를 넣어 초당 프레임수를 지정하면 간단히 애니메이션을 제작할 수 있다.
# 2. 애니메이션 결합: 배경 이미지와 애니메이션 결합 - 첫번째
### 라이언 지정
ryan <- image_read("fig/ryan.gif") %>%
image_scale("100x100")
### 배경지정
background <- image_read("fig/architecture_101.PNG") %>%
image_scale("300x")
### 배경과 결합
ryan_frames <- image_composite(background, ryan, offset = "+60+200")
### 애니메이션
ryan_ani <- image_animate(ryan_frames, fps = 20)
print(ryan_ani)
format width height colorspace matte filesize density
1 gif 300 435 sRGB TRUE 0 38x38
2 gif 300 435 sRGB TRUE 0 38x38
3 gif 300 435 sRGB TRUE 0 38x38
4 gif 300 435 sRGB TRUE 0 38x38
5 gif 300 435 sRGB TRUE 0 38x38
6 gif 300 435 sRGB TRUE 0 38x38
7 gif 300 435 sRGB TRUE 0 38x38
8 gif 300 435 sRGB TRUE 0 38x38
이미지와 그래프를 함께 구현하는 것도 많은 데이터 과학자의 오랜 희망이었으나, 과거 기술적으로 가능했으나 여러가지 장애요소가 있었지만, magick
팩키지에서 나름 수월하게 사용할 수 있는 방식을 제시하고 있다.
ggplot
을 그리고 나서 dev.off()
로 마무리한다.image_composite()
함수를 사용해서 ggplot
과 이미지를 결합시킨다.smpl_fig <- image_graph(res = 96)
ggplot(mtcars, aes(x=wt, y=mpg, color=cyl)) +
geom_point()
dev.off()
rlogo <- image_read("https://www.r-project.org/logo/Rlogo.png")
mpg_gg <- image_composite(smpl_fig, image_scale(rlogo, "x150"), offset = "+80+380")
mpg_gg
mtcars <- mtcars %>%
mutate(gear = as.factor(gear))
# create canvas
frames <- image_graph(width = 300, height = 600, res = 150)
# make a ggplot for every gear
walk(1:nlevels(mtcars2$gear), ~{
xdf <- filter(mtcars2, gear == levels(gear)[.x]) # makes the split
gg <- ggplot(data = xdf) +
geom_point(aes(x= mpg, y = wt))
print(gg)
}) # ends the walk command
#done with plotting
dev.off()
# animate
image_animate(frames, 1)