⚠️ Ini adalah situs terjemahan tidak resmi dan tidak berafiliasi dengan ImageMagick Studio LLC. Untuk informasi resmi, lihat halaman asli (https://usage.imagemagick.org/filter/index.html).

Contoh penggunaan ImageMagick -- filter resampling

Di sini kita masuk ke aspek yang lebih mendasar dari pengubahan ukuran (resize) dan distorsi gambar, yaitu filter resampling yang dipakai untuk menentukan warna akhir setiap piksel pada gambar hasil. Bidangnya luas, sudah lama diteliti, dan sering kali lebih penuh pendapat serta pandangan pribadi daripada fakta kualitatif yang tegas, sebab mustahil menetapkan apa yang membentuk hasil resize yang sempurna. Itu sudah terbukti, dan menjadikannya bidang kajian yang sangat besar dan tidak akan pernah selesai. Sebaiknya baca dan pahami dulu Operator resize dan penskalaan.


Artefak resampling - seberapa bagus resize IM

Pengubahan ukuran gambar harus melawan persoalan yang sangat sulit. Bagaimana caranya mengubah satu larik nilai menjadi larik nilai yang lebih kecil, atau lebih besar, sehingga hasilnya tetap enak dipandang mata kita. Banyak hal bisa melenceng saat mencoba melakukannya, tetapi semuanya jatuh ke dalam empat kategori dasar..

Blocking

Pada dasarnya, jika Anda memperbesar gambar semata-mata dengan menggandakan piksel, yang terbentuk adalah blok piksel persegi yang lebih besar. Memperbesar gambar dengan "-scale" atau "-sample" memang persis melakukan itu, dan menghasilkan gambar besar yang pecah kotak-kotak. Sebagai contoh, di sini saya men-scale sebuah gambar kecil, sehingga yang muncul adalah blok warna besar alih-alih gambar yang mulus. Di sebelahnya ada versi yang di-'resize', dan yang terakhir memakai filter Gaussian untuk mengaburkannya lebih dari biasa serta mengganti piksel yang terisolasi dengan titik bulat, guna menghilangkan sebagian efek kotak-kotak itu.

  magick storm.gif  -scale  300%  storm_scaled.gif
  magick storm.gif  -resize 300%  storm_resized.gif
  magick storm.gif -filter Gaussian -resize 300%  storm_resized_gas.gif

[IM Output]
Asli | | [IM Output]
Hasil scale | [IM Output]
Hasil resize | [IM Output]
Hasil resize Gaussian

Penyebab utama 'blocking' adalah gambar sumber yang anti-aliasing-nya buruk, atau kurangnya penghalusan (pencampuran warna atau blur) antarpiksel untuk memperbaiki tampilan gambar secara keseluruhan. Efek ini juga khas terlihat ketika gambar beresolusi sangat rendah di-resize ke skala yang jauh lebih besar atau dipakai pada perangkat beresolusi tinggi. Tempat yang paling umum menampakkannya adalah pemakaian gambar bitmap pada buletin dan majalah buatan sendiri yang lalu dicetak dengan printer laser beresolusi sangat tinggi. Buletinnya tampak bagus di layar, tetapi keluar 'kotak-kotak' di halaman cetak. Situasi ini sangat sulit diperbaiki, dan umumnya lebih baik dihindari, dengan memakai clipart beresolusi jauh lebih tinggi, atau gambar vektor yang dapat diskalakan (seperti gambar format SVG dan WMF). Tentu saja dalam beberapa situasi artefak blocking justru diinginkan, bahkan dipertegas pada hasilnya. Misalnya ketika Anda mencoba menghidupkan kembali permainan video lawas beresolusi rendah di layar modern beresolusi tinggi: mempertahankan 'kotak-kotak' lama itu memperkuat kesan 'retro'. Atau mungkin ketika gambar diputar tanpa memunculkan warna baru atau warna campuran. Teknik yang benar-benar mempertahankan 'kotak-kotak' itu, tetapi mengisi kotaknya dengan garis diagonal, dikenal sebagai algoritma penskalaan pixel art, dan sudah banyak skema semacam itu dikembangkan. Satu skema sudah ditanamkan ke dalam ImageMagick, lewat operator Magnify.

Ringing

Ringing adalah efek yang sering terlihat pada gambar JPEG bermutu sangat rendah di dekat tepi yang tajam. Penyebabnya biasanya sebuah tepi yang dikompensasi berlebihan oleh algoritma resize atau kompresi gambar, atau filter bermutu tinggi yang dipakai dengan ukuran support yang keliru. Sebagai contoh, di sini saya memakai opsi khusus untuk memilih filter Sinc mentah, pada perubahan warna yang sangat tajam. Operasi yang sama saya ulangi memakai operator resize default IM, dengan filter pilihan defaultnya untuk pembesaran gambar.

  magick -size 8x16 xc:'#444' xc:'#AAA' +append  gray_edge.gif
  magick gray_edge.gif -filter Sinc \
                         -resize 100x100\!  gray_edge_ringing.gif
  magick gray_edge.gif  -resize 100x100\!  gray_edge_resize.gif

[IM Output] [IM Output] [IM Output]

Contoh di atas memperlihatkan dengan cukup jelas kompensasi berlebih yang muncul dari pemakaian filter resize mentah, tanpa satu pun optimasi yang disediakan IM. Gambar kedua, yang dihasilkan filter pembesaran default IM, juga memperlihatkan efek ringing yang sangat tipis, tetapi nyaris tak terlihat, dan sebenarnya justru diinginkan karena secara persepsi menajamkan batas tepi. Berikut contoh lain efek ringing, kali ini dengan memperbesar satu piksel tunggal di atas latar belakang abu-abu. |

  magick -size 1x1 xc: -bordercolor '#444' -border 4x4 \
          -define filter:lobes=5  -filter Sinc \
          -resize 100x100\!   dot_sinc.gif

[IM Output]
Gambar ini juga memperlihatkan dengan jelas efek sekunder yang muncul dari pemakaian filter satu dimensi. Artinya, efek ringing paling kuat pada arah horizontal dan vertikal (ortogonal), dengan ringing sekunder pada 45 derajat. Dan kali ini dengan filter silindris (lewat operasi Distort Resize), yang memperlihatkan bedanya dengan filter 2 lintasan sejajar sumbu (tensor) yang lebih lazim, yang dipakai operator Resize. |

  magick -size 1x1 xc: -bordercolor '#444' -border 4x4 \
          -define filter:lobes=5  -filter Jinc \
          -distort resize 100x100\! +repage dot_jinc.gif

[IM Output]
Efek semacam ini biasanya tidak terlihat, dan tampak di sini hanya karena dipakainya filter 'Sinc' atau 'Jinc' mentah (lihat Filter berjendela di bawah) untuk pembesaran yang ekstrem. Filter 'mentah' seperti ini lazimnya tidak dipakai.

Aliasing dan efek Moiré

Efek aliasing umumnya tampak sebagai munculnya efek serupa 'tangga' di sepanjang tepi gambar. Sering kali penyebabnya adalah sampling mentah atas gambar, misalnya dengan "-sample", atau penajaman gambar yang berlebihan saat resize. Efek tangga paling kentara pada pengecilan gambar yang kuat, meski jarang terlihat di IM. Namun aliasing juga punya efek lain, khususnya pola Moiré berskala besar yang muncul pada gambar yang mengandung semacam pola setingkat piksel. Pola tingkat rendah semacam itu kerap menghasilkan pola Moiré berskala besar, antara lain: pola garis sejajar, anyaman kain (sutra memperlihatkan efek ini di dunia nyata!), serta pola bata dan tile pada foto bangunan bata, pagar, dan perkerasan jalan. [IM Output] Untuk beberapa contoh gambar hasil resize yang memunculkan efek Moiré yang kuat, lihat halaman Wikipedia, Moiré Pattern. Cara klasik untuk memeriksa apakah sebuah resize akan memunculkan masalah aliasing adalah dengan mengecilkan gambar cincin (lihat di kanan). Gambar ini kerap memperlihatkan efek Moiré begitu bentuk resize apa pun diterapkan pada skala berapa pun. Peramban web khususnya memperlihatkan efek Moiré semacam itu saat menampilkan gambar tersebut, karena memakai teknik resize yang ultracepat (tetapi sering kali buruk).
Di sini saya menampilkan gambar 'cincin' yang di-resize memakai operator "-sample" yang sangat beraliasing, operator perata blok "-scale", dan "-resize" default yang biasa.

  magick rings_sm_orig.gif  -sample 100x100  rings_sample.png
  magick rings_sm_orig.gif  -scale  100x100  rings_scale.png
  magick rings_sm_orig.gif  -resize 100x100  rings_resize.png

[IM Output]
sample | [IM Output]
scale | [IM Output]
resize

Seperti terlihat, semua metode resize memang memunculkan sedikit efek Moiré, meski operator resize default IM menghasilkan pola sekunder yang tak diinginkan itu paling sedikit pada gambar akhir. Untuk memperlihatkan efek dari resize yang hanya sedikit, saya memangkas sudut dari gambar cincin besar, yang hasilnya ditampilkan lebih dulu, lalu ukurannya saya kurangi hanya 5%.

  magick rings_lg_orig.png -crop 105x105+0+0  rings_crop.png
  magick rings_crop.png    -sample 100x100    rings_crop_sample.png
  magick rings_crop.png    -scale  100x100    rings_crop_scale.png
  magick rings_crop.png    -resize 100x100    rings_crop_resize.png

[IM Output]
asli terpangkas | | [IM Output]
sample | [IM Output]
scale | [IM Output]
resize

Seperti terlihat, bahkan resize yang sedikit pun akan menyingkap aliasing apa pun yang mungkin dimiliki sebuah operator resize. Malah, kalau diamati dengan cermat, Anda mungkin melihat efek Moiré yang sangat samar pada potongan asli yang belum diskalakan dari gambar awalnya, yang muncul karena keterbatasan pemakaian gambar raster pada kerapatan yang hanya pas untuk tampilan layar komputer. Sebegitu pekanya gambar uji ini dalam memperlihatkan efek aliasing akibat pengecilan gambar.

Blurring

Kebanyakan orang sudah akrab dengan blur yang bisa muncul dari pemakaian "-resize". Ini boleh jadi keluhan nomor satu tentang gambar hasil resize mana pun, dan bukan tanpa alasan. Biasanya resize yang sangat kecil pun cenderung menghasilkan gambar yang buram, dan me-resize-nya lagi hanya memperparah keadaan. Masalahnya, ketika Anda me-resize sebuah gambar, gambar yang tersimpan sebagai 'kisi' atau larik piksel (dikenal sebagai 'raster') itu diubah agar pas ke kisi piksel yang sama sekali berbeda. Kedua 'kisi' itu tidak akan cocok kecuali dalam kasus yang sangat khusus, dan akibatnya data gambar harus dimodifikasi agar pas ke pola titik yang baru. Pada dasarnya mustahil me-resize gambar secara langsung dan berharap hasilnya rapi, meski hasil yang wajar tetap bisa dicapai. Hasilnya biasanya berupa sedikit blur pada data piksel. Makin bagus algoritma resize-nya, makin sedikit blur pada tepi yang tajam. Namun sebagian filter resize, terutama yang dirancang khusus untuk memperbesar gambar, kerap menambahkan blur jauh lebih banyak daripada yang perlu. Itu untuk melawan artefak 'blocking' seperti yang diperagakan di atas. Untuk pengecilan gambar, tepi yang dikaburkan kerap dipakai guna menghindari artefak 'ringing' pada tepi yang tajam dan mengurangi kemungkinan efek aliasing. Namun ini kompromi murahan, dan justru itulah yang mati-matian dihindari IM. Meski begitu, pengaturan expert khusus Filter Blur dapat dipakai untuk menyetel seberapa banyak blur yang diberikan sebuah filter. Tetapi awas: walaupun angka yang lebih kecil dari 1.0 mestinya mengurangi blur, angka itu bisa juga memperburuknya, bergantung pada filter yang persisnya dipakai dan rasio resize yang berlaku. Tidak ada jaminan apa pun. Sebelum IM v6.3.6-3 pengaturanFilter Blur bernama "-support", yang sangat menyesatkan soal apa yang sebenarnya dilakukannya. Opsi itu sudah usang dan tidak tersedia lagi.
Cara yang lebih baik untuk memperbaiki efek blur akibat resize adalah memfilter ulang gambar dengan operator penajaman. Lihat Menajamkan gambar hasil resize untuk rinciannya.

Resize IM vs program lain

Perbandingan praktis antara operator resize default IM dan sejumlah program lain dalam me-resize gambar dunia nyata disediakan oleh Bart van der Wolf di…

Contoh down-sampling

Ringkasnya, khusus untuk resize IM…

Meski banyak sedikitnya penajaman adalah soal selera, tiadanya artefak aliasing menghasilkan gambar yang paling bersih dan paling alami di antara semuanya.

Ia juga lanjut menelaah uji 'cincin', untuk membandingkan langsung berbagai metode resize Photoshop dengan ImageMagick…

Metode down-sampling

Artikel-artikel ini memperlihatkan betapa pentingnya melakukan resize dengan benar (dan memakai metode filter yang tepat) bagi pemrosesan gambar. Hal ini akan kita telaah lebih rinci di bagian berikutnya.


Filter resampling

Pengaturan "-filter" adalah kendali utama atas cara "Image Resizing" maupun "General Distort Operator" bekerja untuk menghasilkan hasil yang bersih dengan artefak resampling sesedikit mungkin. Ini menjadi topik kajian yang intens sepanjang akhir dekade 1980-an, dan dari sanalah Paul Heckbert, seorang peneliti utama di bidang ini, membuat dan merilis ke publik program resize gambarnya, "**zoom**". Program itu menjadi bapak dari hampir semua program resize gambar yang dipakai sekarang, meski banyak program belakangan mengimplementasikannya dengan buruk, sebab mudah sekali keliru. Sebagai contoh, lihatlah hasil pengujian bagaimana peramban web me-resize gambar. Dalam banyak hal, filter ini berkerabat dekat dengan konvolusi gambar, bahkan dengan kernel blur. Keduanya bahkan mengidap masalah yang serupa. Bedanya, filter dirancang untuk memperbaiki tampilan hasil akhir ketika gambar di-resize atau didistorsi. Nama-nama filternya benar-benar sebuah "who's who" para pakar pemrosesan gambar dan matematikawan seabad terakhir (atau lebih). Nama itu biasanya bukan gambaran tentang filternya, melainkan sekadar label orang yang pertama kali menerbitkan filter (atau keluarga filter) tersebut, atau yang paling banyak menelitinya. Akibatnya jauh lebih sulit untuk tahu apakah filter 'Lagrange' (dinamai menurut Joseph-Louis Lagrange) lebih baik daripada, katakanlah, filter 'Catrom' (dinamai menurut Edwin Catmull dan Raphael Rom). Di sini saya akan menjelaskan aspek-aspek utama filter. Tidak wajib mempelajari hal-hal ini, tetapi saya memutuskan untuk mendokumentasikan ringkasan dari yang saya pelajari, setelah merampungkan riset di bidang ini sebagai bagian dari perombakan dan perluasan besar sistem filter resize IM (IM 6.3.7-1). Terima kasih khusus untuk Fred Weinhaus atas bantuannya dalam riset selama pengembangan ulang filter resize. Ia terutama sangat menantikan penambahan keluarga filter 'Lagrange', yang belum ada di resize IM sebelum perombakan tersebut. Terima kasih juga untuk Nicolas Robidoux, yang matematikanya membantu memecahkan cacat besar pada operator Distort umum, lalu mengembangkan filter silindris, yang hasilnya lebih baik daripada yang Anda dapat dengan operator Resize.

Cara kerja filter

Ketika me-resize gambar, pada dasarnya Anda berusaha menentukan nilai yang benar bagi setiap piksel di gambar baru, berdasarkan piksel di gambar sumber aslinya. Namun piksel baru itu tidak persis berimpit dengan posisi piksel lama, jadi nilai yang benar untuknya harus ditentukan dengan cara tertentu. Yang dilakukan adalah memakai semacam rata-rata terbobot dari nilai piksel sumber asli untuk menentukan nilai yang bagus bagi piksel baru. Piksel nyata di sekeliling lokasi piksel baru itu membentuk sebuah 'ketetanggaan' berisi nilai-nilai penyumbang. Makin besar ketetanggaan ini, makin lambat resize-nya. Teknik ini disebut konvolusi. Seberapa besar sumbangan tiap piksel tetangga nyata (dikenal sebagai 'sampel') dalam membentuk piksel akhir ditentukan oleh sebuah fungsi pembobotan. Inilah 'filter ' yang dapat Anda pilih lewat pengaturan "-filter". Filter itu sendiri umumnya punya ukuran ketetanggaan yang ideal, yang dikenal sebagai 'support ' filter, walau disebut juga 'window '-nya. Sebuah 'filter ' dua dimensi yang sudah terdefinisi juga dikenal sebagai 'convolution kernel '.

_FUTURE: some diagrams may be helpful here_

Merancang fungsi pembobotan, atau 'filter', ini adalah urusan yang sangat rumit dan melibatkan matematika yang pelik, analisis frekuensi, bahkan transformasi Fourier. Titik awal yang bagus kalau Anda tertarik adalah Wikipedia: Nyquist–Shannon sampling theorem. Namun sebenarnya Anda tidak perlu sejauh itu untuk memahami filter yang ada dan efeknya pada gambar.

Filter

Filter terinterpolasi

Jenis fungsi filter resize yang paling sederhana adalah metode interpolatif. Metode ini mengambil satu lokasi piksel tertentu di gambar sumber lalu berusaha menentukan begitu saja nilai warna yang masuk akal untuk gambar di lokasi itu, berdasarkan warna piksel di sekitarnya. Karena jumlah piksel yang terlibat selalu tetap dan minimal, jenis filter ini adalah metode yang sangat cepat untuk me-resize atau mendistorsi gambar. Namun di situ pula letak kelemahannya, sebab ia tidak akan melebur banyak piksel menjadi satu untuk membentuk gambar yang jauh lebih kecil daripada aslinya. Itu pada gilirannya bisa memunculkan aliasing dan efek Moiré yang kuat. Interpolasi biasanya hanya dipakai untuk sampling 'point' atas gambar, ketika penskalaan gambar tidak diketahui atau memang tidak diperlukan. Misalnya, saat gambar diputar atau didistorsi ringan, penskalaan atau ukuran gambar tidak berubah, sehingga interpolasi dapat memberi hasil yang wajar, walau tidak terlalu akurat. Untuk keterangan lebih lanjut lihat pengaturan interpolasi milik IM. Namun cara ini tidak cocok untuk resize gambar pada umumnya.

Point

Memakai pengaturan "-filter" bernilai '**Point**' pada dasarnya berarti memakai filter interpolasi tanpa penskalaan. Untuk operator Resize, ia sekadar memilih piksel terdekat dengan posisi piksel yang baru, dan hanya itu. Artinya operator Resize akan memakai begitu saja warna sebuah piksel nyata di gambar sumber. Tidak ada upaya melebur warna atau menghasilkan warna yang lebih baik untuk gambar hasilnya. Akibatnya, memakai "-filter point -resize ..." akan memberi hasil yang sama dengan "-sample" (lihat operator Sampling), meski yang terakhir lebih cepat karena kodenya dirancang khusus untuk me-resize gambar lewat point sampling, lengkap dengan kendali untuk menyetel titik sampling yang persisnya dipakai. | _Untukoperator Distort, memilih "-filter Point" akan memaksa pemakaian point sampling terinterpolasi alih-alih filter silindris. Lihat Image Filters in the Distort Operator untuk rinciannya.

Jika Anda menginginkan point sampling terinterpolasi yang sama untuk resize gambar biasa, pakailah operator Interpolative Resize. Atau pakai Distort Resize dengan filter point untuk hasil yang sama.

_
Di sini saya mulai dengan pola hash 10x10 piksel lalu mengecilkan ukurannya, sebelum diskalakan kembali supaya hasilnya kelihatan.

  magick -size 10x10 pattern:gray50  checks_10.gif
  magick checks_10.gif -filter point -resize 9x9  checks_point-1.gif
  magick checks_10.gif -filter point -resize 8x8  checks_point-2.gif
  magick checks_10.gif -filter point -resize 7x7  checks_point-3.gif
  magick checks_10.gif -filter point -resize 6x6  checks_point-4.gif
  magick checks_10.gif -filter point -resize 5x5  checks_point-5.gif

[IM Output]
| | [IM Output]
Point-1 | [IM Output]
Point-2 | [IM Output]
Point-3 | [IM Output]
Point-4 | [IM Output]
Point 50%

Yang sebenarnya terjadi hanyalah baris dan kolom piksel tunggal dibuang di sepanjang gambar. Bahkan pada tingkat ini pun gambar hasilnya akan mengalami blocking dan aliasing yang ekstrem, dan dalam kasus tertentu seperti di atas bisa memberi hasil yang sama sekali tak masuk akal. Karena itu filter 'Point', atau padanannya yang lebih cepat yaitu operator Sampling, tidak dianjurkan untuk resize gambar biasa.

Box

Pengaturan filter '**Box**' persis sama dengan 'point', dengan satu perbedaan kecil. Ketika gambar diperkecil, ia merata-ratakan dan melebur piksel. Makin kecil gambar hasilnya, makin banyak piksel yang dirata-ratakan. [IM Output] Berikut grafik fungsi pembobotan filter tersebut, dan dari situ terlihat mengapa ia disebut filter 'Box'. Pada dasarnya piksel mana pun yang jatuh di dalam 'Box' akan langsung dipakai untuk menghitung warna piksel baru. Nah, karena filter ini lebarnya hanya 1/2 piksel, untuk gambar yang sebenarnya tidak di-resize hanya satu piksel, yaitu piksel terdekat, yang akan dipakai. Dengan kata lain, bila tidak ada penskalaan (atau hanya pembesaran), piksel terdekat dengan lokasi baru itulah yang membentuk warna piksel baru. Namun bila gambar diperkecil, makin banyak bagian gambar sumber yang termampat ke dalam batas 'box' tersebut. Hasilnya, makin banyak piksel yang dirata-ratakan untuk menghasilkan warna piksel di gambar yang lebih kecil. Sebagai contoh, berikut tampilan yang diperbesar dari pola piksel papan catur sewaktu perlahan-lahan dimampatkan memakai filter 'Box'.

  magick checks_10.gif -filter box -resize 9x9  checks_box-1.gif
  magick checks_10.gif -filter box -resize 8x8  checks_box-2.gif
  magick checks_10.gif -filter box -resize 7x7  checks_box-3.gif
  magick checks_10.gif -filter box -resize 6x6  checks_box-4.gif
  magick checks_10.gif -filter box -resize 5x5  checks_box-5.gif

[IM Output]
| | [IM Output]
Box-1 | [IM Output]
Box-2 | [IM Output]
Box-3 | [IM Output]
Box-4 | [IM Output]
Box 50%

Seperti terlihat, makin banyak piksel yang melebur seiring gambar di-resize makin kecil memakai filter 'Box', tetapi peleburan itu terjadi pada baris dan kolom tertentu yang jaraknya sama. Inilah yang menimbulkan segala macam artefak serta efek Moiré atau aliasing, baik saat gambar diperkecil maupun diperbesar. Filter 'Box' dianjurkan untuk 'binning' gambar. Artinya, mengecilkan gambar dengan kelipatan bilangan bulat agar setiap piksel hasilnya merupakan rata-rata dari jumlah piksel tetangga yang sama banyak (si 'bin'). Dengan begitu gambar hasilnya tetap tampak bersih, persis seperti gambar terakhir di atas. Dianjurkan pula memakai operator Scale yang jauh lebih cepat alih-alih 'filter Box'. Hasilnya nyaris identik, kecuali dalam kasus khusus pengecilan gambar hanya beberapa piksel. Untuk 'binning', hasilnya identik. Operator Scale tidak persis sama dengan 'filter Box', sebab ia diimplementasikan memakai algoritma 'Pixel Mixing' khusus. Untuk rincian persisnya lihat Scale Internals.
Saat memperbesar, filter 'Point' dan 'Box' sama-sama menghasilkan 'penggandaan piksel' pada baris dan kolom, sebab keduanya berujung pada pemilihan 'tetangga terdekat' yang sederhana.
  magick -size 5x5 pattern:gray50  checks_5.gif
  magick checks_5.gif -filter box   -resize 6x6    checks_box+1.gif
  magick checks_5.gif -filter box   -resize 7x7    checks_box+2.gif
  magick checks_5.gif -filter box   -resize 8x8    checks_box+3.gif
  magick checks_5.gif -filter box   -resize 9x9    checks_box+4.gif
  magick checks_5.gif -filter box   -resize 10x10  checks_box+5.gif

[IM Output]
| | [IM Output]
Box+1 | [IM Output]
Box+2 | [IM Output]
Box+3 | [IM Output]
Box+4 | [IM Output]
Box+5

| Operator Scale juga memberi hasil serupa, tetapi dengan sedikit pencampuran warna piksel saat memperbesar, kecuali pembesarannya memakai faktor penskalaan bilangan bulat.

Triangle

[IM Output] Filter interpolasi 'Triangle ' atau 'Bilinear' membawa interpolasi atas ketetanggaan terdekat itu satu langkah lebih jauh. Alih-alih merata-ratakan begitu saja piksel di dekatnya seperti yang dilakukan 'Box', ia membobotinya menurut seberapa dekat posisi piksel baru itu ke piksel asli di dalam ketetanggaan (atau wilayah 'support '). Makin dekat piksel baru ke sebuah piksel gambar sumber, makin besar sumbangan warna piksel tersebut. Ini menghasilkan perataan warna yang lebih menyeluruh ketika ukuran gambar dikecilkan.

  magick checks_10.gif -filter triangle -resize 9x9 checks_tri-1.gif
  magick checks_10.gif -filter triangle -resize 8x8 checks_tri-2.gif
  magick checks_10.gif -filter triangle -resize 7x7 checks_tri-3.gif
  magick checks_10.gif -filter triangle -resize 6x6 checks_tri-4.gif
  magick checks_10.gif -filter triangle -resize 5x5 checks_tri-5.gif

[IM Output]
| | [IM Output]
Tri-1 | [IM Output]
Tri-2 | [IM Output]
Tri-3 | [IM Output]
Tri-4 | [IM Output]
Tri

Seperti terlihat, karena piksel di sudut hampir persis berimpit dengan sudut gambar aslinya, piksel itu lebih kentara; tetapi ke arah tengah, tempat tak satu pun piksel di dekatnya benar-benar berimpit dengan piksel baru yang dihasilkan, yang Anda dapat adalah warna yang lebih merupakan rata-rata seluruh ketetanggaan. Untuk pola piksel papan catur, hasilnya adalah kecenderungan timbul-tenggelam ke arah warna abu-abu rata-rata. Namun karena ketetanggaan 'support ' lebih besar, lebih banyak piksel yang terlibat ketika Anda memperbesar gambar. Jadi warna dirata-ratakan saat piksel yang ditambahkan ke gambar dibangkitkan.

  magick checks_5.gif -filter triangle -resize 6x6  checks_tri+1.gif
  magick checks_5.gif -filter triangle -resize 7x7  checks_tri+2.gif
  magick checks_5.gif -filter triangle -resize 8x8  checks_tri+3.gif
  magick checks_5.gif -filter triangle -resize 9x9  checks_tri+4.gif
  magick checks_5.gif -filter triangle -resize 10x10 checks_tri+5.gif

[IM Output]
| | [IM Output]
Tri+1 | [IM Output]
Tri+2 | [IM Output]
Tri+3 | [IM Output]
Tri+4 | [IM Output]
Tri+5

Untuk pembesaran berskala besar, hasilnya seolah-olah ada gradien warna yang disisipkan di antara setiap piksel. Sebagai contoh, di sini saya membuat gambar yang sangat kecil dengan satu piksel putih tunggal (tampilannya diperbesar). Gambar itu lalu saya perbesar besar-besaran.

  magick xc: -bordercolor black -border 2x0 pixel_5.gif
  magick pixel_5.gif  -filter triangle -resize 300x  pixel_triangle.gif

[IM Output]
Gambar satu piksel
(diperbesar) | | [IM Output]
Diperbesar dengan filter Triangle

Kalau warna pada gambar di atas digrafikkan (memakai skrip "im_profile"), yang terlihat adalah replika grafik filter segitiga itu.

[IM Profile]
Profil gambar

Seperti terlihat, piksel di tengah melebur dengan piksel tetangganya sehingga terbentuk gradien warna yang linear di antara titik-titik tersebut. Semua filter interpolasi menghasilkan pola gradien serupa di antara piksel bertetangga, dan itu pula sebabnya filter jenis ini sangat cocok untuk pembesaran gambar.

Filter interpolasi lain

[IM Output] Di sebelah kanan saya menggrafikkan berbagai filter interpolasi, kecuali 'Point' yang sebenarnya kasus sangat khusus dari filter 'Box' tanpa penskalaan (interpolasi 'NearestNeighbor' murni). Filter interpolasi lainnya antara lain '**Hermite**', yang hasilnya sangat mirip triangle, tetapi pembulatannya lebih mulus saat memperbesar sehingga peralihan gradiennya halus. Klik grafik di sebelah kanan untuk melihat grafik ketiga fungsi filter tersebut.
[IM Output] Filter '**Lagrange**' pernah disebut filter interpolasi yang 'universal'. Dengan mengubah-ubah ukuran 'support' (lihat pengaturan expert Support di bawah), ia dapat menghasilkan semua filter interpolasi yang sudah kita lihat tadi (kecuali 'Hermite'). Pengaturan defaultnya (filter Lagrange orde 3 (support=2.0), ditunjukkan sebagai garis ungu pada grafik di kanan) memberi filter 'kubik' yang cukup baik. Filter ini bekerja sangat baik, walau perubahan gradiennya bisa memunculkan efek blocking yang kentara saat memperbesar — meski untuk gambar bitmap dan gambar garis hal itu justru bisa bagus. Orde filter Lagrange yang lain akan dibahas nanti. [IM Output] Filter '**Catrom**' (Catmull-Rom) adalah filter kubik baku yang terkenal dan kerap dipakai sebagai fungsi interpolasi, serta tersedia dengan nama yang sama. Filter ini menghasilkan tepi yang cukup tajam, tetapi tanpa perubahan gradien mencolok pada pembesaran gambar berskala besar seperti yang bisa muncul pada filter 'Lagrange'. Pada dasarnya ia setara dengan 'unsharp resize' bawaan (lihat Menajamkan gambar hasil resize), walau sebagian orang menganggapnya terlalu tajam, dan ia tidak menyediakan kendali apa pun atas penajaman itu. Yang membuat filter 'Catrom' lebih menarik adalah ia hampir merupakan padanan kubik yang identik dengan filter 'Lanczos' 2 lobe, yang boleh jadi merupakan filter Sinc berjendela yang paling umum dipakai (lihat di bawah). Filter ini akan kita telaah lebih rinci nanti di filter kubik.

Interpolasi dan pengaturan Interpolate milik IM

Pengaturan Interpolate milik IM, yang dipakai untuk melakukan pencarian 'point' tanpa penskalaan atas gambar pada operator seperti FX, operator rakitan sendiri ("-fx") dan operator penggantian warna lewat tabel pencarian ("-clut"), serta beberapa fungsi distorsi melingkar yang lebih lama, didasarkan pada filter resize interpolasi sederhana ini. Namun untuk saat ini semuanya diimplementasikan dengan kode terpisah dan nama pengaturannya pun berbeda. Pengaturan interpolasi tersebut antara lain: 'NearestNeighbor', yang mengimplementasikan filter 'Point' (atau 'Box' tanpa penskalaan), dan 'BiLinear' untuk mendapatkan filter 'Triangle' tanpa penskalaan. SELINGAN: sampai saat ini filter segitiga yang dihaluskan, 'Hermite', belum diimplementasikan langsung sebagai pengaturan interpolasi, dan itu sayang sekali karena ia filter interpolasi yang cukup bagus.

Filter blur Gaussian

Dalam matematika rumit transformasi Fourier ke ranah frekuensi, filter resize dimaksudkan untuk membuang noise berfrekuensi tinggi yang mungkin ada. Noise ini muncul karena gambar dunia nyata di-sampling menjadi piksel, dan ketika gambar di-resize, noise itu menampakkan diri sebagai efek aliasing dan Moiré. Karena itulah kurva lonceng Gauss sejak awal menjadi calon yang wajar sebagai filter resize atau resample, sebab ia model yang ideal untuk gejala dunia nyata.

Gaussian

[IM Output] Filter Gaussian adalah filter yang sangat istimewa karena menghasilkan bentuk 'kurva lonceng' yang sama di ranah frekuensi. Ini membuatnya sangat berguna sebagai filter gambar, sebab ia menjamin pembuangan noise berfrekuensi tinggi itu dengan cara yang sangat terkendali. Namun kalau grafik filternya diperiksa, akan terlihat bahwa pada jarak satu piksel dari titik sampling nilainya bukan nol. Malah nilainya cukup tinggi. Akibatnya masing-masing piksel menjadi sangat blur, bahkan ketika sebetulnya tidak ada resize yang dilakukan. Sebagai contoh, di sini saya me-resize logo IM standar memakai filter Gaussian, lalu sekali lagi memakai filter IM yang biasa ('Lanczos' dalam hal ini, yang akan kita lihat nanti)

  magick logo:  -filter Gaussian  -resize 150x logo_gaussian.png
  magick logo:                    -resize 150x logo_normal.png

| [IM Output]
Gaussian | [IM Output]
Resize biasa

Kalau diamati dengan cermat, terlihat bahwa gambar hasil filter 'Gaussian' di sebelah kiri lebih buram daripada resize biasa. Terutama pada detail bintang-bintang kecil di sekitar tongkat sihir dan di topi si penyihir. Blur pada gambar ini adalah harga yang harus dibayar untuk menghilangkan seluruh efek aliasing pada pengecilan gambar, sekaligus seluruh efek blocking pada pembesaran gambar. Filter ini juga tidak akan pernah memunculkan efek ringing (bila diterapkan dengan sempurna). Tetapi semua itu ditebus dengan blurring yang ekstrem pada gambar hasilnya. Malah, pada pembesaran berskala besar, filter ini menghasilkan titik bulat, bukan titik yang tampak persegi. Sebagai contoh, di sini saya memperbesar besar-besaran gambar 3x3 piksel dengan satu titik di tengahnya. |

  magick xc:red -bordercolor yellow -border 1 \
          -filter Gaussian   -resize 99x99  -normalize dot_gaussian.jpg

[IM Output]
Seperti terlihat, satu piksel tunggal membesar menjadi titik yang bulat sempurna. Hanya filter Gaussian dan yang mirip Gaussian yang berbuat begini.

Kendali expert sigma Gaussian

Filter Gaussian dapat dikendalikan langsung lewat opsi expert khusus "-define filter:sigma=_{value}_" untuk menetapkan nilai 'sigma' kurva Gauss yang sebenarnya. Secara default nilainya '0.5', yang juga sama besar dengan filter Box. Dalam banyak hal, filter Gaussian bisa dianggap pada dasarnya sebagai 'box yang dikaburkan'. Opsi expert ini ditambahkan agar blur Gaussian yang sangat-sangat kecil dapat dibuat, tanpa mengecilkan rentang support filter (lihat di bawah). Namun menaikkan 'sigma' bisa membuat filternya terpotong. Karena itu, ketika nilai 'sigma' dinaikkan, 'support' defaultnya (2.0) ikut dinaikkan sebanding. Ini hanya terjadi pada kenaikan dari nilai 'sigma' default. Pengaturan expert Support dapat dipakai untuk menimpa efek otomatis ini, tetapi biasanya tidak perlu. | _Opsi expert 'filter:sigma' hanya berlaku untuk filter Gaussian. Tidak ada filter lain yang terpengaruh oleh kendali expert ini.

Kendali yang lebih umum, untuk filter lain, bisa didapat lewat kendali expert Blur Filter yang akan kita lihat nanti.

_

Filter lain yang mirip Gaussian

[IM Output] Kalau grafik perbandingan di sebelah kanan ditelaah, terlihat bahwa filter 'Quadratic ' maupun filter 'Spline ' yang sedikit lebih rumit mengikuti kurva pembobotan filter 'Gaussian' dengan cukup baik. Dan karena keduanya fungsi polinomial, keduanya juga jauh lebih cepat dihitung — itulah alasan asal mula keduanya ditemukan. Sementara 'Quadratic' hanya sedikit lebih buram daripada filter Gaussian, filter 'Spline' bahkan lebih buram lagi, setara dengan pengaturan Sigma sekitar '0.65'. Itu menjadikan filter 'Spline' sebagai filter terburam yang disediakan tanpa modifikasi. Dari grafiknya terlihat bahwa, seperti filter Gaussian dan tidak seperti filter interpolasi, keduanya bernilai bukan nol pada jarak 1.0 dari titik sampling. Inilah yang membuat piksel di dekatnya melebur warnanya, dan inilah penyebab blur yang Anda lihat. Filter 'Spline' punya nilai tertinggi pada jarak 1.0, sehingga menghasilkan blur paling banyak pada gambar mana pun yang di-resize (atau didistorsi). Keburaman ekstra ini menghapus sisa terakhir efek 'blocking' yang mungkin muncul pada pembesaran berskala besar. Dan ia bisa dipadukan dengan teknik menajamkan gambar hasil resize untuk memperbesar gambar garis dengan 'efek tangga' yang sangat sedikit pada hasilnya. Filter 'Mitchell ' juga ditampilkan pada grafik perbandingan itu. Filter ini pun mengandung sedikit blur pada jarak 1.0 dari titik sampling, yang membuatnya sedikit buram, mirip filter-filter lain yang sudah kita lihat. Namun kurvanya juga punya sebagian bobot negatif, yang meski memunculkan efek ringing (lihat filter Sinc berjendela nanti), mengimbangi keburaman itu di dekat tepi yang tajam.

Kendali expert support filter

Filter Gaussian dikenal sebagai filter IIR (Infinite Impulse Response), yang artinya 'kurva' respons yang dipakainya tidak pernah mencapai nol. Yakni, sejauh apa pun dari titik sampling, tetap ada sumbangan bukan nol terhadap hasilnya dari piksel yang sangat jauh sekalipun. Secara matematis ini justru bagus, sebab berarti hasilnya jauh lebih sempurna secara matematis. Dalam penerapan praktis ini sangat buruk, sebab filter tak hingga menuntut pemakaian rata-rata terbobot dari setiap piksel di gambar asli, untuk membangkitkan setiap piksel baru di gambar tujuan. Artinya gambar besar akan butuh waktu sangat-sangat lama untuk di-resize secara sempurna dengan filter ini. Namun untuk filter 'Gaussian', apa pun yang berada di luar jangkauan sekitar 2 piksel (4 kali pengaturan 'sigma' defaultnya) dari titik sampling umumnya hampir tidak berpengaruh pada hasil akhir, sehingga umumnya bisa diabaikan. Bahkan 3 kali sigma pun umumnya dianggap wajar. Jangkauan ini dikenal sebagai 'support window ' filter dan merupakan batas praktis program untuk filter tersebut. Kalau Anda memang menginginkannya, 'support' sebuah filter dapat diubah lewat pengaturan expert khusus "-define filter:support=_{value}_". Sebagai contoh, di sini saya me-resize gambar berisi satu piksel memakai nilai support yang lebih kecil, 1.25, alias 2-1/2 kali nilai sigma. (lihat grafik hasilnya di kanan). Nilai itu tentu saja lebih kecil daripada minimum 3 kali nilai sigma yang biasanya diterima umum. |

  magick pattern:gray5 -crop 5x1+0+3 +repage pixel_5.gif
  magick pixel_5.gif  -filter gaussian -define filter:support=1.25 \
          -resize 300x  pixel_gaussian.png

[IM Output]

[IM Output]
Gambar satu piksel | | [IM Output]
Difilter Gaussian
[IM Profile]
Profil gambar

Dengan memakai pengaturan 'support' yang lebih kecil, 'anak tangga' (tempat jendela support memotong fungsinya) bergeser ke posisi 1.25. Itu pada gilirannya menghasilkan 'terhentinya' fungsi secara lebih besar pada profil filter, dan menimbulkan efek 'aliasing' yang terlihat pada gambar yang diperbesar. Yakni, riak di dekat 'puncak' grafik, serta 'terjun' mendadak di tepi batas 'support' filter. 'Support' bisa dibayangkan sebagai 'jendela' yang bergeser melintasi piksel-piksel yang dirata-ratakan untuk menghasilkan gambar besar itu. Karena ukuran support-nya 1.25, luas support total filter itu 2.5 piksel (tanpa penskalaan saat gambar diperbesar), sehingga bisa ada 2 atau 3 piksel yang terlibat pada tahap resize horizontal. Sewaktu 'jendela' support ini bergeser melintasi gambar, setiap piksel yang masuk atau keluar akan memunculkan 'perubahan' mendadak pada 'kurva' filter. Itulah penyebab goyangan kecil pada hasilnya. Yakni, pada titik-titik itu satu piksel ditambahkan ke atau dibuang dari jumlah total piksel yang dirata-ratakan menurut kurva pembobotan filter. Ini pada gilirannya menghasilkan empat 'goyangan' atau 'zig-zag' semacam itu pada gambar hasil resize: dua yang pertama di tepi luar ketika satu piksel putih itu masuk/keluar rentang support, dan sepasang goyangan kedua ketika piksel hitam kedua (yang menjadikannya rata-rata terbobot tiga piksel) masuk/keluar rentang support. Andai tidak ada 'penghentian' mendadak semacam itu pada filter — yakni filternya menuju nol tepat di batas support yang diatur — 'goyangan' itu takkan terlihat dan efeknya pun tak akan tampak. Memakai ukuran support berupa bilangan bulat atau setengah bulat (seperti pengaturan 'support' default '2.0' untuk filter 'Gaussian') selalu menjamin bahwa setiap kali satu piksel baru masuk ke rentang support, satu piksel lain keluar, sehingga jumlah piksel yang menjadi bagian dari rata-rata itu selalu sama. Itu akan menghapus dua goyangan di 'tengah', tetapi tidak akan menghapus goyangan awal di sisi luar yang menandai batas support. Bahkan perubahan kemiringan yang tajam (diskontinuitas) pada filter, seperti yang ada pada filter Triangle atau Lagrange, dapat memunculkan artefak yang kasatmata pada gambar hasilnya. | _Sebelum IM v6.3.6-3, 'support' untuk filter Gaussian diatur pada nilai '1.25' ini, sehingga memunculkan efek ringing pada pembesaran (seperti yang ditampilkan di atas). Karena itulah 'support' untuk Gaussian diubah menjadi '1.5' agar jumlah piksel yang dirata-ratakan selalu sama, dan agar anak tangganya mengecil.

Sejak IM v6.6.5-0, pengaturan 'support' default untuk Gaussian dinaikkan menjadi '2.0'. Ini hampir tak berpengaruh pada kecepatan filter secara keseluruhan, tetapi membuat 'penghentian' itu praktis lenyap. Ia juga menyederhanakan pengodean filter untuk pemakaian khusus lain dari filter ini, khususnya untuk distorsi EWA dan Variable Blur Mapping.

_
Perhatikan, kalau Anda memakai pengaturan support yang sangat besar, tentu makin banyak piksel yang harus dirata-ratakan sehingga operasi resize-nya melambat, tanpa perbaikan hasil yang berarti. Hanya filter Sinc/Jinc berjendela dan Lagrange yang umumnya dapat memberi hasil lebih baik dengan jendela support yang lebih besar dari 2.0. Ingat, ini opsi 'expert', jadi memakainya lebih mungkin memperburuk keadaan daripada memperbaikinya. Itu pula sebabnya opsi ini bukan opsi baris perintah biasa, melainkan disediakan lewat opsi khusus "-define". Tentu saja Anda dipersilakan bermain-main, persis seperti yang saya lakukan di atas, demi mencoba memahami segalanya dengan lebih baik — dan IM menyediakan opsi ini justru untuk itu.

Kendali expert blur filter

Opsi expert khusus, "-define filter:blur=_{value}_", dapat dipakai untuk menyetel seberapa banyak blur yang diberikan sebuah filter. Nilai '1.0' memberi perilaku default, sedangkan nilai yang lebih kecil dan lebih besar menyetel 'keburaman' secara keseluruhan. Pada dasarnya ini melebarkan atau menyempitkan kurva filter secara linear pada sumbu X (jarak piksel dari titik sampling), dan lazimnya membuat filter lebih atau kurang buram secara menyeluruh. Memakai pengaturan yang lebih kecil membuat fungsi filter (dan jendela support-nya) mengecil. Untuk filter Gaussian dan yang mirip Gaussian, efeknya seolah-olah nilai 'sigma' filter (default=0.5) dikalikan dengan faktor 'blur' ini. Pengaturan ini juga memperbesar atau memperkecil jendela support filter sebanyak itu pula supaya tidak terpotong, tetapi hal itu dapat ditimpa lewat pengaturan expert Support filter. Sebagai contoh, di sini saya me-resize gambar dengan tiga pengaturan 'blur' yang berbeda, memakai filter Spline yang mirip Gaussian..

  for blur in 0.5 1.0 1.5; do \
    magick logo: -define filter:blur=$blur -filter Spline \
            -resize 150x logo_blur_$blur.png; \
  done

[IM Output]
blur 0.5 | | [IM Output]
blur 1.0 | | [IM Output]
blur 1.5

Seperti terlihat, pengaturan khusus ini memungkinkan Anda mengendalikan keburaman hasil secara menyeluruh untuk filter 'Spline'. Karena ukuran 'jendela support' ikut diskalakan oleh pengaturan Filter Blur, memakai nilai penskalaan yang sangat kecil bisa membuat resampling-nya 'meleset' dari semua piksel, atau hanya menghasilkan piksel berbobot nol. Akibatnya akan muncul garis atau blok 'hitam' yang berpola tetap. Sebagai contoh… |

  magick rose: -define filter:blur=0.1 -filter Gaussian \
          -resize 100x100  rose_black_bars.png

[IM Output]
Memperbesar ukuran jendela support (sebelum diskalakan oleh blur) mungkin membantu mencegah efek ini, tetapi karena kebanyakan filter hanya menghasilkan bobot nol untuk piksel yang jatuh di luar rentang support 'alami'-nya, cara ini tidak berlaku untuk semua filter. Satu-satunya filter yang lazimnya menghasilkan nilai bukan nol yang berguna di sepanjang rentang support adalah filter Box dan filter Sinc/Jinc berjendela. Efek serupa terlihat pada filter silindris, ketika support filternya menjadi terlalu kecil untuk selalu menemukan setidaknya satu piksel yang bisa disampel. Filter Lagrange memakai pengaturan expert Support filter untuk menentukan 'orde' yang pas agar muat dalam 'jendela support', sehingga ia bermetamorfosis menjadi berbagai bentuk lain (lihat di bawah). | _Memakai pengaturan support yang buruk pada filter yang mengandung bobot negatif (pada dasarnya filter mana pun yang akan kita lihat berikutnya) dapat memunculkan efek penajaman terbalik dan penegasian, serta efek aliasing yang jauh lebih kuat secara tak sebanding. Dalam kasus yang jarang, ia bahkan bisa menghasilkan warna berbobot tak hingga (yang dijepit menjadi hitam dan putih murni pada versi IM non_HDRI yang biasa).

Berhati-hatilah dan pastikan Anda memang paham sebelum memakai opsi khusus ini pada filter apa pun.
| _Sebelum IM v6.3.6-3, define 'filter:blur' keliru diatur lewat opsi "-support", yang sangat menyesatkan soal apa yang sebenarnya dilakukannya. Opsi itu sudah usang dan tidak tersedia lagi.

Varian filter Gaussian Interpolator

[IM Output] Nilai kendali Blur '0.75' pada filter yang mirip Gaussian, atau nilai kendali Sigma '0.375' untuk filter Gaussian, akan menghasilkan varian yang saya sebut Gaussian Interpolator. Filter Gaussian yang ditajamkan ini punya sifat yang mirip dengan filter interpolasi yang kita lihat di atas. Bedanya, ia tidak mengandung penghentian tajam atau perubahan gradien lain yang bisa kentara pada gambar yang diperbesar. Dalam hal ini ia sangat mirip filter "Hermite" (lihat grafik), tetapi dengan kemencengan yang tidak simetris, yang tampaknya justru bekerja lebih baik sebagai interpolator.

  magick logo: -filter Gaussian -resize 150x logo_gaussian.png
  magick logo: -define filter:blur=0.75 -filter Gaussian \
          -resize 150x logo_gaussian_interpolate.png

[IM Output]
Gaussian | | [IM Output]
Gaussian Interpolator
(blur=0.75 atau sigma=0.375)

Sebenarnya, menurut saya cara ini membuat filter Gaussian memberi hasil yang jauh lebih bisa diterima: tidak terlalu tajam dan tidak terlalu buram. Namun mengurangi blurring filter akan memperkuat efek aliasing, sehingga lebih mungkin memunculkan efek Moiré berskala besar dari pola setingkat piksel yang halus. Itulah imbal balik dari memakai bentuk filter yang kurang buram.

  magick rings_crop.png -filter gaussian -resize 100x100  rings_gaussian.png
  magick rings_crop.png -filter gaussian -define filter:blur=0.75 \
                              -resize 100x100  rings_gaussian_interpolate.png

[IM Output]
Gaussian | | [IM Output]
Gaussian Interpolator
(blur=0.75 atau sigma=0.375)

Filter Sinc berjendela

Filter Sinc

Matematika sudah menetapkan bahwa filter yang ideal untuk me-resize gambar (dengan teknik resize 'tensor' 2 lintasan) adalah fungsi Sinc(). (Lihat Nyquist-Shannon sampling theorem). [IM Output] Karena sempurna secara matematis, Sinc() punya beberapa ciri istimewa yang ingin saya tunjukkan. Pertama, pada setiap jarak bilangan bulat, fungsi pembobotan filter itu menjadi nol. Ini sangat penting, sebab berarti filternya tidak mengaburkan gambar lebih dari yang perlu (tidak seperti filter Gaussian). Artinya juga, jika sebuah gambar di-resample tanpa diubah ukurannya (resize "no-op"), gambar itu sama sekali tidak terpengaruh oleh filternya. Jadi ia filter interpolatif, hanya saja yang sangat rumit. Fungsi Jinc() berkerabat dekat dengan Sinc() , dan punya sifat yang membuatnya berguna sebagai filter untuk penapisan 2 dimensi, seperti yang dipakai operator distorsi gambar umum. Fungsi ini akan dibahas lebih lanjut nanti di filter silindris. Untuk sekarang cukup dicatat bahwa ia juga bisa dipakai sebagai fungsi dasar bagi filter Jinc berjendela. Perbedaan besar lain antara filter berbasis Sinc() dan Jinc() dengan filter yang sudah kita lihat sebelumnya adalah bahwa banyak bobotnya bernilai negatif. Artinya, untuk setiap piksel di gambar, sebagian warna piksel di dekatnya justru dikurangkan dari warna akhirnya. Ini mungkin terdengar agak aneh, tetapi hasilnya adalah penajaman yang kuat pada tepi objek. Tentu saja bobot negatif mana pun umumnya harus diimbangi oleh lebih banyak lagi bobot positif di sepanjang kurvanya, sehingga terbentuklah fungsi mirip gelombang yang terlihat menjulur jauh dari titik sampling. 'Lobe' tambahan berisi bobot positif (dan negatif) inilah yang menyebabkan artefak ringing pada gambar yang mengandung batas warna yang sangat tegas, misalnya pada gambar garis berkontras tinggi, atau batas seperti atap merah dengan langit biru. Efek ringing ini bisa jadi jauh lebih mencolok kalau filter berbasis fungsi tersebut diterapkan secara tidak tepat.

Fungsi jendela

Sayangnya fungsi ini juga fungsi IIR (Infinite Impulse Response). Artinya efeknya menjulur sampai tak hingga, persis seperti filter Gaussian tadi. Ini berarti untuk memakai 'Sinc', Anda harus membangkitkan rata-rata terbobot dari setiap piksel di gambar (bahkan di luarnya) demi menciptakan representasi terbaik bagi setiap piksel baru di gambar tujuan. Ongkosnya mahal sekali, sehingga pemakaian langsung filter yang sempurna ini menjadi tidak praktis. Lagi pula, siapa juga yang mau, mengingat efek ringing-nya. Tetapi tidak seperti filter Gaussian, fungsi 'Sinc' tidak sekadar melandai ke dekat nol pada jarak pendek dari titik sampel. Malah, pada jarak 10 piksel dari titik sampling pun (lihat grafik di atas) pengaruhnya pada hasil akhir masih terasa. Namun me-resize gambar dengan filter berjarak support 10 menuntut perataan setidaknya 20x20 alias 400 piksel untuk tiap piksel hasil akhirnya. Dan itu akan membuat resize-nya sangat lambat. Karena itu, memakai filter "Sinc" dalam bentuk mentah tidak dianjurkan dan hampir tidak pernah dilakukan, meski lewat kendali expert filter IM tidak akan menghalangi Anda melakukannya kalau itu memang yang dikehendaki. Yang dianjurkan dan disediakan adalah bentuk 'berjendela' dari fungsi Sinc, yang dikembangkan para pakar pemrosesan gambar, dan dapat dipakai untuk 'membatasi' fungsi Sinc (dan Jinc) yang tak hingga itu ke ukuran yang lebih praktis. Filter jendela tersebut mencakup filter seperti 'Blackman', 'Bohman', 'Hann', 'Hamming' 'Lanczos', 'Kaiser', 'Welch', 'Bartlett', dan 'Parzen'.

Cara kerja filter berjendela

[IM Output] Sebagai contoh, grafik di sebelah kanan memperlihatkan tiga fungsi (klik untuk tampilan yang diperbesar). Fungsi merah adalah fungsi Sinc() yang ideal secara matematis, yang menjulur sampai tak hingga. Fungsi hijau adalah fungsi jendela "Hann" (berdasarkan kurva Cosine() yang sederhana). Fungsi ini dikalikan dengan Sinc() untuk memodulasi komponen filter yang lebih jauh, sehingga mencapai nol (atau mendekati nol) di tepi jendela support (4.0 satuan piksel adalah jaraknya secara default untuk filter ini). Pada dasarnya, dengan memilih 'Hann' untuk pilihan "-filter", yang sesungguhnya Anda pilih adalah 'Windowing Function ' 'Hann() ' untuk memodulasi 'Weighting function ' seperti 'Sinc() ' (atau 'Jinc() '). Jadi 'Windowed Filters ' sebenarnya dua fungsi: fungsi Sinc atau Jinc (bergantung pada operator pemrosesan gambarnya), dan 'Windowing Function' yang secara khusus Anda pilih sebagai filter yang dipakai. (Lihat kendali expert filter di bawah). Sebelum v6.3.6-3, IM melakukan kekeliruan berat dengan memakai fungsi jendela itu langsung sebagai fungsi pembobotan filter. Akibatnya semua filter tersebut (kecuali Lanczos) menghasilkan gambar yangberaliasing parah ketika dipakai untuk resize. Karena itu filter-filter tersebut kerap disalahpahami atau jarang dipakai pengguna IM. Sekarang hal ini sudah diperbaiki.

Ragam filter jendela

[IM Output] Di sebelah kanan adalah grafik semua fungsi jendela yang tersedia di IM pada saat tulisan ini dibuat (belakangan ditambahkan lagi yang lain). Ya, jumlahnya banyak, sebab fungsi jendela sudah menjadi bahan kajian intens banyak pakar pemrosesan sinyal. Semua fungsi filter berjendela umumnya dipakai untuk memodulasi fungsi pembobotan Sinc (atau Jinc) dengan support 3 atau 4 untuk Sinc (3 atau 4 lobe), bergantung pada kelas fungsi jendela yang dipakai (lihat di bawah). Misalnya, filter jendela 'Blackman' memakai 4 lobe, sedangkan 'Lanzcos' memakai 3 lobe. Ini bergantung pada versi IM Anda, jadi periksalah opsi expert Verbose Filter kalau ingin memastikan. Seperti terlihat, semua fungsi filter berjendela menghasilkan bentuk yang teredam dari fungsi Sinc() asli yang juga ditampilkan. Dan selain banyak sedikitnya ringing yang dihasilkan sebuah filter tertentu, sering kali nyaris tidak ada yang membedakan satu filter berjendela dari yang lain. Salah satu filter berjendela terbaik boleh jadi 'Lanczos '. Sementara orang lain bersumpah setia pada 'Blackman ', 'Bohman ', 'Hann ' (lonceng yang dilandaikan kosinus), 'Hamming ' (varian lonceng kosinus), 'Cosine ' (satu lobe kosinus) sebagai fungsi jendela. Semua fungsi ini dirumuskan berdasarkan pemakaian fungsi Sinc atau Sinus/Kosinus, yang konon menjamin fungsinya punya respons frekuensi yang baik. Filter jendela lainnya mencakup 'Welch ' (parabolik), 'Parzen ' (spline kubik), 'Kaiser ' (Bessel), dan yang mungkin paling sederhana, 'Bartlett ' (segitiga atau linear). Fungsi-fungsi itu lazimnya diciptakan demi kesederhanaan dan kecepatan penghitungan, walau umumnya dianggap punya 'respons frekuensi' yang buruk. Banyak pula di antara fungsi jendela ini yang dipakai sebagai filter resampling tersendiri. Misalnya 'Bartlett' (yang mungkin benar-benar paling nyeleneh di antara semua fungsi jendela) sebenarnya fungsi matematis yang sama dengan yang dipakai untuk filter 'Triangle', sekaligus untuk filter interpolasi 'Bilinear'. Semua fungsi (kecuali 'Bartlett') membentuk dua kategori dasar fungsi jendela.

  • Kurva berbentuk 'lonceng' yang melandai, seperti 'Hamming', 'Hann', 'Kaiser', 'Blackman', 'Bohman', dan 'Parzen'.
  • Dan fungsi jendela bertipe 'lobe' tanpa pelandaian, yang cepat jatuh ke nol sebelum 'dipotong' oleh support jendelanya, seperti 'Lanczos', 'Welch', dan 'Cosine'.

Kalau grafik fungsi jendela di atas ditelaah, terlihat bagaimana bentuk kedua gaya filter itu berbeda. Namun kedua kategori fungsi jendela tersebut tampaknya tidak sepenting 'respons frekuensi' menyeluruh yang didapat dari pemakaian kurva yang didefinisikan secara trigonometris. Fungsi jendela berbentuk 'lonceng' yang melandai memakai support lobe sebanyak 4 lobe fungsi pembobotan Sinc (atau fungsi Jinc pada resampling silindris (distort)). Filter jendela bertipe 'lobe' tanpa pelandaian secara default memakai support 3 lobe. Hasilnya adalah kesetaraan yang kasar antara kedua jenis filter jendela itu, karena perbedaan pelandaian fungsi jendelanya. Ini juga berarti filter berjendela tanpa pelandaian secara default sedikit lebih cepat daripada yang berpelandaian. Jumlah lobe default yang semestinya dimiliki filter dibahas dalam diskusi Forum IM, Add Cosine windowing?. Tentu saja kalau mau, Anda dapat mengubah support lobe atau bahkan sekadar support umum filter resize mana pun. Semuanya kurang lebih sama, hanya berbeda tipis dalam banyak sedikitnya efek ringing dan blocking yang dihasilkan. [IM Output] Di sebelah kanan adalah fungsi jendela yang sama, tetapi memakai support lobe default sebagaimana ditetapkan IM menurut sifat berpelandaian/tanpa pelandaiannya. Seperti terlihat, di sepanjang dua lobe pertama (yang utama dan paling berpengaruh) hampir tidak ada perbedaan antarfilter, dan semuanya memperlihatkan 'pelandaian' yang sangat mirip pada rentang itu. Namun urutan fungsinya tidak banyak berubah: ujung-ujung ekstremnya tetap 'Welch ' dan 'Parzen ', dengan 'Lanczos ' jatuh persis di tengah pelandaian kurva yang dihasilkan. [IM Output] Dan di sebelah kanan adalah filter windowed-sinc yang dihasilkan jika pengguna memilih fungsi jendela tersebut dengan default di atas. Seperti terlihat, kurva pembobotan akhirnya semua sangat mirip, dan seperti diduga semuanya terapit di antara ujung ekstrem 'Welch ' dan 'Parzen '. Definisi dan grafik yang lebih rinci untuk sebagian besar fungsi jendela ini, beserta hasilnya dalam spektrum frekuensi Fourier, dapat dilihat di Wikipedia, Window function.
Ringkasnya: saya tidak menemukan perbedaan hasil yang berarti di antara berbagai fungsi jendela ini. Selain itu, dari makalah-makalah riset yang saya baca, hasilnya tampak lebih berupa penilaian kualitatif tentang kecocokannya daripada sesuatu yang konkret. Perasaan saya, hampir semua fungsi jendela bisa dipakai; tetapi kalau harus memilih satu, Anda lebih baik bertahan pada filter jendela yang paling populer, 'Lanczos'. Ia ada di tengah semua filter di atas, respons spektrum frekuensinya bagus, dan umumnya merupakan pilihan yang baik sebagai filter resampling. Di sisi lain, seorang pakar pemrosesan gambar yang berjasa besar pada filter resampling ImageMagick tidak sependapat. Hanya saja ia memilih filter lebih berdasarkan kebutuhan persis gambar tertentu. Saran dan komentarnya bisa dilihat di Teknik yang dianjurkan Nicolas Robidoux.

Filter Lanczos

Filter 'Lanczos ' sudah beberapa kali kita sebut. Ia mungkin yang paling terkenal di antara filter berjendela, dan jatuh di tengah-tengah rentang filter berjendela yang sudah kita lihat. Pada dasarnya pelandaiannya tidak terlalu cepat maupun terlalu lambat, dan respons frekuensinya bagus pada transformasi Fourier hasilnya. Pada intinya 'Lanczos ' adalah titik awal yang bagus untuk kerja filter apa pun, dan sudah banyak dipakai dalam pengembangan filter silindris Jinc berjendela belakangan ini (lihat di bawah). Filter 'Lanczos ' pada dasarnya memakai 'lobe' pertama fungsi Sinc() untuk menjendelai fungsi Sinc() itu sendiri. Artinya, fungsi pembobotan filter itu dipakai untuk menetapkan fungsi jendelanya sendiri. Banyak orang melihat itu sebagai alasan bagus untuk memilihnya di atas sekian banyak filter Sinc berjendela lain. Meski hampir tidak ada bukti nyata bahwa ia yang terbaik, ia filter kelas menengah yang solid. Secara default IM mendefinisikan filter 'Lanczos' sebagai punya 3 'lobe'. Alasannya, fungsi jendelanya sendiri 'tanpa pelandaian', dalam arti ia hanya satu lobe yang langsung terpotong, dengan titik potong nol pertama fungsinya berimpit dengan batas support jendelanya. Lihat Cara kerja filter berjendela di atas. [IM Output] Namun filter 'Lanczos2 ' berlobe 2 (Lanczos dengan default 2 lobe, ditambahkan agar mudah dipilih pengguna) juga ternyata populer, sebab ia menghindari artefak ringing positif yang bisa muncul dari filter windowed-sinc. Filter 'Catrom' (sebenarnya 'filter Catmull-Rom') hampir merupakan salinan persis filter 'Lanczos2', hanya saja karena ia filter kubik, pembangkitan matematisnya jauh lebih cepat. Namun itu biasanya bukan masalah, mengingat cara IM meng-cache nilai filter sebelum memproses gambar. Meski begitu, sebuah diskusi panjang di forum IM tampaknya menunjukkan bahwa untuk resize ortogonal (tensor), 'Lanczos' 4 lobe justru bekerja lebih baik saat mengecilkan gambar, sekaligus mencegah Moiré pada gambar objek berpola sangat halus, tetapi dengan ongkos ringing yang lebih banyak.

Ukuran jendela dalam lobe

Seperti sudah saya sebutkan, fungsi filter Sinc (dan Jinc) yang mendasarinya sebenarnya berukuran tak hingga. Meski secara default IM membatasinya, lewat fungsi jendela yang ditentukan, ke ukuran yang jauh lebih kecil dan lebih praktis. Namun ada saja situasi ketika Anda benar-benar ingin mencoba mendapatkan resize gambar yang jauh lebih baik dan lebih tepat memakai ukuran jendela (support) yang jauh lebih besar dan lebih lambat. Hal itu bahkan bisa dilakukan dengan cukup mudah lewat kendali expert Filter Support, persis seperti yang kita lakukan untuk filter yang mirip Gaussian. Fungsi jendelanya sendiri (dalam banyak kasus) akan menurunkan Sinc (dan Jinc) ke nol di sepanjang rentang pengaturan support. Tetapi karena fungsi jendela itu diskalakan agar muat ke jendela 'support', fungsi filter yang dihasilkan pun ikut berubah. [IM Output] Sebagai contoh, di sebelah kanan saya menggrafikkan filter berjendela 'Lanczos' terhadap fungsi Sinc() sebagai acuan, dengan berbagai pengaturan 'support' dari 2 sampai 8. Perhatikan bahwa ukuran filter yang sebenarnya dibatasi oleh ukuran support yang dipakai. Makin kecil 'support'-nya, makin cepat filternya, tetapi makin tidak persis pula fungsinya mengikuti fungsi Sinc() yang ideal secara matematis. Amati baik-baik tiap kurva yang digrafikkan. Kurva 'hijau' (support=2) hanya punya puncak utama di tengah, ditambah satu 'lobe' negatif (setara dengan filter 'Lanczos2'). Setelah itu fungsinya nol saja, dan tidak dipakai. Kurva 'ungu' berikutnya (support=3, yaitu filter 'Lanczos' default) punya 'lobe' negatif pertama yang jauh lebih besar, lalu 'lobe' positif yang lebih kecil. Begitu seterusnya, makin banyak lobe yang ditambahkan seiring ukuran support naik dalam kelipatan bilangan bulat. Lobe tambahan itu makin lama makin pendek, sehingga pengaruhnya pada hasil akhir makin kecil, tetapi 'lobe' awalnya makin tinggi (makin berpengaruh, dan karenanya efek ringing-nya makin banyak). Untuk hasil terbaik, pakailah pengaturan support yang menghasilkan filter dengan sekian banyak 'lobe' naik/turun di dalamnya. Yakni, fungsi jendela — dan dengan demikian 'support' filternya — berakhir tepat di sebuah 'titik potong nol'. Namun sementara fungsi Sinc() punya 'lobe' (titik potong nol) pada pengaturan 'support' bilangan bulat, fungsi pembobotan Jinc() tidak. Ini merepotkan pengguna yang ingin menyetel jendela support untuk filter yang dipakai bersama operator Distort. Nyatanya Jinc() punya 'titik potong nol' pada posisi yang sangat irasional. Titik potong nol itu sangat sulit dihitung kalau Anda bukan pakar matematika. Agar lebih mudah menetapkan filter dalam satuan jumlah 'lobe', dibuatlah satu pengaturan khusus lain, "-define filter:lobes=_{integer}_". Jika filternya dipakai oleh operator resampling gambar 2 dimensi seperti operator distorsi umum, yang umumnya memakai Jinc() sebagai fungsi dasar, ia akan menengok tabel 20 titik potong nol pertama untuk filter itu, lalu menetapkan pengaturan 'support' ke nilai tersebut. Artinya Anda tidak perlu repot mencari pengaturan support yang pas untuk fungsi Jinc() — cukup sebutkan jumlah lobe yang ingin dipakai. Karena itu, lebih baik menentukan filter Sinc atau Jinc berjendela dalam satuan jumlah 'lobe' yang ingin dikandung filternya, alih-alih menentukan pengaturan 'support' secara langsung. Jika fungsi Sinc() maupun Jinc() tidak dipakai dalam definisi filternya, pengaturan 'filter:lobes' dipakai untuk menghitung pengaturan 'support' yang pas bagi pemakaian filter tersebut. Perhatikan, pengaturan 'filter:support' akan menimpa pengaturan 'filter:lobes' apa pun yang diberikan, jadi lebih baik hanya mendefinisikan opsi expert 'filter:lobes', apalagi jika memakai operator distorsi umum.

Filter Lagrange

Sebagaimana filter 'Gaussian' merupakan fungsi yang lambat secara matematis (walau itu tidak terlalu memengaruhi kecepatan keseluruhan berkat hasil yang di-cache oleh IM), filter Sinc/Jinc berjendela bahkan lebih lambat dan lebih rumit dihitung karena perlu menghitung fungsi trigonometri untuk dipakai baik pada fungsi pembobotan maupun fungsi jendela. Filter 'Lagrange ' sebaliknya membangkitkan fungsi polinomial kubik sepotong-sepotong untuk menghampiri sebuah filter berjendela. (Lihat Wikipedia: Lagrange Polynomial). Sebagaimana filter berjendela dapat disetel lewat pengaturan Support, filter 'Lagrange' juga menyetel dirinya menurut pengaturan itu. Pengaturan support default 2.0 menghasilkan filter 'Lagrange' (orde 3). Filter ini cukup bagus untuk memperbesar maupun mengecilkan gambar, dengan efek blocking dan ringing yang minimal serta tanpa efek blurring. | _Kendali expert Support sebenarnya menentukan 'orde' filter Lagrange yang harus dipakai. Yakni, filter Lagrange dengan support default 2.0 menghasilkan filter Lagrange orde 3 (orde = support × 2 - 1, jadi support=2.0 => filter Lagrange-3). Itulah sebabnya pengaturannya sebenarnya hanya bisa memakai ukuran setengah bilangan bulat.

Karena itu, untuk mendapatkan filter Lagrange orde 4 Anda memakai opsi_ -define filter:support=2.5
[IM Output] Dengan pengaturan support yang lebih besar, filter 'Lagrange' menghasilkan filter Sinc berjendela tanpa perlu penghitungan fungsi trigonometri yang rumit, bahkan tanpa fungsi jendela tambahan. Makin besar pengaturan support-nya, makin mirip filter itu meniru fungsi Sinc(), tetapi makin lambat pula penghitungannya. (lihat grafik filter Lagrange dengan support lebih besar di kiri).
[IM Output] Dengan pengaturan support yang lebih kecil, filter 'Lagrange' meniru sebagian besar filter terinterpolasi yang beragam itu. Yakni, ukuran support '0.5' menghasilkan filter 'Box', dan '1.0' menghasilkan filter 'Triangle'. Pengaturan support hanya dapat disetel dalam kelipatan setengah bilangan bulat, dan memakai faktor support selain itu tidak banyak gunanya.
[IM Output] Filter Lagrange dengan support setengah bulat yang lain (yang menghasilkan orde genap) menghasilkan himpunan bobot filter yang sangat terputus-putus, dan mirip filter 'Box', filter ini bisa memunculkan artefak resize blocking yang kuat. Di sisi lain, untuk resize berskala kecil hal ini justru menjamin gambar tetap tajam pada penyesuaian ukuran yang sangat kecil. Filter 'Lagrange' berorde 'genap' ini justru menyorot kelemahan utama pemakaian filter tersebut, yaitu bahwa fungsi pembobotannya bukan gradien yang 'mulus'. Pada pembesaran berskala besar, ini berarti Anda bisa melihat perubahan yang kentara pada gradien yang dihasilkan. Namun hal ini jarang menjadi masalah, kecuali pada kasus ekstrem tersebut. Pada dasarnya ia mewakili filter yang secara universal menciptakan bentuk yang pas untuk pengaturan 'support' yang berlaku, sebesar atau sekecil apa pun pengaturan itu. Ia filter resize yang menjendelai dirinya sendiri. | Filter 'Lagrange' baru terdefinisi penuh dan bisa dipakai sejak IM versi v6.3.7-1.

Filter kubik

Ketika banyak pakar gambar berusaha menemukan filter resize gambar yang lebih baik dan lebih cepat dihitung, berkembanglah satu keluarga filter yang kemudian dikenal sebagai filter kubik. Filter ini sangat mirip filter Lagrange yang ditunjukkan tadi, dan tersusun dari himpunan potongan sepotong-sepotong yang lebih kecil dan tetap. Namun tidak seperti filter Lagrange, potongan-potongan itu dirancang agar bersambung membentuk kurva yang mulus, demi mengurangi efek blocking yang tajam. [IM Output] Pada grafik di kiri ditampilkan empat filter kubik 'mulus' semacam itu yang sudah terdefinisi di dalam IM dan terkenal sebagai filter resize. Filter 'Spline ' (dipakai juga sebagai alias dan pengaturan default bagi fungsi filter 'Cubic' umum) meniru filter blur Gaussian. Kurva ini dikenal juga sebagai kurva interpolasi 'B-Spline', dan lazim pula dipakai untuk menggambar garis mulus yang melewati sekumpulan titik. Ia juga kerap dipakai untuk gerak kamera dan objek dalam animasi, agar alirannya mulus melewati titik kendali yang diberikan pengguna. Ditampilkan pula 'Catrom ', atau lebih tepatnya 'filter Catmull-Rom' alias 'Keys Cubic Convolution', yang menghasilkan bentuk filter interpolasi yang mulus dan tidak mengaburkan. Meski begitu ia bisa sedikit melampaui sasaran. Pada dasarnya ia filter ideal yang menajamkan dirinya sendiri, dan karena itu juga menjadi fungsi yang lazim dipakai untuk interpolasi bi-kubik dasar. Terakhir, filter kubik 'Hermite ', yang merupakan jenis filter interpolasi segitiga yang dihaluskan, dan melandai mulus pada koordinat masukan. Pada dasarnya ia membulatkan tepi yang tegas sambil mempertahankan 'aras warna' yang datar pada gambar aslinya.

Keluarga filter kubik

Yang di atas adalah filter 'bernama' yang paling umum dari kurva kubik, tetapi semuanya juga tergolong ke dalam keluarga filter kubik tertentu. Keluarga 'B-Spline' dari kubik pada dasarnya setara dengan berbagai derajat blurring pada hasilnya. Biasanya berkisar dari filter 'Spline' yang sangat buram sampai hasil filter 'Hermite' yang membulatkan tepi tetapi kotak-kotak. Lalu ada keluarga 'Cardinal', yang menghasilkan filter yang berkompromi antara artefak blocking dan ringing, dan dari sanalah 'filter Catmull-Rom' ('Catrom') berkembang sebagai kompromi yang berimbang di antara kedua artefak itu. Kedua keluarga tersebut kemudian melebur menjadi keluarga filter kubik Keys, yang menghubungkan 'filter Catmull-Rom' (Keys α = 0.5) dengan 'filter kubik B-Spline' (Keys α = 0.0). Keluarga filter Keys juga punya sifat istimewa: ia mempertahankan gradien linear (afin) apa pun yang mungkin ada di seluruh gambar. Efek ringing dan blurring filter keluarga Keys baru berperan ketika gambarnya mengandung perubahan warna yang tegas, bukan gradasi warna yang mulus. Bingung dengan segala ragam itu? Tentu saja bingung. Semua orang juga begitu! Masalahnya, hasil filter sering kali sangat subjektif, bergantung pada gambarnya dan pada batasan 'keluarga' yang Anda pakai. Apa yang membuat sebuah filter bagus benar-benar bergantung pada siapa yang ditanya, apakah Anda sedang memperbesar atau mengecilkan, dan gambar apa yang sedang diproses. Dalam beberapa hal, sampai sekarang pun masih membingungkan. Saya butuh lebih dari dua tahun meraba-raba, membaca, dan bermain-main dengan berbagai filter untuk sampai pada awal ringkasan ini, dan bahkan sekarang pun ia masih berkembang. Pengubahan ukuran gambar adalah bidang yang sangat subjektif, sulit (sebenarnya sudah terbukti mustahil) dikuantifikasi dengan cara apa pun yang sungguhan. Tidak ada yang namanya resize yang 'sempurna'.

Filter Mitchell-Netravali

Ke dalam kekusutan itu, Don P. Mitchell dan Arun N. Netravali datang dengan makalah 'Reconstruction Filters in Computer Graphics', yang merumuskan dua peubah yang dikenal sebagai 'B' (seperti yang dipakai untuk kurva 'B-spline') dan 'C' (seperti yang dipakai untuk kurva 'Cardinal' dan setara dengan nilai α filter 'Keys'). Dengan kedua nilai itu Anda dapat membangkitkan filter kubik sepotong-sepotong mana pun yang bersambung mulus (turunan pertamanya kontinu). [IM Output] Yang lebih penting, alih-alih hanya bersandar pada pendapat sendiri, keduanya lalu mensurvei sekelompok 9 pakar pemrosesan gambar untuk mengelompokkan artefak yang muncul saat gambar diperbesar sedikit memakai berbagai nilai B dan C. Hasil survei itu ditampilkan dalam diagram yang digambar ulang di sebelah kanan. Area 'hijau' mewakili nilai yang menurut para pakar memberi hasil yang bisa diterima, sedangkan area lainnya menghasilkan berbagai jenis artefak. Gambar ini penting, sebab ia benar-benar memperlihatkan hubungan antara berbagai artefak dan berbagai jenis filter yang bisa dihasilkan. Dari hasilnya terlihat pula mengapa keluarga filter 'Keys' menjadi begitu penting sebagai salah satu metode yang lebih baik untuk membangkitkan filter kubik yang bagus. Filter-filternya pada dasarnya jatuh pada satu garis yang menembus lurus area yang dianggap 'bisa diterima' oleh para pakar pemrosesan gambar itu. Dari survei tersebut, Mitchell dan Netravali menyimpulkan bahwa filter terbaik adalah filter keluarga 'Keys' yang jatuh di tengah area yang bisa diterima, dengan nilai B,C sebesar 1/3,1/3. Filter itu kini dikenal sebagai 'filter Mitchell-Netravali' dan tersedia di IM sebagai pengaturan filter 'Mitchell '. Pada dasarnya ia kompromi atas semua artefak resize. Ia juga filter default yang dipakai IM untuk pembesaran gambar. Semua filter kubik 'bernama' bawaan, yaitu 'Mitchell', 'Robidoux', 'Catrom', 'Spline', dan 'Hermite', juga ditandai pada diagram di atas, sehingga terlihat apa yang akan dipikirkan para pakar itu tentang filter tersebut. Ditampilkan pula garis-garis yang mewakili keluarga filter 'B-Spline', 'Cardinal', dan 'Keys'. Di dalamnya, semua filter ini hanya berbeda pada pengaturan B,C filter yang sudah terdefinisi; nyatanya IM memakai fungsi internal yang sama untuk membangkitkan semua filter kubik, hanya dengan pengaturan B,C berbeda yang mendefinisikan filter tersebut.

Kendali expert B,C kubik

Anda dapat memakai pengaturan expert khusus untuk menetapkan pengaturan B,C yang dipakai sebuah filter kubik. Untuk itu Anda perlu memilih 'fungsi' filter 'Cubic' umum (atau salah satu filter kubik bernama lainnya), berikut pengaturan expert 'b' dan 'c' yang diinginkan. Sebagai contoh…

   -filter Cubic
   -define filter:b=_value_
   -define filter:c=_value_

Pengaturan expert akan menimpa default internal filter bersangkutan ketika ia dipakai oleh operator resize atau distort. Karena itu urutan opsi di atas tidak jadi soal, asalkan semua pengaturan expert global yang diinginkan sudah Anda "-define" atau "-set" sebelum operator pemrosesan gambarnya dipakai. Jika salah satu pengaturan 'b' atau 'c' belum didefinisikan atau diatur, nilainya dihitung dari nilai yang satunya dengan anggapan bahwa yang Anda inginkan adalah filter keluarga 'Keys' (sepanjang garis putus-putus pada diagram survei Mitchell-Netravali). Ingat, 'c' setara dengan pengaturan α Keys, sedangkan 'b' bisa dianggap sebagai pengaturan 'blur' spline kubik. Pengaturan expert ini memberi pengguna cara yang bagus untuk 'menyetel' resize gambarnya agar mendapat persis apa yang diinginkan (baik memakai Resize maupun Distort). Di antara keduanya, pengaturan 'b' lebih mudah dipahami. Anggap saja 'b' sebagai 'keburaman'. Nilai b=0 sangat tajam (filter Catmull-Rom), yang cenderung memunculkan ringing berupa halo negatif dan sedikit efek aliasing atau Moiré. Nilai b=1 cenderung memberi efek terlalu buram (mirip Spline atau Gaussian). Dengan begitu para pakar (bahkan pengguna biasa) mudah menyetel nilai ini untuk menemukan filter yang 'pas bagi mereka'. Di sebelah kanan ada tabel nilai B,C untuk filter kubik yang secara khusus 'bernama'. Ingat, 'Hermite' adalah satu-satunya filter kubik bawaan yang bukan bagian dari keluarga filter 'Keys'. Ia juga punya support terkecil ('1.0') di antara semua filter kubik BC, dan tidak mengandung lobe negatif. Filter 'Robidoux' dan 'RobidouxSharp' sangat mirip 'Mitchell', tetapi alih-alih hasil survei, keduanya ditentukan secara matematis untuk pemakaian khusus sebagai filter silindris. Filter 'Robidoux' adalah filter default yang dipakai operator Distort umum (lihat di bawah). | | | Filter | B
blur | C
Keys α
Hermite | 0.0 | 0.0
Spline | 1.0 | 0.0
Catrom | 0.0 | 1/2
Mitchell | 1/3 | 1/3
Robidoux | 0.3782 | 0.3109
Robidoux
Sharp | 0.2620 | 0.3690
Robidoux
Soft | 0.6796 | 0.1602
| Filter jendela 'Parzen' memakai filter 'Spline' sebagai fungsi jendelanya. Karena itu filter jendela ini dapat Anda definisikan ulang lewat opsi expert B,C. Seberapa berguna hal itu, dan apa pengaruhnya pada Sinc (atau Jinc) berjendela yang dihasilkan, tidak diketahui, dan tidak dianjurkan.

Filter silindris - untuk Distort

Seperti sudah beberapa kali kita singgung, operator Distort memakai pengaturan filter untuk me-resample gambar dengan cara yang sedikit berbeda dari operator Resize. Lebih tepatnya, Distort menerapkan filter memakai jarak 'radial' antara 'titik sampel' dan piksel nyata di dalam area sampling gambar sumber, untuk menentukan bobot tiap piksel dan dengan demikian warna akhir pada titik sampel itu. Resize sebaliknya memproses gambar dua kali memakai filter yang sejajar sumbu. Sekali pada arah X, lalu sekali lagi pada arah Y, sehingga ia terbatas pada resize gambar berbentuk persegi panjang yang sederhana, dan tidak melibatkan pemakaian piksel virtual. Artinya, Distort menerapkan filternya untuk menghasilkan bentuk 'silindris ' alih-alih bentuk 'Box', sehingga memungkinkan distorsi gambar bebas bentuk, termasuk rotasi dan penskalaan yang berubah-ubah (peregangan dan pemampatan) ke arah mana pun, bukan hanya sepanjang sumbu X atau Y. Karena itulah filternya sendiri kerap perlu disetel, atau memang dirancang khusus untuk pemakaian jenis ini.

Filter silindris terinterpolasi

Di sini saya memakai filter 'Box' untuk memperbesar gambar satu piksel sebanyak 30 kali memakai operator Resize dan Distort yang setara.

  magick xc:  -bordercolor black -border 1 \
          -filter Box   -resize 3000%      dot_resize_box_black.png
  magick xc:  -bordercolor black -border 1 \
          -filter Box   +distort SRT 30,0  dot_distort_box_black.png

[IM Output]
Resize | [IM Output]
Distort

Seperti terlihat, ketika filter 'Box' dipakai sebagai filter silindris, yang Anda dapat adalah lingkaran (atau silinder dalam 3 dimensi). Namun karena cara filter itu ditangani, ada beberapa area tempat dua piksel disampel (sama rata) sehingga menghasilkan abu-abu setengah nada yang sempurna. Filter box silindris bisa dibayangkan mengubah gambar sumber menjadi seperangkat piksel bulat yang saling tindih, yang lalu dipadukan (bukan dijumlahkan). Berikut contoh yang lebih berwarna dari hasil pembesaran gambar memakai filter 'Box silindris'… |

  magick \( xc:red   xc:white xc:black +append \) \
          \( xc:blue  xc:lime  xc:white +append \) \
          \( xc:black xc:red   xc:blue  +append \) -append \
          -filter Box   +distort SRT 30,0  color_box_distort.gif

[IM Output]
Pada gambar yang didistorsi, piksel bulat itu ikut terdistorsi menjadi seperangkat elips yang saling tindih. Sebagai contoh… |

  magick \( xc:red   xc:white xc:black +append \) \
          \( xc:blue  xc:lime  xc:white +append \) \
          \( xc:black xc:red   xc:blue  +append \) -append \
          -alpha set -virtual-pixel transparent -filter Box \
          +distort Perspective '0,0 0,0  0,3 0,90 3,0 90,30 3,3 90,60' \
          color_box_distort.png

[IM Output]
| _'Radius' support untuk filter 'Box' silindris dinaikkan dari '0.5' menjadi '0.707' (sqrt(2)/2). Ini menjamin filternya selalu menemukan setidaknya satu piksel sumber di dalam area sampel yang berbentuk lingkaran (secara diagonal). Inilah ukuran support praktis yang minimum untuk filter silindris mana pun.

Tidak ada filter lain yang punya masalah jangkauan seperti ini, yang menuntut kenaikan support._
| _Jika support-nya tidak setidaknya '0.707', bisa muncul area pada gambar Anda tempat filternya 'meleset' dari semua piksel sumber, sehingga menghasilkan kegagalan resampling.

Memakai pengaturan support yang lebih besar juga menghasilkan pola yang menarik. Seiring 'lingkarannya' membesar, makin banyak piksel yang berpadu. Sebagai contoh…_ | |

  magick \( xc:red   xc:white xc:black +append \) \
          \( xc:blue  xc:lime  xc:white +append \) \
          \( xc:black xc:red   xc:blue  +append \) -append \
          -filter Box -define filter:support=0.83 \
          +distort SRT 30,0  color_box_distort_overlap.png

[IM Output]
_Hasilnya semacam bentuk melingkar dariinterpolasi Blend.

Pada support 1.0 atau lebih besar, setiap resample akan berupa perpaduan 'box' atau 'rata-rata' dari setidaknya dua piksel.

_

Berikut perbandingan sejumlah filter interpolasi. Warna abu-abu dipakai supaya lonjakan ke atas dan ke bawah terlihat. Baris atas memakai resize ortogonal, sedangkan baris bawah memakai distorsi silindris.

  for filter in box triangle hermite lagrange catrom
  do
    magick xc:gray80  -bordercolor gray20 -border 2 \
            -filter $filter   -resize 2000%      dot_resize_$filter.png
    magick xc:gray80  -bordercolor gray20 -border 2 \
            -filter $filter   +distort SRT 20,0  dot_distort_$filter.png
  done

[IM Output]
[IM Output]
Box | [IM Output]
[IM Output]
Triangle | [IM Output]
[IM Output]
Hermite | [IM Output]
[IM Output]
Lagrange | [IM Output]
[IM Output]
Catrom

Terlihat bahwa hasilnya mirip, tetapi dengan gaya artefak yang berbeda, baik di dalam maupun di luar (ringing), akibat dua cara berbeda dalam menerapkan filternya. Artefak di bagian dalam terutama kentara pada filter 'Triangle'. Namun ingat, filter interpolasi tidak terlalu bagus untuk pengecilan ekstrem pada gambar yang didistorsi, tetapi sangat bagus untuk pembesaran.

Gaussian silindris

Satu-satunya filter yang tidak memberi perbedaan hasil antara bentuk 'resize' ortogonal dan 'distort' silindris adalah filter istimewa 'Gaussian'… |

  magick xc:red -bordercolor yellow -border 1 \
          -filter Gaussian   +distort SRT 33,0  -normalize  dot_distort.jpg

[IM Output]
Ini sebenarnya salah satu sifat istimewa filter tersebut (dikenal sebagai keterpisahan), dan salah satu alasan mengapa banyak implementasi resampling silindris memakainya sebagai filter default. Ia memang default pada makalah EWA yang asli, tetapi hasilnya juga sangat buram. ImageMagick pun memakainya ketika distort pertama kali diimplementasikan, tetapi tidak lagi sekarang. Sebagaimana pada resize ortogonal, filter 'Gaussian' sama sekali tidak memunculkan artefak aliasing pada gambar hasilnya, bahkan ketika diterapkan pada gambar 'cincin' yang khusus itu. Tetapi ongkosnya adalah hasil yang buram, sekalipun distorsi yang terlibat sedikit atau tidak ada sama sekali. Serupa dengan yang dibahas pada kendali expert Sigma, filter ini juga dapat Anda pakai sebagai semacam filter terinterpolasi. | _Sejak IM v6.6.5-0, IM tidak lagi memakai filter ini secara default untukdistorsi gambar. Sebagai gantinya dipakai filter lain, 'Robidoux', yang dirancang khusus untuk memberi hasil yang lebih tajam.

Bagaimanapun, sebelum versi ini distorsi juga sangat buram karena ada kekeliruan pada implementasinya. Perbaruilah kalau versi Anda lebih lama dan ingin memakai distorsi gambar.

_
| _Sebelum IM v6.6.7-6, IM memakai nilai 'sigma' yang sedikit lebih besar untuk Gaussian silindris, yaitu 1/sqrt(2) atau kira-kira 0.707, alih-alih 1/2. Hasilnya sedikit lebih buram, dan itu dimaksudkan untuk mengurangi kemungkinanartefak aliasing.

Ini kekeliruan yang timbul karena mengikuti anjuran sebuah makalah riset, yaitu meneruskan support yang lebih besar milik filter Box silindris ke filter Gaussian. Alasan yang diajukan adalah bahwa Gaussian pada dasarnya sebuah box yang dikaburkan. Bukan. Gaussian adalah impuls yang dikaburkan, bukan box yang dikaburkan. Versi ini menghapus kekeliruan tersebut, sehingga sekarang Anda semestinya mendapat hasil yang setara baik dengan resize maupun distort ketika filter gaussian dipakai.

Secara pribadi saya merasa memakai nilai sigma yang sedikit lebih besar itu memang menghaluskan artefak 'blocking' di sepanjang tepi diagonal yang beraliasing ketika memperbesar gambar garis. Tetapi itu kasus khusus.

_

Filter silindris Jinc berjendela

[IM Output] Fungsi Jinc() (kadang secara tidak tepat disebut filter 'Bessel') adalah padanan 'Sinc' untuk dipakai pada operasi penapisan silindris. Meski sangat mirip dan berkerabat dekat dengan Sinc() , ia dirancang untuk menapis larik nilai berbentuk persegi panjang memakai jarak radial atau silindris, bukan hanya pada arah ortogonal (sejajar sumbu). Kalau grafik fungsi Jinc() yang disediakan itu dilihat, akan tampak bahwa 'titik potong nol' pertamanya, yang mewakili cincin pertama tetangga terdekat, jatuh di antara nilai 1.0 (untuk tetangga ortogonal) dan akar dua. Yakni, titik potong nol itu bernilai sekitar '1.2196699'. Cara kerja fungsi Jinc() begini: jika titik sampling-nya sama dengan nilai piksel yang nyata, fungsi Jinc() memberi nilai positif kepada piksel tetangga ortogonal yang sedikit lebih dekat, lalu memberi nilai negatif yang sepadan kepada tetangga diagonal yang sedikit lebih jauh, dan seterusnya seiring ia bergerak menjauh melintasi larik nilai 2 dimensi itu. Akibatnya, ketika tidak ada penskalaan (distorsi) yang dilakukan, sumbangan para tetangga itu secara teori saling meniadakan. Itulah sebabnya filter Jinc secara matematis merupakan pemecahan yang lebih disukai untuk resampling silindris atas larik persegi, dan karenanya menjadi filter yang 'ideal' bagi metode resampling elips (EWA) milik Distort. Bukan berarti ia filter yang 'sempurna' dari sudut pandang manusia. Karena itu, memilih filter berjendela mana pun sewaktu memakai operator Distort akan menggantikan fungsi 'Sinc() ' yang biasa dengan fungsi 'Jinc() ' yang setara. Karena titik potong nol fungsi Jinc() berada di posisi yang bukan bilangan bulat, sangat penting untuk menentukan support filternya lewat pengaturan support lobe khusus yang diperkenalkan di atas untuk filter Sinc berjendela. Masalah terbesar dalam memakai filter 'Jinc berjendela' muncul ketika gambar sumbernya mengandung pola hash setingkat piksel (seperti yang dihasilkan "pattern:gray50", lihat Built-In Patterns). Dalam keadaan itu semua tetangga ortogonal berbeda dari tetangga diagonal, sehingga gambarnya menjadi sangat buram akibat fungsi 'Jinc() '. Namun hampir semua pola lain — garis, tepi, sudut — tetap cukup tajam dan jelas ketika filter 'Jinc berjendela' dipakai, sehingga ia tetap fungsi yang bagus. 'Masalah' ini bisa jadi hal yang bagus, sebab artinya filter turunan Jinc silindris 2 dimensi dapat dipakai sebagai cara membuang pola bertipe hash piksel yang kuat dari gambar — misalnya yang dihasilkan dither pengurangan warna — tanpa banyak memengaruhi ketajaman bagian gambar selebihnya. Yakni, ia bisa dipakai sebagai 'metode penghapus dither' (lihat di bawah).

Distort dan filter pada kasus no-op

Idealnya, distorsi no-op mengembalikan gambar yang persis sama. Tetapi seperti terlihat pada contoh sebelumnya, kenyataannya bisa lain. Filter resize (1 dimensi, 2 lintasan) — Lanczos (Sinc-Sinc), Lanczos2, Catrom, Hermite, Triangle, dan banyak filter resize lain — memang punya sifat itu. Pola pikselnya terjaga persis kalau gambarnya tidak diskalakan. Sebaliknya, filter penghalus atau pengabur seperti Gaussian, Cubic, dan Quadratic akan mengaburkan gambar bila diterapkan pada kasus yang nyaris no-op. Perhatikan, bahkan filter resize default, Mitchell-Netravali, juga mengandung sedikit blur, sebab pada dasarnya ia paduan filter penghalus 'Cubic' B-spline dengan filter Catmull-Rom yang setara sinc kubik dua lobe. | _Operator resize secara default akan memintas dirinya sendiri, sehingga tidak melakukan apa pun pada kasus no-op. Karena itu, kecuali Anda menyebutkan filternya secara khusus, resize 'noop' tidak bisa dibangkitkan.

Distort tidak pernah memintas pada kasus no-op, dan itu demi menjamin konsistensi pada animasi yang penskalaan distorsinya mungkin melewati kasus 'no-op'. Hal ini lazimnya bukan persoalan pada resize.

_
Sementara banyak filter resize mempertahankan gambar pada kasus no-op, metode silindris (distort) pada dasarnya tidak pernah menghasilkan distorsi no-op yang sempurna. Distort no-op mana pun setidaknya sedikit mendistorsi warna gambar, walau gambarnya sendiri tidak terdistorsi. Yang terjadi, dengan memakai filter silindris, sumbangan piksel tetangga ortogonal berbeda dari sumbangan piksel tetangga diagonal. Jaraknya dari titik pencarian pada dasarnya memang berbeda (titik itu berpusat di sebuah piksel nyata untuk kasus no-op). Fungsi 'Jinc' berusaha mengurangi distorsi warna ini dengan membuat sumbangan tetangga ortogonal dan tetangga diagonal saling meniadakan. Itu sebenarnya bagian dari definisi matematisnya. Pada kasus terburuk, yaitu 'hash setingkat piksel', setiap piksel tetangga diagonal berbeda dari setiap piksel tetangga ortogonal. Dalam kasus ini bobot filternya justru memperkuat, bukan meniadakan, sumbangan tersebut. Akibatnya, gambar jenis ini cenderung menghasilkan distorsi warna yang sangat parah pada distorsi no-op atas gambar apa pun yang mengandung 'hash setingkat piksel'. Sebagai contoh, di sini saya justru memanfaatkan sifat istimewa itu untuk membuang pola hash dari sebuah gambar. Tidak ada penskalaan yang dipakai, hanya distorsi yang menerapkan 'konvolusi' 2 dimensi pada gambarnya.

  magick -size 100x100 pattern:gray50  hash.png
  magick hash.png -filter Lanczos -distort resize 100% hash_removed.png

| [IM Output] | | [IM Output]

| _Alasan mengapa aras abu-abu hash itu terlihat jauh lebih gelap daripada aras abu-abu hash secara keseluruhan adalah karena cara kerjapersepsi warna manusia.

Perbaikannya adalah menyertakan '-set colorspace RGB' pada perintah di atas untuk memberi tahu IM bahwa kita me-resize dalam ruang warna linear-RGB. Lihat Resize dengan koreksi ruang warna.

_
Yang di atas sebenarnya setara dengan konvolusi memakai fungsi kernel mirip Jinc. Tetapi seperti terlihat, sifat istimewa fungsi Jinc (dalam hal ini EWA Lanczos, alias Jinc berjendela Jinc) benar-benar menghapus pola hash yang tadinya kuat pada gambar aslinya. Satu-satunya bagian yang masih menyisakannya adalah di sepanjang tepi, tempat 'jurang' (tanpa sumbangan piksel virtual) yang mengelilingi gambar itu sendiri dapat memengaruhi hasilnya. Jumlah lobe yang sebenarnya pada filter Jinc berjendela juga sangat menentukan hasilnya. Dengan 2 lobe, 'hash setingkat piksel' cenderung tetap terjaga, walau menjadi tumpul atau buram. |

  magick hash.png -filter Lanczos2 -distort resize 100% hash_2_lobes.png

Sumbangan metode penjendelaan yang diterapkan pada fungsi Jinc juga sangat memengaruhi efek ini. Dalam beberapa kasus ia malah memperkuat pola hash-nya. [IM Output]
Maka muncullah pertanyaan bagaimana menyetel filter distort agar distorsi warna yang dihasilkan filter itu pada distorsi no-op sekecil mungkin. Cara yang dipilih Nicolas Robidoux adalah memilih blur (penskalaan ulang support kernel filter) yang cenderung mempertahankan tepi ortogonal sebisa mungkin.

Filter Lanczos silindris

Nah, seperti dibahas di atas, "Lancoz" biasanya didefinisikan sebagai fungsi 'Sinc() ' yang dipakai baik untuk pembobotan maupun penjendelaan filternya. Tetapi ketika dipakai sebagai filter silindris EWA, KEDUA fungsi pembobotan itu digantikan fungsi 'Jinc() '. Artinya, bukan hanya fungsi pembobotannya yang diganti (seperti pada filter berjendela linear lainnya), tetapi fungsi jendelanya pun ikut diganti, sehingga terbentuk fungsi pembobotan Jinc berjendela Jinc. Jadi 'Lanczos silindris' akan memilih "Jinc berjendela Jinc" dengan jumlah lobe yang sama (default 3). Teknik ini pertama kali dianjurkan Andreas Gustafsson dalam tesisnya tentang Interactive (Local) Image Warping (halaman 24). Ia secara khusus memakai filter Lanczos silindris berlobe 2 (Jinc berjendela Jinc) yang ia namai 'Lanczos2D' (lihat berikutnya). Itu sekadar perluasan yang wajar untuk situasi planar (EWA). Karena itulah namanya sama. Untuk keterangan lebih lanjut lihat pos dalam diskusi BC-splines ini.

Lanczos2 - Lanczos berlobe 2

Demi kemudahan, versi berlobe dua ini, yang cukup dinamai '**Lanczos2**', disertakan dalam IM v6.6.4-10, khusus untuk dipakai pada distorsi. Sebenarnya ia sekadar filter 'Lanczos' silindris (Jinc-Jinc) dengan pengaturan expert 'filter:lobes=2. Lihat grafik di atas; dan karena filter IM otomatis berganti-ganti antara memakai fungsi Sinc() dan Jinc() sesuai keperluan, ia bukan hanya untuk pemakaian '2D' (silindris). Ia dapat dipakai untuk resize juga (sebagai fungsi Sinc-Sinc), walau saya tidak menganjurkannya karena boleh jadi ia agak terlalu kecil, dan praktis menjadi setara dengan berbagai fungsi kubik lainnya.

LanczosSharp - Lanczos yang sedikit ditajamkan

Ternyata teramati bahwa menjendelai fungsi Jinc() membuat hasil distort EWA jauh lebih buram daripada fungsi Sinc() berjendela yang analog pada hasil resize ortogonal (terutama pada garis tipis). Ini terutama terjadi pada distorsi yang ringan. Pada dasarnya fungsi Jinc() punya beberapa sifat istimewa, dan menjendelainya merusak sifat khas yang justru diinginkan itu. Dengan sedikit hitungan, Nicolas Robidoux, guru besar matematika di Laurentian University, berhasil merumuskan versi yang sedikit lebih tajam dari Lanczos silindris berlobe 3, yang kini tersedia sebagai '**LanczosSharp**', dan itu sampai batas tertentu memperbaiki masalah pada distorsi gambar. Namun filter hasilnya masih tetap sangat mengaburkan pola 'hash piksel' tingkat rendah, sebagaimana filter silindris Jinc berjendela pada umumnya.

Lanczos2 yang ditajamkan

[IM Output] Masalah yang sama lebih parah pada filter 'Lanzcos2', jadi Nicolas juga membuat filter '**Lanczos2Sharp**' yang lebih tajam, memakai kendali expert Blur yang sedikit lebih besar. Hasilnya adalah filter yang hanya sedikit sekali mengaburkan garis vertikal atau horizontal pada kasus 'tanpa distort'. Filter yang ditajamkan ini menggeser sedikit titik nolnya, sehingga sekarang letaknya kira-kira di '1.1684'. Kelihatannya tidak seberapa, tetapi itu membuat perbedaan besar pada banyaknya blur yang dihasilkan filter untuk gambar yang distorsinya sedikit atau tidak ada.

Lanczos Radius

[IM Output] Ini filter EWA Lanczos yang dikaburkan (ditajamkan) sedemikian rupa sehingga jumlah lobe yang dipakai (3 secara default) muat ke dalam radius support bilangan bulat. Yakni, EWA Lanczos 3 lobe (berdasarkan Jinc berjendela) ditajamkan agar support-nya tepat berjari-jari 3. Anda dapat memakai kendali expert Lobes untuk mendapatkan hasil yang sama, tetapi karena itu menuntut penyesuaian berdasarkan titik potong nol fungsi Jinc yang sudah diketahui, hitungannya tidak mudah. Nicolas menganjurkan penambahan filter ini supaya Anda tidak perlu melakukan hitungan tersebut, dan bisa mencoba filter yang ditajamkan secara sangat spesifik ini. FUTURE: table of blur factors to the Jinc Windowed Jinc filters.
Include number of lobes as a reference.

Filter silindris Robidoux

[IM Output] Anehnya, percobaan menunjukkan bahwa memakai filter Mitchell-Netravali sebagai filter silindris memberi hasil 'tajam' yang nyaris setara untuk kasus 'tanpa distort'. Padahal filter itu sama sekali tidak ada hubungannya dengan pemakaian sebagai filter silindris, sebab ia dipilih lewat 'studi sosial' untuk penapisan ortogonal (resize). Filter 'Mitchell' terutama bagus dalam mempertahankan pola 'hash piksel' tingkat rendah, yang justru dihancurkan filter Jinc berjendela biasa pada gambar yang difilter secara silindris. Nicolas lalu menemukan, lewat kebetulan yang ganjil, bahwa 'Mitchell' teramat dekat dengan bentuk 'yang ditajamkan' dari filter 'Lanzcos2' yang dibahas di atas. Itu pada gilirannya mendorongnya mengembangkan sebuah filter kubik Keys yang mempertahankan garis vertikal (dan horizontal) dengan sempurna. Filter baru ini pun melakukannya dengan ongkos komputasi yang lebih kecil, sebab fungsi kubik jauh lebih murah dihitung daripada fungsi Jinc. Filter kubik ini ditambahkan ke IM sebagai filter '**Robidoux**' sejak IM v6.6.5-0, dan sekaligus menjadi filter default yang dipakai Distort beserta metode Elliptical Weighted Resampling-nya, khususnya berkat sifatnya yang minim blur untuk gambar yang distorsinya minimal. Bukan berarti ia filter 'terbaik' untuk dipakai — Nicolas sendiri pun suka memakai filter lain — tetapi ia kompromi yang sangat baik, sebagaimana 'Mitchell' adalah kompromi yang baik untuk resize ortogonal (tensor). Filter ini sudah saya tandai pada "peta kubik" yang dihasilkan survei Mitchell-Netravali, supaya terlihat betapa dekatnya ia dengan filter 'Mitchell'. Ia nyatanya bisa menjadi filter yang wajar baik untuk gambar yang di-resize secara ortogonal maupun yang didistorsi secara silindris.

Filter silindris Robidoux Sharp

Filter '**RobidouxSharp**' adalah versi yang sedikit lebih tajam dari filter 'Robidoux', walau sebagian orang merasa hasilnya terlalu tajam. Ia dirancang khusus agar gambar yang mengandung piksel hitam dan putih murni tetap terjaga dengan error sekecil mungkin pada kasus "tanpa distort". Lebih tepatnya, agar bobot piksel tetangga ortogonal persis mengimbangi bobot negatif piksel tetangga diagonal pada kasus 'tanpa distort'. Kebetulan filter 'Mitchell' jatuh hampir tepat di antara filter 'Robidoux' dan filter 'RobidouxSharp', dan ketiganya termasuk keluarga filter kubik Keys. Jadi pengguna dapat memilih salah satu dari ketiga filter itu untuk mengendalikan keburaman-ketajaman hasil pada situasi yang mendekati 'tanpa distort'. Untuk rincian filter ini lihat diskusi BC-splines di Forum IM.

Filter silindris Robidoux Soft

Yang ini ditambahkan jauh belakangan, dan sangat berbeda dari filter silindris lain yang sudah kita lihat. Ya, ia jauh lebih buram supaya lebih berguna untuk memperbesar gambar, sehingga ia dapat menghindari sebagian efek tangga pada foto bangunan bata. Untuk keterangan lebih lanjut lihat pos dalam diskusi BC-splines ini, dan juga diskusi di sebuah forum pemrosesan foto.

Ringkasan filter silindris

Nicolas Robidoux, dalam diskusi forum yang panjang dan masih berlanjut tentang Proper Scaling of a Jinc Filter in EWA, memberi ringkasan filter silindris berikut… Kalau Robidoux terlalu lembut dan RobidouxSharp terlalu beraliasing, saya sarankan Anda mencoba Mitchell (dengan distort Resize), yang kira-kira ada di tengah-tengah.

Karena JPEG melibatkan transformasi kosinus (diskret), saya tidak heran bahwa filter yang berpijak pada pertimbangan Fourier (kelompok Lanczos dkk., baik resize dengan Sinc maupun distort dengan Jinc) umumnya lebih baik daripada yang berpijak pada "hampiran yang bagus atas fungsi mulus" (yang berbasis kubik Keys: Robidoux, Mitchell, RobidouxSharp, CatRom, baik dengan resize maupun distort). Keunggulan itu tampaknya lebih tipis pada PNG (yang tidak merusak informasi lewat ranah Fourier).


Nicolas masih punya banyak hal untuk dikatakan. Begitu banyak sampai ia punya bagiannya sendiri, Resampling oleh Nicolas Robidoux, yang kini menjadi halaman terpisah dan luas tersendiri.

Magic Kernel Sharp 2013 + 2021

Magic Kernel Sharp adalah algoritma resize gambar yang dikembangkan John Costella, awalnya dibuat pada 2013 untuk sebuah proyek di Facebook. Ia mencakup langkah penajaman tiga tap yang mempertegas kejernihan gambar sembari me-resize, sehingga ia cepat sekaligus efisien. Versi ini dipakai Facebook untuk resize gambar di sisi server sejak dikembangkan. Pada 2021, Costella menyempurnakan Magic Kernel Sharp demi meningkatkan ketelitiannya, memberi presisi setidaknya sembilan bit dan lebih memenuhi kebutuhan penajaman. Versi yang diperbarui ini terus dipakai Facebook, Instagram, dan aplikasi lain seperti mesin resize pica dan pemampat gambar RedKetchup, sehingga hasil resize-nya tetap bermutu tinggi dan sangat setia pada gambar aslinya.


Kendali expert filter

Pada berbagai bagian di atas saya memperkenalkan banyak sekali kendali 'expert' khusus, yang memungkinkan Anda memodifikasi berbagai filter dengan berbagai cara. Pengaturan expert ini didefinisikan lewat pengaturan Define global (atau opsi Set yang setara). Ringkasan lengkap semua opsi expert ada di halaman rujukan opsi baris perintah IM untuk "-filter". Pengaturan "-filter" nyatanya hanya dipakai untuk menengok dan menyetel kendali expert itu secara tepat sehingga filter resize 'bernama' yang diminta terdefinisi. Pengaturan ini menimpa nilai default yang disebutkan di atas, pada saat filternya disiapkan untuk operasi pemrosesan gambar resize atau distorsi tertentu. Pengaturan "-filter" 'Point' sama sekali memintas seluruh penyiapan filter di atas, dan merosot menjadi pencarian langsung 'Nearest Neighbor' tanpa penskalaan (resize), atau pencarian terinterpolasi (distort). Jadi pengaturan filter bernama ini praktis mematikan sama sekali filter pencarian gambar yang diskalakan.
Nah, walaupun semuanya tersedia, saya ingin menyampaikan satu hal terakhir.

Kecuali Anda seorang pakar (atau sekadar bermain-main) -- lebih baik JANGAN memakainya!

Hanya sedikit orang yang benar-benar pakar dalam pemrosesan gambar, dan kecuali Anda tahu persis apa yang dilakukan filter serta bagaimana mengubahnya memengaruhi metode penapisan, yang paling mungkin terjadi justru rusaknya keampuhan pemrosesan gambar Anda dan menghasilkan tampilan yang buruk. Terutama pada gambar selain kasus uji Anda sendiri. Bukan berarti pengguna tidak boleh memakainya, dan banyak Contoh IM memang memakainya, tetapi biasanya untuk memberi efek khusus tertentu. Ketika sebuah opsi khusus dipakai, alasan pemakaiannya juga dijelaskan, dan sebaiknya Anda berpegang pada resep yang diberikan untuk efek tersebut. Tentu saja Anda dipersilakan memakainya, dan dengannya bisa dihasilkan efek yang sangat menarik dan luar biasa tidak lazim.

Kendali filter 'verbose'

Pengaturan "filter:verbose" boleh jadi sahabat terbaik Anda dalam memahami dan mengurai kendali filter yang lain. Misalnya, Anda dapat memastikan bahwa filter Lanczos didefinisikan sebagai Sinc berjendela Sinc dengan support 3.

  magick null: -filter Lanczos -define filter:verbose=1 \
          -resize 2    null:    | grep '^#'

[IM Text]

Perhatikan bahwa di dalamnya filter Lanczos didefinisikan lewat fungsi 'SincFast' (4 lobe), yaitu padanan polinomial yang cepat, alih-alih fungsi 'Sinc' penuh yang didefinisikan lewat fungsi pustaka trigonometri yang jauh lebih berat secara komputasi. Di sini kita melihat bahwa filter Lanczos didefinisikan sebagai filter Jinc berjendela Jinc ketika dipakai sebagai filter "-distort" silindris (algoritma EWA).

  magick null: -filter Lanczos -define filter:verbose=1 \
          -distort SRT 0   null:   | grep '^#'

[IM Text]

Pengaturan 'filter:verbose' adalah satu-satunya cara bagi pengguna untuk memeriksa persis seperti apa filter akhirnya, mengingat berbagai pengaturan expert yang dipakai. Setelah tajuk pengaturan filter yang dikomentari dengan '#', dikembalikan pula seperangkat titik data yang dibangkitkan filter tersebut. Titik data itu memang disediakan untuk menggrafikkan data filternya, dan memungkinkan Anda memastikan serta memeriksa lebih jauh apa yang dihasilkan filter itu tanpa menerka-nerka dari hasil gambar uji. Sebagai contoh, mari kita tarik data filter Sinc berjendela Welch…

  magick null: -filter Welch -define filter:verbose=1 \
          -resize 2 null:  > filter_welch.dat

Atau fungsi jendela Welch mentah yang dipakai di atas, dengan fungsi jendelanya diskalakan ke rentang support 0 sampai 1.

  magick null: -define filter:filter=Box \
                -define filter:window=Welch \
                -define filter:support=1.0 \
                -define filter:verbose=1 \
           -resize 2 null:  > window_welch.dat

Data itu lalu dapat Anda plot dengan perintah "gnuplot" (seperti yang saya lakukan di filter Sinc berjendela di atas)…

  gnuplot
    set grid
    plot "window_welch.dat" with lines

Contoh lain kendali expert filter

Membuat filter 'Sinc mentah berlobe 8' dapat diatur dengan…

  -define filter:filter=Sinc
  -define filter:lobes=8

Memakai fungsi jendela Blackman langsung sebagai filter (seperti yang keliru dilakukan IM sebelum v6.3.6-3).

  -define filter:filter=Blackman
  -define filter:support=4.0

Fungsi jendela secara default adalah 'Box' kalau tidak didefinisikan. Fungsi jendela 'Box' membuat fungsi filter dasarnya tidak dijendelai sama sekali. Misalnya, filter 'Gaussian' secara default memakai fungsi jendela 'Box'. Satu-satunya pengaruh fungsi jendela box adalah pemotongan area fungsi yang dijendelai. Lihat kendali expert support filter di atas. Paksakan pemakaian fungsi Jinc mentah (dengan menetapkan penjendelaan 'Box' secara eksplisit) dengan…

  -define filter:filter=Jinc
  -define filter:window=Box
  -define filter:lobes=3

Filter 'Lanczos' berjendela berlobe 12 yang dipotong hanya sampai 8 lobe pertama dari filter berjendela hasilnya…

  -filter Lanczos
  -define filter:win-support=12
  -define filter:support=8

Ini membuatnya kira-kira empat kali lebih cepat, dengan mengabaikan (pemotongan support pada 8) 'ekor' termodulasi jendela (sampai 12) dari filter windowed-sinc hasilnya. Namun hal ini bisa memunculkan sedikit artefak tambahan yang kecil akibat pemotongan support itu. Memakai Gaussian untuk 'mengaburkan' gambar! Ini setara dengan operasi -gaussian 5x2, tetapi lewat distort no-op!

  -filter Gaussian
  -define filter:sigma=2
  -define filter:support=5
  -distort SRT 0

Catatan: Anda tidak dapat memakai -resize untuk ini, sebab ia mungkin memintas operasinya sehingga operasinya sama sekali tidak dijalankan. Membuat filter lain dari survei 'Mitchell-Netravali'.

  -filter Cubic
  -define filter:b=0.5
  -define filter:c=0.5

Membuat filter 'kubik Keys' Anda sendiri dengan nilai α 0.4…

  -filter Cubic
  -define filter:c=0.4

Nicholas Robidoux membuat filter aneh ini sewaktu menjelajahi 'Interpolating EWA Filters'

  -define filter:blur=.7071067811865475
  -define filter:c=.49257366
  -define filter:b=2.089813051319261
  -filter Cubic

Ketika dipakai untuk memperbesar gambar, piksel diubah menjadi pola mirip belah ketupat, dengan skema yang serupa Blend tetapi memakai belah ketupat alih-alih persegi. Pemakaian opsi expert apa pun adalah risiko Anda sendiri. Opsi itu tidak dimaksudkan untuk pemakaian produksi, melainkan sebagai cara menjelajahi atau menghasilkan fungsi resize yang rumit atau yang mustahil dilakukan dengan cara lain. Pakailah dengan risiko Anda sendiri!

Ringkasan filter resize

Berikut pandangan pribadi saya setelah mempelajari, mengodekan ulang, dan mendokumentasikan semua filter di atas yang tersedia di ImageMagick. Kalau menurut Anda saya keliru, atau ingin menyampaikan pendapat, silakan kemukakan pandangan Anda di forum IM, dan undang saya untuk menanggapi. Filter interpolasi, seperti 'Hermite', ideal untuk memperbesar gambar besar-besaran, dan memberi blur yang minimal pada hasil akhirnya, walau keluarannya kerap masih bisa ditajamkan secara buatan pada pascapemrosesan. Filter blur mirip Gaussian, seperti 'Mitchell', paling cocok untuk gambar yang pada dasarnya berupa gambar garis dan gambar bergaya kartun. Efek blurring versus aliasing yang ditimbulkan filter pada gambar dapat Anda kendalikan lewat pengaturan Filter Blur yang khusus itu. Filter Sinc/Jinc berjendela dan padanan Lagrange-nya adalah filter terbaik untuk gambar dunia nyata, terutama saat mengecilkan gambar. Semuanya sangat mirip dalam hasil dasarnya. Support yang lebih besar, atau lebih baik lagi pengaturan jumlah lobe, umumnya memberi hasil yang lebih bagus lagi, walau efek ringing-nya bisa bertambah pula, dengan ongkos penghitungan yang lebih tinggi. Filter kubik adalah campur aduk filter yang cepat dan sederhana, dengan support tetap (biasanya 2.0), yang menghasilkan segala macam: dari filter interpolasi mulus 'Hermite', 'Mitchell' yang dinilai secara kualitatif untuk pembesaran gambar, filter 'Spline' yang sangat buram bergaya Gaussian, sampai filter tajam bertipe windowed-sinc lewat 'Catrom'. Umumnya, kalau hasil resize-nya sudah bisa diterima apa adanya, biarkan saja, sebab Anda lebih mungkin memperburuk daripada memperbaikinya.

Perbandingan filter

Pembesaran… Sebagai perbandingan terakhir, di sini saya sajikan pilihan 12 filter resize yang mewakili. Gambarnya adalah pembesaran dari sebuah anak tangga beraliasing pada garis selebar satu piksel, di atas latar belakang abu-abu gelap. Gambar aslinya sendiri sudah 'beraliasing', jadi Anda semestinya bisa melihat seberapa baik berbagai filter itu menghilangkan efek aliasing yang sudah ada.

  magick -size 10x6 xc:grey20 +antialias -draw 'fill white line 4,0 5,5' \
          -filter {_filter_type_} -resize 100x   {_result_}

[IM Output]

Yang di atas dimulai dari filter terinterpolasi lalu berlanjut ke filter blur Gaussian, yang memperlihatkan seberapa banyak blur yang dihasilkan filter tersebut, dan dengan begitu menghilangkan 'aliasing' pada gambar aslinya. Filter itu tidak memunculkan ringing sama sekali. Baris kedua dimulai dengan tiga filter Sinc berjendela yang memperlihatkan efek ringing berat yang bisa ditimbulkannya. Ingat, filter ini sebenarnya dirancang untuk mengecilkan gambar, bukan memperbesar. Lalu berlanjut ke 'Lagrange' dengan pengaturan 'interpolasi' defaultnya, dan filter kubik terinterpolasi 'Catrom'. Gambar terakhir adalah filter 'Mitchell', yang memperlihatkan apa yang secara subjektif disepakati para 'pakar' sebagai filter 'ideal' terbaik untuk memperbesar gambar, dengan keempat artefak resampling tampil seminimal mungkin pada hasil akhirnya. Saya sendiri sependapat dengan temuan mereka, tetapi hanya untuk pembesaran. Itulah sebabnya 'Mitchell' adalah filter 'pembesaran' default yang dipakai IM. Pengecilan… Untuk mendapat gambaran tentang efek aliasing, di sini saya mengecilkan potongan gambar cincin besar yang kita buat tadi (berukuran 105x105 piksel), untuk melihat efek Moiré macam apa yang dihasilkan masing-masing dari 12 filter perwakilan yang sama.

  magick rings_crop.png -filter {_filter_type_} -resize 100x {_result_}

[IM Output]

Seperti terlihat, filter terinterpolasi menghasilkan efek moiré yang sangat beraliasing, yang timbul sebagai efek samping artefak blocking yang dihasilkannya. Sebaliknya, artefak blur dari filter blur Gaussian menghapus semua efek Moiré blocking itu dari gambar hasilnya, walau gambarnya jadi buram secara menyeluruh (garisnya tak jelas). Filter 'Gaussian' sendiri memang memperlihatkan efek aliasing yang nyaris tak kentara, akibat filternya yang tak hingga (IIR) dipotong oleh pengaturan support filter, tetapi itu sangat kecil. Sebaliknya lagi, filter Sinc berjendela menghasilkan gambar yang tampak sangat tajam dengan efek moiré melingkar, dengan intensitas yang kurang lebih sama pada ketiga filter perwakilannya. Ini disebabkan artefak ringing yang dihasilkan filter tersebut, yang memunculkan pola interferensi. Terakhir, filter kubik juga memperlihatkan sedikit efek moiré yang sangat samar, tetapi semata-mata karena ringing dari lobe negatifnya. Filter 'Mitchell' menghasilkan efek ringing paling sedikit. Perhatikan, 'Mitchell' memang memunculkan efek yang sangat kecil dari hampir semua artefak resize. Yakni: moiré berpola kisi — aliasing/blocking, moiré melingkar — ringing, dan blur pada garisnya. Namun semua artefak itu ada pada tingkat yang sangat minimal, dan itulah sebabnya ia filter serbaguna yang bagus. Berikut perbandingan lain, tetapi kali ini mengecilkan gambar cincin yang lebih kecil besar-besaran.

  magick rings_sm_orig.gif -filter {_filter_type_} -resize 100x {_result_}

[IM Output]

Seperti terlihat, filter terinterpolasi menghasilkan banyak artefak aliasing, sedangkan filter blur Gaussian cenderung mengaburkan lebih banyak garis daripada yang lain. Tetapi semua filter selebihnya cenderung memberi hasil yang wajar.

Filter terbaik?

Yang itu harus Anda putuskan sendiri. Namun sering kali jawabannya bergantung pada jenis gambar dan jenis resize yang sedang Anda kerjakan. Untuk memperbesar gambar, 'Mitchell' boleh jadi filter terbaik yang bisa dipakai, sementara pada dasarnya filter berjendela mana pun (defaultnya 'Lanczos') bagus untuk mengecilkan gambar, terutama bila ada semacam pola tingkat rendah yang terlibat. Namun jika tidak ada pola sama sekali tetapi banyak tepi lurus (misalnya transparansi GIF), Anda mungkin lebih baik memakai filter Gaussian yang ditajamkan atau lagi-lagi 'Mitchell', demi menghindari efek ringing yang kuat. Filter 'Lagrange' juga cukup bagus untuk mengecilkan gambar, terutama dengan pengaturan support filter yang lebih besar. Bagi yang tertarik, saya anjurkan menengok topik diskusi pengguna IM a way to compare image quality after a resize?, yang pada dasarnya memperlihatkan bahwa tidak ada cara menentukan "filter terbaik" secara kuantitatif — yang ada hanya "filter terbaik" yang kualitatif atau subjektif. Pilihan ada di tangan Anda, dan pilihan adalah salah satu ciri utama ImageMagick.

Filter default IM…

Karena alasan-alasan itulah 'Mitchell' menjadi filter default untuk pembesaran, sekaligus untuk pengecilan gambar yang melibatkan transparansi, atau gambar yang mengandung palet (atau colormap). Namun 'Lanczos' dipakai untuk semua kasus lain, yaitu pengecilan gambar biasa (umumnya foto). Untuk Distort, pengaturan filternya berdefault ke filter 'Robidoux', yang dirancang khusus untuk meminimalkan blur gambar ketika sebenarnya tidak ada distorsi yang terjadi. Tentu saja pilihan ini dapat Anda timpa.

Nicolas Robidoux

Nicolas Robidoux adalah pakar pemrosesan gambar yang punya jauh lebih banyak hal untuk dikatakan dan dianjurkan tentang upaya mendapatkan hasil terbaik dari resize gambar Anda. Begitu banyak sampai ia punya bagiannya sendiri…
Resampling oleh Nicolas Robidoux.