Nama : Renata Amalia Putri
NIM : 220605110074
Kelas : B
Mata Kuliah : Linear Algebra
Dosen Pengampu : Prof. Dr. Suhartono, M.kom
Jurusan : Teknik Informatika
Instansi : UIN Maulana Malik Ibrahim Malang
library(magick)
## Linking to ImageMagick 6.9.12.3
## Enabled features: cairo, freetype, fftw, ghostscript, heic, lcms, pango, raw, rsvg, webp
## Disabled features: fontconfig, x11
str(magick::magick_config())
## List of 24
## $ version :Class 'numeric_version' hidden list of 1
## ..$ : int [1:4] 6 9 12 3
## $ modules : logi FALSE
## $ cairo : logi TRUE
## $ fontconfig : logi FALSE
## $ freetype : logi TRUE
## $ fftw : logi TRUE
## $ ghostscript : logi TRUE
## $ heic : logi TRUE
## $ jpeg : logi TRUE
## $ lcms : logi TRUE
## $ libopenjp2 : logi TRUE
## $ lzma : logi TRUE
## $ pangocairo : logi TRUE
## $ pango : logi TRUE
## $ png : logi TRUE
## $ raw : logi TRUE
## $ rsvg : logi TRUE
## $ tiff : logi TRUE
## $ webp : logi TRUE
## $ wmf : logi FALSE
## $ x11 : logi FALSE
## $ xml : logi TRUE
## $ zero-configuration: logi TRUE
## $ threads : int 1
library(magick)
tiger <- image_read_svg('http://jeroen.github.io/images/tiger.svg', width = 550)
print(tiger)
## format width height colorspace matte filesize density
## 1 PNG 550 550 sRGB TRUE 0 72x72
#Render svg to png bitmap
image_write(tiger, path = "tiger.png", format = "png")
tiger_png <- image_convert(tiger, "png")
image_info(tiger_png)
## format width height colorspace matte filesize density
## 1 PNG 550 550 sRGB TRUE 0 72x72
# System dependent
image_browse(tiger)
Memotong dan Mengedit
Beberapa fungsi transformasi mengambil parameter geometri yang memerlukan sintaks khusus dari bentuk AxB+C+D di mana setiap elemen bersifat opsional.
frink <- image_read("https://jeroen.github.io/images/frink.png")
print(frink)
## format width height colorspace matte filesize density
## 1 PNG 220 445 sRGB TRUE 73494 72x72
image_border(image_background(frink, "green"), "#000010", "30x20")
image_trim(frink)
image_crop(frink, "100x120+20")
image_scale(frink, "500") #width: 500px
image_scale(frink, "x500") #height: 500px
image_rotate(frink, 250)
image_flip(frink)
# Kecerahan, Saturasi, Warna
image_modulate(frink, brightness = 50, saturation = 100, hue = 20)
# Mewarnai dasi ungu
image_fill(frink, "purple", point = "+100+200", fuzz = 50)
Dengan image_fill dapat mengisi mulai dari titik piksel. Parameter Fuzz memungkinkan isian menyilang untuk piksel yang berdekatan dengan warna serupa. Nilainya harus antara 0 dan 256^2 menentukan jarak geometris maksimal antara warna yang dianggap sama. Di sini profesor frink diberi warna kemeja ungu untuk Piala Dunia.
Filter dan Efek
ImageMagick juga memiliki banyak efek standar yang harus dicoba.
# Add randomness
image_blur(frink, 100, 5)
image_noise(frink)
image_charcoal(frink)
image_oilpaint(frink)
image_negate(frink)
image_shadow(frink)
image_motion_blur(frink)
Konvolusi Kernel
Fungsi image_convolve() menerapkan kernel di atas gambar. Konvolusi kernel berarti bahwa setiap nilai piksel dihitung ulang menggunakan jumlah lingkungan berbobot yang ditentukan dalam matriks kernel. Sebagai contoh lihatlah kernel sederhana ini:
kern <- matrix(0, ncol = 3, nrow = 3)
kern[1, 2] <- 0.25
kern[2, c(1, 3)] <- 0.25
kern[3, 2] <- 0.25
kern
## [,1] [,2] [,3]
## [1,] 0.00 0.25 0.00
## [2,] 0.25 0.00 0.25
## [3,] 0.00 0.25 0.00
Kernel ini mengubah setiap piksel menjadi rata-rata piksel tetangga horizontal dan vertikalnya, yang menghasilkan sedikit efek buram pada gambar sebelah kanan di bawah ini:
img <- image_resize(logo, "300x300")
img_blurred <- image_convolve(img, kern)
image_append(c(img, img_blurred))
Atau menggunakan kernel standar.
img %>% image_convolve('Sobel') %>% image_negate()
img %>% image_convolve('DoG:0,0,2') %>% image_negate()
Anotasi Teks
# Add some text
image_annotate(frink, "Pak Suhartono is the best!", size = 10, gravity = "southwest", color = "red")
# Menyesuaikan Teks
image_annotate(frink, "RENATA", size = 30, color = "blue", boxcolor = "grey",
degrees = 60, location = "+50+100")
# Font mungkin membutuhkan ImageMagick memiliki fontconfig
image_annotate(frink, "R is Fun", font = 'Comic Sans', size = 30)
Font yang hampir semua platform ada yaitu “sans”, “mono”, “serif”, “Times”, “Helvetica”, “Trebuchet”, “Georgia”, “Palatino”or “Comic Sans”.
Vektor Gambar
Semua fungsi dalam magick telah divektorisasi untuk mendukung bekerja dengan lapisan, komposisi, atau animasi.
Metode dasar standar [ [[, c() dan length() digunakan untuk memanipulasi vektor gambar yang kemudian dapat diperlakukan sebagai lapisan atau bingkai.
# Unduh Gif earth dan buat sedikit lebih kecil untuk vignette
earth <- image_read("https://jeroen.github.io/images/earth.gif") %>%
image_scale("200x") %>%
image_quantize(128)
length(earth)
## [1] 44
earth
head(image_info(earth))
## format width height colorspace matte filesize density
## 1 GIF 200 200 RGB FALSE 0 72x72
## 2 GIF 200 200 RGB TRUE 0 72x72
## 3 GIF 200 200 RGB TRUE 0 72x72
## 4 GIF 200 200 RGB TRUE 0 72x72
## 5 GIF 200 200 RGB TRUE 0 72x72
## 6 GIF 200 200 RGB TRUE 0 72x72
rev(earth) %>%
image_flip() %>%
image_annotate("meanwhile in Indonesia", size = 20, color = "white")
Lapisan/Layer
bigdata <- image_read('https://jeroen.github.io/images/bigdata.jpg')
frink <- image_read("https://jeroen.github.io/images/frink.png")
logo <- image_read("https://jeroen.github.io/images/Rlogo.png")
img <- c(bigdata, logo, frink)
img <- image_scale(img, "300x300")
image_info(img)
## 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
Mosaic mencetak gambar di atas satu sama lain, memperluas output kanvas sedemikian rupa sehingga semuanya pas:
image_mosaic(img)
Perataan menggabungkan lapisan menjadi satu gambar yang memiliki ukuran gambar pertama:
image_flatten(img)
image_flatten(img, 'Add')
image_flatten(img, 'Modulate')
image_flatten(img, 'Minus')
Mengkombinasikan
Menambahkan berarti hanya menempatkan bingkai di samping satu sama lain:
image_append(image_scale(img, "x200"))
Menggunakan stack=TRUE untuk menempatkan di atas satu sama lain:
image_append(image_scale(img, "100"), stack = TRUE)
Composing memungkinkan untuk menggabungkan dua gambar pada posisi tertentu:
bigdatafrink <- image_scale(image_rotate(image_background(frink, "none"), 300), "x200")
image_composite(image_scale(bigdata, "x400"), bigdatafrink, offset = "+180+100")
Halaman
Ketika membaca dokumen PDF, setiap halaman menjadi elemen vektor. Perhatikan bahwa PDF dirender saat membaca sehingga harus segera menentukan kepadatannya.
manual <- image_read_pdf('https://cloud.r-project.org/web/packages/magick/magick.pdf', density = 72)
image_info(manual)
## 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
## 30 PNG 612 792 sRGB TRUE 0 72x72
## 31 PNG 612 792 sRGB TRUE 0 72x72
## 32 PNG 612 792 sRGB TRUE 0 72x72
## 33 PNG 612 792 sRGB TRUE 0 72x72
## 34 PNG 612 792 sRGB TRUE 0 72x72
## 35 PNG 612 792 sRGB TRUE 0 72x72
## 36 PNG 612 792 sRGB TRUE 0 72x72
## 37 PNG 612 792 sRGB TRUE 0 72x72
## 38 PNG 612 792 sRGB TRUE 0 72x72
## 39 PNG 612 792 sRGB TRUE 0 72x72
## 40 PNG 612 792 sRGB TRUE 0 72x72
## 41 PNG 612 792 sRGB TRUE 0 72x72
## 42 PNG 612 792 sRGB TRUE 0 72x72
## 43 PNG 612 792 sRGB TRUE 0 72x72
## 44 PNG 612 792 sRGB TRUE 0 72x72
manual[1]
Animasi
image_animate(image_scale(img, "200x200"), fps = 1, dispose = "previous")
Morphing membuat urutan gambar n yang secara bertahap mengubah satu gambar menjadi gambar lainnya. Itu membuat sebuah animasi.
newlogo <- image_scale(image_read("https://jeroen.github.io/images/Rlogo.png"))
oldlogo <- image_scale(image_read("https://jeroen.github.io/images/Rlogo-old.png"))
image_resize(c(oldlogo, newlogo), '200x150!') %>%
image_background('white') %>%
image_morph() %>%
image_animate(optimize = TRUE)
# Foreground image
banana <- image_read("https://jeroen.github.io/images/banana.gif")
banana <- image_scale(banana, "150")
image_info(banana)
## 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
Memanipulasi masing-masing bingkai dan mengembalikannya ke dalam animasi:
# Background image
background <- image_background(image_scale(logo, "200"), "white", flatten = TRUE)
# Combine and flatten frames
frames <- image_composite(background, banana, offset = "+70+30")
# Turn frames into animation
animation <- image_animate(frames, fps = 10, optimize = TRUE)
print(animation)
## format width height colorspace matte filesize density
## 1 gif 200 155 sRGB TRUE 0 72x72
## 2 gif 94 105 sRGB TRUE 0 72x72
## 3 gif 125 122 sRGB TRUE 0 72x72
## 4 gif 108 118 sRGB TRUE 0 72x72
## 5 gif 108 105 sRGB TRUE 0 72x72
## 6 gif 92 105 sRGB TRUE 0 72x72
## 7 gif 113 123 sRGB TRUE 0 72x72
## 8 gif 119 118 sRGB TRUE 0 72x72
Animasi bisa disimpan sebagai GIF dari file MPEG:
image_write(animation, "Rlogo-banana.gif")
Menggambar dan Grafik
Tambahan yang relatif baru untuk paket ini adalah perangkat grafis R asli yang menghasilkan objek gambar magick. Ini dapat digunakan seperti perangkat biasa untuk membuat plot, atau sebagai alternatif untuk membuka perangkat yang menarik ke gambar yang ada menggunakan koordinat piksel.
Perangkat Grafik
Fungsi image_graph() membuka perangkat grafis baru yang mirip dengan misal png() atau x11(). Ini mengembalikan objek gambar yang plotnya akan ditulis. Setiap “page” di perangkat plotting akan menjadi bingkai di objek gambar.
# Produksi gambar dengan perangkat grafis
fig <- image_graph(width = 400, height = 400, res = 96)
ggplot2::qplot(mpg, wt, data = mtcars, colour = cyl)
## Warning: `qplot()` was deprecated in ggplot2 3.4.0.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Dapat dengan mudah melakukan pasca-proses gambar menggunakan operasi gambar biasa.
# Kombinasi
out <- image_composite(fig, frink, offset = "+70+30")
print(out)
## # A tibble: 1 × 7
## format width height colorspace matte filesize density
## <chr> <int> <int> <chr> <lgl> <int> <chr>
## 1 PNG 400 400 sRGB TRUE 0 96x96
Perangkat Menggambar
Cara lain menggunakan perangkat grafis adalah untuk menggambar di atas image yang ada menggunakan koordinat piksel.
# Atau mewarnai image yang ada
img <- image_draw(frink)
rect(20, 20, 200, 100, border = "red", lty = "dashed", lwd = 5)
abline(h = 300, col = 'blue', lwd = '10', lty = "dotted")
text(30, 250, "Hoiven-Glaven", family = "monospace", 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)
dev.off()
## png
## 2
print(img)
## # A tibble: 1 × 7
## format width height colorspace matte filesize density
## <chr> <int> <int> <chr> <lgl> <int> <chr>
## 1 PNG 220 445 sRGB TRUE 0 72x72
Secara default image_draw() menyetel semua margin ke 0 dan menggunakan koordinat grafik untuk menyesuaikan ukuran gambar dalam piksel (lebar x tinggi) di mana (0,0) adalah pojok kiri atas. Perhatikan bahwa ini berarti sumbu y bertambah dari atas ke bawah yang merupakan kebalikan dari koordinat grafis pada umumnya. Anda dapat mengganti semua ini dengan meneruskan nilai xlim, ylim, atau mar khusus ke image_draw.
Grafik Animasi
Perangkat grafis mendukung banyak bingkai yang membuatnya mudah untuk membuat grafik animasi. Kode di bawah ini menunjukkan bagaimana akan mengimplementasikan contoh dari package gganimate yang sangat keren menggunakan perangkat grafis magick.
library(gapminder)
library(ggplot2)
img <- image_graph(600, 340, 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)) + geom_point() + ylim(20, 90) +
scale_x_log10(limits = range(gapminder$gdpPercap)) + ggtitle(data$year) + theme_classic()
print(p)
})
dev.off()
## png
## 2
animation <- image_animate(img, fps = 2, optimize = TRUE)
print(animation)
## # A tibble: 12 × 7
## format width height colorspace matte filesize density
## <chr> <int> <int> <chr> <lgl> <int> <chr>
## 1 gif 600 340 sRGB TRUE 0 96x96
## 2 gif 385 243 sRGB TRUE 0 96x96
## 3 gif 395 237 sRGB TRUE 0 96x96
## 4 gif 374 232 sRGB TRUE 0 96x96
## 5 gif 393 225 sRGB TRUE 0 96x96
## 6 gif 373 234 sRGB TRUE 0 96x96
## 7 gif 354 234 sRGB TRUE 0 96x96
## 8 gif 308 210 sRGB TRUE 0 96x96
## 9 gif 320 260 sRGB TRUE 0 96x96
## 10 gif 331 218 sRGB TRUE 0 96x96
## 11 gif 356 208 sRGB TRUE 0 96x96
## 12 gif 347 208 sRGB TRUE 0 96x96
Untuk menuliskannya ke file bisa dengan cara ini:
image_write(animation, "gapminder.gif")
Gambar Raster
Gambar magick juga dapat dikonversi menjadi objek raster untuk digunakan dengan perangkat grafis R. Dengan begitu dapat menggabungkannya dengan alat grafis lainnya. Namun harap diperhatikan bahwa perangkat grafis R sangat lambat dan memiliki sistem koordinat yang sangat berbeda yang mengurangi kualitas gambar.
Raster Basis R
Base R memiliki format as.raster yang mengubah gambar menjadi vektor string.
plot(as.raster(frink))
# Mencetak grafis lain
plot(cars)
rasterImage(frink, 21, 0, 25, 80)
Package grid
Package grid mempermudah overlay raster pada perangkat grafis tanpa harus menyesuaikan koordinat x/y dari plot.
library(ggplot2)
library(grid)
qplot(speed, dist, data = cars, geom = c("point", "smooth"))
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
grid.raster(frink)
Ekstraksi teks OCR
Tambahan terbaru untuk paket ini adalah mengekstraksi teks dari gambar menggunakan OCR. Ini membutuhkan paket tesseract:
img <- image_read("http://jeroen.github.io/images/testocr.png")
print(img)
## # A tibble: 1 × 7
## format width height colorspace matte filesize density
## <chr> <int> <int> <chr> <lgl> <int> <chr>
## 1 PNG 640 480 sRGB TRUE 23359 72x72
# Mengekstrak Teks
cat(image_ocr(img))
## This is a lot of 12 point text to test the
## ocr code and see if it works on all types
## of file format.
##
## The quick brown dog jumped over the
## lazy fox. The quick brown dog jumped
## over the lazy fox. The quick brown dog
## jumped over the lazy fox. The quick
## brown dog jumped over the lazy fox.
Daftar Pustaka
Cran.r-project. (2023). The magick package: Advanced Image-Processing in R.