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.