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

Contoh penggunaan ImageMagick -- mask

Kata pengantar dan indeks contoh penggunaan ImageMagick
Kanal alpha (matte)

(sedang dikerjakan) Dalam contoh-contoh ini kita melihat penanganan khusus untuk transparansi, kanal transparansi, penggunaan mask, dan pada akhirnya penghapusan latar belakang yang tidak diinginkan, atau elemen lain seperti papan tanda, teks, dan spam.


Kanal alpha

Kanal transparansi (alpha) sebuah gambar sepenuhnya opsional, dan sering memerlukan penanganan khusus yang terpisah dari kanal 'warna' biasa. Lihat Ruang warna gambar di atas. Keberadaan kanal transparansi juga dapat memengaruhi cara berbagai operator memperlakukan kanal warna lainnya, umumnya karena warna yang sepenuhnya transparan sering kali harus diabaikan sama sekali oleh sebuah operasi. Kalau tidak begitu, muncul 'halo hitam' di sekeliling gambar, seperti yang terlihat pada bug besar IM di masa-masa awal IM v6. Misalnya bug halo pada resize dan bug blur dengan transparansi. Lebih runyam lagi, kanal ini kadang juga disebut kanal 'transparency' atau 'opacity' gambar, atau bahkan 'mask' gambar. Semuanya merujuk pada kanal keempat yang khusus dan sama dari gambar tersebut. [IM Output] Untuk menjelaskan perbedaannya kita perlu gambar contoh, dan untuk itu saya akan memakai gambar PNG 'bulan sabit' (dari contoh Komposisi CopyOpacity). Seperti yang terlihat, gambar ini punya banyak area yang sepenuhnya transparan. Bukan hanya itu, saya perlu menyimpan gambar ini dalam format 'PNG', salah satu dari sedikit format gambar yang benar-benar memahami dan menangani warna transparan dan semitransparan. Saya bisa memperagakan transparansi ini dengan menumpangkan gambar tersebut ke pola papan catur bawaan IM, menggunakan Komposisi alpha. |

    magick composite -compose Dst_Over -tile pattern:checkerboard \
              moon.png  moon_background.jpg

[IM Output]

Kanal alpha internal

Secara internal IM v7 menyimpan informasi transparansi dalam kanal 'alpha', yang sama seperti kanal warna hanyalah gambar grayscale biasa berisi nilai-nilai yang berkisar dari putih untuk sepenuhnya transparan (atau bening), sampai hitam untuk sepenuhnya buram. Kira-kira seperti yang terlihat kalau kita memandang siluet dari gambar aslinya. Operator tingkat rendah seperti "-level" dan "-threshold" menangani data ini sebagai alpha. Periksa referensi opsi resmi jika belum yakin.


Dibuat: 10 Desember 2003 (semula 'channels')
Diperbarui: 2 Oktober 2018
Penulis: Anthony Thyssen, Anthony.Thyssen@gmail.com
Contoh dibuat dengan: [version image]
URL: https://usage.imagemagick.org/masking/

Berikut cara yang sangat lama untuk mengekstrak nilai transparansi 'alpha' dari sebuah gambar. Cara ini menyimpan kanal transparansi sebagai format file gambar 'alpha', dan memerlukan dua langkah serta perintah terpisah untuk menentukan format file gambar yang tepat. | |

  magick moon.png alpha:moon.matte

  magick MIFF:moon.alpha moon_matte2.png

  # You can join those two steps in a pipeline as well...
  magick moon.png alpha:- | magick - moon_matte3.png

[IM Output]
Teknik mengekstrak 'alpha' gambar seperti ini lazim ketika IM v5 masih dipakai. Pada dasarnya itu satu-satunya metode yang tersedia untuk mengakses transparansi sebuah gambar. Sekarang cara ini sudah sangat jarang digunakan.

Mengendalikan transparansi gambar

Ada dua operator yang memberi kendali tingkat rendah atas kanal transparansi gambar di memori. Metode operator yang lebih baru "-alpha" kini menjadi cara kendali yang direkomendasikan, meskipun banyak contoh IM masih menampilkan dan memakai operator lama "-matte". Sebuah gambar bukan hanya bisa memiliki data kanal alpha, tetapi juga punya 'sakelar' yang menentukan apakah data kanal itu terlihat atau berlaku. Artinya gambar bisa berada dalam tiga keadaan sehubungan dengan kanal alpha. Sakelar Data kanal
alpha off tidak ada data alpha (memori belum dialokasikan)
alpha deactivate data alpha lama ada (tetapi tidak dipakai)
alpha on data alpha yang sedang dipakai
Ini perlu diingat karena perilaku berbagai metode bergantung pada keadaan mana dari tiga di atas yang sedang berlaku pada gambar. Jika 'sakelar' dalam keadaan off, operator tidak akan menyentuh data alpha, karena bisa jadi data itu memang tidak ada sama sekali. Dalam kasus seperti itu data alpha lama bisa saja masih ada, tak termodifikasi, dan karenanya kedaluwarsa. Seperti yang akan kita lihat, ini justru kadang berguna dalam situasi tertentu. Namun perhatikan bahwa beberapa operator dapat menyalakan atau mematikan sakelar alpha secara otomatis karena satu dan lain alasan. Misalnya, "-compose CopyOpacity -composite" akan selalu menyalakan kanal alpha pada gambar hasil, karena tugas operator itu memang menyalin data ke dalam kanal alpha. Dengan demikian kanal itu harus ada pada hasil akhir. Namun keberadaannya pada data masukan bisa membawa konsekuensi lain. Lihat Metode komposisi Copy_Opacity untuk perinciannya. Demikian pula membuat kanvas dengan warna 'None' juga akan otomatis membuat dan mengaktifkan kanal transparansi, demi memastikan gambar kosong itu benar-benar transparan. Sebaliknya, membuat kanvas dengan suatu nama warna lain umumnya tidak akan membuat kanal transparansi apa pun, karena gambar secara default buram.
Berikut berbagai metode "-alpha" beserta contoh bagaimana mereka memengaruhi gambar dan transparansinya.

Alpha Off atau "-alpha off"

Ini sekadar sakelar sederhana pada gambar, yang mematikan segala efek transparansi terhadap gambar. Ia tidak benar-benar menghapus atau memusnahkan kanal alpha yang melekat pada gambar, hanya mematikan efek kanal itu terhadap gambar. Demikian pula tidak ada operator yang akan memengaruhi kanal alpha terlampir selagi kanal itu dimatikan. Sebagai contoh, mari kita pakai gambar 'bulan sabit' (dari contoh Komposisi CopyOpacity), dan cukup matikan kanal alpha gambarnya.

  magick moon.png  -alpha off     alpha_off.png

[IM Output] [IM Output]

Perhatikan bahwa bentuk bulannya lenyap sama sekali ketika transparansi dimatikan, meskipun sebenarnya itu jarang terjadi. Pada dasarnya area yang 'transparan' pun punya warna, hanya saja biasanya tidak terlihat; dalam kasus ini warna tersembunyinya adalah gambar kanvas fraktal yang dulu dipakai untuk membuat gambar bulan itu. Warna tersembunyi ini bisa apa saja, dari sekadar warna transparansi GIF yang dipakai format GIF untuk merepresentasikan transparansi dalam tabel warnanya, sampai warna sampah yang tertinggal saat pembuatan gambar, seperti di atas. Yang lebih umum, warna transparansi itu sekadar hitam murni untuk piksel mana pun yang sepenuhnya transparan. Perhatikan bahwa piksel di dekat tepi bisa jadi semitransparan, sehingga masih punya warna valid yang hanya terlihat sebagian. Operasi "-alpha Off" di atas hanya akan 'menonaktifkan' atau 'mematikan' kanal tersebut. Data transparansinya sendiri tidak dibersihkan atau dibuang dari data gambar yang tersimpan di memori. Ia masih ada, hanya tak tersedia untuk sementara. Tapi... Jika gambar disimpan selagi data transparansi dimatikan, tidak ada data transparansi yang akan ikut tersimpan ke dalam format file gambar. Dengan demikian data alpha yang dimatikan itu tidak ada dalam salinan gambar yang tersimpan, meskipun masih ada (hanya dimatikan) dalam versi di memori. Selain itu, karena banyak format file tidak mengizinkan transparansi (seperti JPEG), format-format itu otomatis melakukan hal yang setara dengan "-alpha Off" saat gambar disimpan (tanpa benar-benar melakukannya). Umumnya ini membuat semua area transparan menjadi hitam saat disimpan sebagai gambar JPEG. Lihat Alpha Remove - menghapus transparansi di bawah untuk cara yang benar menghapus transparansi sebelum menyimpan ke format file JPEG. Operator "+alpha" adalah perintah lama yang persis sama dengan "-alpha Off". Yaitu sekadar mematikan kanal transparansi. Perhatikan bahwa mematikan alpha sering kali diperlukan sebelum memakai gambar mask grayscale dengan metode komposisi alpha CopyOpacity. Jika tidak, operator komposisi akan menyalin transparansi yang aktif (kanal opacity) alih-alih memakai warna grayscale yang dimaksud.

Alpha Set atau "-alpha set"

Metode alpha 'Set' sama dengan opsi lama "-alpha on". Ia memastikan gambar memiliki kanal 'transparency' alias alpha, tetapi jika kanal itu belum ada atau sedang dimatikan, kanal itu diinisialisasi menjadi sepenuhnya buram (lihat metode Alpha Opaque di bawah). Namun jika gambar sudah punya kanal alpha yang ada dan aktif, ia tidak berbuat apa-apa. Dengan kata lain operator ini memastikan kanal alpha ada, tanpa mengubah penampilan gambar sebagaimana adanya di memori saat itu. Karena itu, berdiri sendiri operator ini tidak memperlihatkan perubahan apa pun pada gambar, tetapi punya efek nyata bila digabungkan dengan operator lain. Jadi jika kanal alpha dimatikan dengan Alpha Off, lalu diaktifkan lagi dengan Alpha Set, gambar akan punya kanal alpha, tetapi sepenuhnya buram, persis seperti penampilan gambar ketika operasi 'Set' diminta. |

  magick moon.png  -alpha off    -alpha set    alpha_set.png

[IM Output]
Jika diterapkan pada gambar yang kanal alpha-nya aktif, tidak ada perubahan yang dibuat. |

  magick moon.png  -alpha set    alpha_noset.png

[IM Output]
Singkatnya, operator ini seharusnya tidak pernah mengubah penampilan gambar pada saat operator diterapkan. Ia hanya memastikan kanal alpha tertata sedemikian sehingga gambar dibiarkan apa adanya. Ini biasanya dipakai setelah membaca gambar dari format file gambar atau sumber masukan yang tidak diketahui, yang mungkin punya kanal alpha, mungkin juga tidak. Operator ini lalu memastikan gambar itu memang punya kanal alpha (untuk format gambar seperti JPEG), tetapi membiarkan kanal alpha yang sudah ada dan aktif apa adanya (misalnya untuk format GIF atau PNG). Inilah cara yang direkomendasikan untuk memastikan sebuah gambar punya kanal alpha setelah dibaca ke memori, atau yang lebih penting, setelah gambar diproses dan kita ingin mengaktifkan kembali kanal alpha yang bersih.

Alpha On

"-alpha On" adalah kebalikan persis dari metode Alpha Off yang baru saja dibahas. Biasanya ini terlalu sederhana untuk tujuan yang diinginkan, sehingga seharusnya SANGAT jarang dipakai. Gunakan "-alpha Set" di hampir semua kasus. Pada dasarnya metode 'On' hanya membalik sakelar sehingga data transparansi gambar terlihat lagi. Data transparansi yang sudah ada tidak diubah, jadi jika gambar di memori masih menyimpan data kanal alpha lama, data itu akan mendadak terlihat lagi. Sebagai contoh, di sini kita matikan ('Off') data transparansi, lalu langsung nyalakan lagi ('On'), sehingga gambar asli muncul kembali. |

  magick moon.png  -alpha off  -alpha on    alpha_on.png

[IM Output]
Namun jika gambar belum punya data alpha sebelumnya, ia akan menginisialisasinya menjadi sepenuhnya buram. Itu memang hal yang logis untuk dilakukan. Karena itu untuk gambar baru yang baru saja dibaca ke memori, ia setara dengan Alpha Set, tetapi jangan dipakai untuk tujuan itu. Satu-satunya saat Alpha On patut dipakai adalah ketika sebelumnya Anda sengaja mematikan alpha karena suatu alasan, dan kini ingin memulihkan data itu. Misalnya mematikan lalu menyalakan kanal alpha dapat dipakai untuk mengawetkan data kanal alpha sebelum menerapkan operator yang sangat spesifik, seperti "-shade". Untuk contoh penggunaan khusus ini lihat Gambar bentuk ter-shade.

Alpha Activate/Deactivate

masing-masing mengaktifkan dan menonaktifkan kanal alpha, secara persisten. Ini seperti on/off pada Imagemagick 6. Pada Imagemagick 7, -alpha off menghapus kanal alpha secara permanen sehingga -alpha on tidak akan mengaktifkannya kembali.

Alpha Discrete

memperlakukan kanal alpha secara independen (tanpa pembauran).

Alpha Opaque

Metode ini bukan hanya memastikan kanal alpha 'aktif', tetapi juga sepenuhnya buram, terlepas dari apakah transparansi gambar sedang 'activated/on' ataupun 'deactivated/off'. Sebagai contoh...

|

  magick moon.png  -alpha opaque    alpha_opaque.png

[IM Output]
Pada versi IM yang lebih lama, ini setara dengan memakai "-alpha off" untuk mematikan kanal alpha, lalu "-alpha on" untuk menyalakannya sambil menyetel ulang menjadi buram. |

  magick moon.png  -alpha off -alpha on  alpha_opaque_matte.png

[IM Output]
'Bentuk' asli gambar tidak lagi bisa dipulihkan setelah operasi ini karena data kanal alpha aslinya sudah tertimpa. Tentu saja itu juga setara dengan memakai "-alpha off -alpha set", meskipun dalam kasus itu lebih baik langsung pakai "-alpha opaque" saja.

Alpha Transparent

Serupa dengan itu, metode ini memastikan kanal alpha 'aktif' tetapi juga sepenuhnya transparan. |

  magick moon.png  -alpha transparent    alpha_transparent.png

[IM Output]
Data warna gambar masih ada, jadi mematikan transparansi sesudahnya akan kembali menampilkan warna-warna gambar yang tersimpan. |

  magick moon.png  -alpha transparent  -alpha off  alpha_transparent_off.png

[IM Output]
Tentu saja 'bentuk' asli gambar sebenarnya sudah musnah, sehingga tidak bisa lagi dipulihkan setelah operasi ini. Cara lain membuat gambar sepenuhnya transparan disajikan di Kanvas transparan.

Alpha Extract

Metode 'Extract' sekadar menyalin mask 'alpha' gambar sebagai mask kanal grayscale.

  magick moon.png  -alpha extract    alpha_extract.png

[IM Output] [IM Output]

Perhatikan bahwa sepenuhnya buram berarti putih, sedangkan sepenuhnya transparan berarti hitam murni. Karena gambar mengandung sejumlah piksel semitransparan di sepanjang tepinya (untuk anti-aliasing yang membuat bentuk gambar tampak lebih mulus), gambar ini tidak murni hitam-putih, tetapi juga berisi sejumlah piksel abu-abu di sekitar tepinya. Jika ImageMagick Anda adalah versi IMv7 yang lama, berikut teknik yang (nyaris) setara, memakai ekstraksi kanal.

  magick moon.png  -channel a -separate +channel -negate alpha_extract.png

Metode 'Extract' juga akan mematikan ('Off') alpha, tetapi tidak membersihkannya, jadi menyalakan kembali kanal alpha ('On') akan menciptakan ulang mask bentuk dari gambar asli. |

  magick moon.png  -alpha extract -alpha on   alpha_extract_on.png

[IM Output]
Perhatikan bahwa semua warna asli sudah tergantikan oleh putih dengan berbagai gradasi abu-abu di sekitar tepi. Kita bisa melihatnya jika transparansi dihapus dengan latar belakang putih (lihat metode Alpha Remove di bawah) |

  magick alpha_extract_on.png -background white -alpha remove alpha_edge.png

[IM Output]
Piksel 'abu-abu' ini justru dimanfaatkan dengan baik di Garis tepi dari bentuk ter-anti-alias untuk menghasilkan tepi atau garis luar yang mulus dari bentuk sebuah gambar. Efek samping penyimpanan kanal alpha ini punya manfaat khusus saat memakai operator Shade, yang tidak memahami ataupun memakai kanal alpha gambar. Lihat sub-bagian Me-mask bentuk ter-shade.

Alpha Copy

Metode 'Copy' adalah kebalikan dari 'Extract', dan pada dasarnya melakukan CopyOpacity terhadap dirinya sendiri. Yakni, ia mengubah gambar grayscale (terlepas dari aktif-tidaknya kanal alpha) menjadi gambar mask bentuk.

  magick alpha_extract.png  -alpha copy   alpha_copy.png

[IM Output] [IM Output]

Tidak jadi soal apakah gambar sudah punya kanal alpha atau belum; yang dilakukannya hanyalah membuat transparansi gambar dari nilai grayscale gambar itu. Begitu mask bentuk sudah ada, berbagai metode pewarnaan atau komposisi alpha Duff-Porter bisa dipakai untuk mewarnainya. Untuk contoh pemakaian mask bentuk lihat Mask sebagai bentuk berwarna.

Alpha Shape

Agar gambar grayscale lebih mudah dimanfaatkan, metode 'Shape' bukan hanya membuat mask bentuk (seperti Alpha Extract), tetapi juga mewarnainya dengan warna latar belakang saat itu.

  magick alpha_extract.png -background Yellow -alpha shape   alpha_shape.png

[IM Output] [IM Output]

Artinya Anda bisa sangat cepat mewarnai mask grayscale cukup dengan membentuk (shape) gambarnya, lalu meratakannya (flatten) ke warna latar belakang yang berbeda |

  magick alpha_extract.png -background Yellow -alpha shape \
                            -background Blue   -alpha remove alpha_colormask.png

[IM Output]
| Background sebenarnya bukan warna yang tepat untuk dipakai pada operasi pewarnaan 'shape' ini. Semestinya yang dipakai adalah warna 'fill' untuk menentukan warna latar depan bentuk. Karena itu warna mana yang dipakai kemungkinan akan berubah. Background dipakai hanya karena kesulitan internal dalam mengakses warna fill saat itu. Perubahan ini kemungkinan terjadi sebagai bagian dari IMv7.
Tentu saja cara yang lebih cepat dan lebih baik untuk memetakan gambar hitam-putih langsung ke warna tertentu adalah memakai penyesuaian level dengan warna yang lebih terspesialisasi. Ini menghindarkan kebutuhan mengaktifkan atau bahkan mengubah kanal transparansi gambar yang ada. |

  magick alpha_extract.png  +level-colors Blue,Yellow   level_color.png

[IM Output]
| Perintah di atas memetakan warna memakai ruang warna linear, dan mungkin perlu dikonversi ke sRGB pada suatu titik untuk mendapatkan gradasi warna yang lebih tepat secara visual.

Alpha Remove

Metode "-alpha **Remove**" (ditambahkan pada IMv6.7.5) dirancang untuk menghapus transparansi dari gambar, memakai "-background" saat itu. |

  magick moon.png  -background tan  -alpha remove  alpha_remove.png

[IM Output]
Perhatikan bahwa meskipun transparansi 'dihapus', kanal alpha tetap menyala, tetapi kini sepenuhnya buram. Jika kanal alpha tidak lagi diperlukan, gunakan Alpha Off untuk menonaktifkannya. Operasi ini sederhana dan cepat, dan menyelesaikan tugasnya tanpa perlu pemakaian memori ekstra ataupun efek samping lain yang mungkin menyertai teknik penghapusan transparansi alternatif. Karena itulah ini cara yang lebih disukai untuk menghapus transparansi gambar. Untuk teknik lain, atau jika ImageMagick Anda lebih tua dari v6.7.5, lihat pembahasan yang lebih luas Menghapus transparansi dari gambar di bawah.

Alpha Background

Sejak IM v6.5.2-10 tersedia metode 'Background' yang menyetel warna tersembunyi piksel yang sepenuhnya transparan ke warna latar belakang saat itu. Biasanya warna ini tidak berdampak apa-apa, karena hanya terlihat jika kanal alpha dimatikan. Namun warna piksel yang sepenuhnya transparan ikut tersimpan dalam format file gambar PNG, dan untuk gambar besar, warna sepenuhnya transparan yang acak tak menentu bisa berdampak signifikan pada penanganan kompresinya. Lihat PNG dengan kompresi lebih baik dan diskusi forum IM Eliminating alpha channel garbage untuk perinciannya. Perhatikan bahwa tidak ada pembauran warna yang diterapkan, hanya penetapan warna langsung pada warna yang sepenuhnya transparan. Pikselnya sendiri tetap sepenuhnya transparan, sehingga tidak akan tampak perubahan pada gambar. Sebagai contoh, di sini saya memakainya untuk menyetel semua piksel yang sepenuhnya transparan menjadi 'HotPink'. |

  magick moon.png -background HotPink -alpha Background moon_hotpink.png

[IM Output]
Seperti yang terlihat, ini tidak mengubah penampilan gambar sama sekali. Untuk melihat perubahannya kita sekarang matikan kanal alpha. |

  magick moon_hotpink.png -alpha off moon_hotpink_off.png

[IM Output]

Ini tidak sama denganmenghapus transparansi

Pada tepi bentuk, semua piksel semitransparan menjadi buram, dan akibatnya muncul efek tepi aliasing (bertangga) yang cukup mencolok. Perhatikan bahwa bahkan PNG24, format yang normalnya hanya buram, tetap bisa menyimpan transparansi boolean jika semua warna yang sepenuhnya transparan itu sama. Untuk perinciannya lihat contoh di Sub-format PNG. Proses penggantian warna ini sebenarnya hampir sama dengan menjalankan "-channel RGB -fill _color_ -opaque None +channel". Lihat Penggantian warna langsung. Perhatikan bahwa banyak operator pemrosesan gambar lain juga akan mengubah piksel yang sepenuhnya transparan menjadi hitam sepenuhnya transparan (warna 'None'), karena itulah padanan warna dari nol matematis. Berikut rangkuman beberapa operasi gambar yang diketahui berbuat demikian, meski tak satu pun selangsung atau secepat memakai operator ini.

  magick moon.png \( +clone -alpha off \) \
                        -compose SrcIn   -composite   moon_black.png
  magick moon.png -channel RGBA  -blur 1x.000000001  moon_black.png
  magick moon.png -channel RGBA   -gaussian 1x0      moon_black.png
  magick moon.png -fuzz 0% -transparent none         moon_black.png

Metode terakhir itu (lihat Faktor fuzz dan warna transparan) sangat berguna karena kita bukan hanya bisa menyetel semua warna transparan menjadi hitam sepenuhnya transparan ('None'), tetapi juga semua warna yang nyaris sepenuhnya transparan (yang sebenarnya masih punya warna valid tapi praktis tak terlihat), cukup dengan menentukan faktor fuzz. Ini menimbulkan sedikit kehilangan data, tetapi dapat memperbaiki kompresi pada gambar dengan banyak warna yang nyaris sepenuhnya transparan. Sering kali piksel yang nyaris transparan total ini bisa punya warna yang sangat aneh atau salah, dan metode ini memungkinkan piksel aneh semacam itu dibuang sebelum menimbulkan masalah lain.

Menghapus transparansi dari gambar

Sementara Alpha Off sekadar membalik sakelar dan mematikan kanal transparansi. Efek yang sama juga bisa didapat jika gambar disimpan ke format file yang tidak mengizinkan pemakaian transparansi. Misalnya dengan menyimpan ke JPEG...

  magick -size 70x60 xc:none -font Candice -pointsize 50 \
          -fill Black -annotate +10+45 'A' -channel RGBA  -blur 0x5 \
          -fill white -stroke black -draw "text 5,40 'A'"   a.png

  magick a.png  a.jpg

[IM Output] [IM Output]

Ingat, format file JPEG tidak menyimpan kanal alpha (transparansi), sehingga kanal itu sekadar dimatikan. Dalam kasus ini bagian transparan begitu saja menjadi hitam (hasil yang lazim). Namun tergantung sumber gambarnya, area transparan bisa saja dengan mudah menjadi warna acak lain, atau warna lain yang tak semestinya. Selain itu, dalam banyak kasus piksel semitransparan bisa punya warna yang sangat aneh, yang biasanya tak terlihat karena piksel itu hampir sepenuhnya transparan. Sekadar mematikan transparansi akan membuat piksel-piksel ini mencolok sekali, sehingga hasilnya tampak lebih buruk dari dugaan. Lihat misalnya tepi kiri-atas huruf 'A' di atas. Bagaimanapun juga, sekadar mematikan transparansi biasanya BUKAN yang diinginkan. Solusi terbaik adalah memakai metode Alpha Remove untuk secara cepat dan sederhana mengganti transparansi dengan lapisan warna latar belakang... |

  magick a.png   -background skyblue  -alpha remove -alpha off a_remove.jpg

[IM Output]
Sebenarnya Alpha Off tidak diperlukan dalam kasus ini, karena penyimpanan ke JPEG melakukannya secara otomatis.
Teknik alternatif menghapus transparansi adalah dengan entah bagaimana membuat gambar 'latar belakang' atau 'kanvas' baru lalu mengomposisikan Over gambar tadi ke latar itu sehingga transparansinya tergantikan. Sebaiknya sambil mempertahankan meta-data gambar asli, seperti profil, label, caption, dan komentar yang mungkin ada. Metode membuat kanvas semacam itu dicontohkan di Membuat kanvas gambar berukuran sama. Berikut salah satu metodenya... |

  magick a.png \( +clone -alpha opaque -fill SkyBlue -colorize 100% \) \
          +swap -geometry +0+0 -compose Over -composite  \
          -alpha off  a_compose.jpg

[IM Output]
Cara lain yang lebih sederhana adalah memakai operasi yang secara internal membuatkan 'kanvas latar hasil klona' untuk Anda, menghasilkannya sebagai bagian dari operasi pemrosesan gambar yang lebih besar yang sedang dikerjakan operator itu. Metode yang paling umum adalah meratakan (flatten) gambar. Operator ini begitu sering dipakai untuk tujuan ini sehingga proses menghapus transparansi sering keliru disebut 'flattening'. Sebagai contoh... |

  magick a.png   -background skyblue -flatten  -alpha off  a_flatten.jpg

[IM Output]
Namun cara ini tidak akan bekerja dengan "mogrify" atau dengan barisan banyak gambar, pada dasarnya karena operator "-flatten" memang dirancang untuk menggabungkan banyak gambar menjadi satu. Metode umum lain yang memang bekerja dengan banyak gambar adalah memberi gambar sebuah border berukuran nol dengan "-bordercolor" yang sesuai. Sebagai contoh... |

  magick a.png   -bordercolor skyblue -border 0  -alpha off  a_border.jpg

[IM Output]
Operator pemrosesan gambar lain yang berkerabat dekat dengan metode-metode di atas juga bisa menghapus transparansi dari gambar. Di antaranya: Mosaic, Merge, dan Frame. Operator Extent juga bisa dipakai, dan memungkinkan gambar diperluas atau dipangkas bersamaan dengan menghapus transparansi, tetapi hanya jika ukuran akhir gambar yang diinginkan sudah diketahui. Transparansi tidak harus diganti dengan warna polos. Dengan komposisi rakitan sendiri (seperti di atas) gambar apa pun bisa dipakai sebagai latar belakang pengganti. Satu contoh sederhananya adalah memakai perintah "composite" untuk men-tile sebuah gambar 'di bawah' gambar asli (memakai Dst_Over). Metode komposisi ini menjamin meta-data dan ukuran gambar asli tetap terjaga. |

  magick composite -compose Dst_Over -tile pattern:checkerboard \
                                               a.png  a_undertile.jpg

[IM Output]
| _Banyak dari metode di atas entah terpengaruh oleh, atau bisa memusnahkan, informasi kanvas virtual yang mungkin dimiliki gambar, sebagai bagian dari pemrosesannya. Bila kanvas virtual terlibat, mungkin perlu menilik perincian tiap operator lebih cermat. Dalam banyak kasus efek kanvas virtual justru bisa berguna bagi pemrosesan gambar Anda secara keseluruhan.

_

Transparansi alpha boolean

Untuk beberapa format file gambar kanal alpha tidak perlu dihapus sepenuhnya, melainkan hanya mengizinkan transparansi murni nyala/mati alias boolean. Format file gambar berindeks (palet) seperti GIF dan PNG8 adalah contoh khasnya. Contoh-contohnya saat ini dibahas di Transparansi boolean GIF, tetapi kelak semestinya pindah ke sini.

Transparansi garis tepi atau halo

Kadang kita ingin menambahkan garis tepi di sekeliling gambar yang mengandung transparansi. Salah satu caranya adalah memakai morfologi EdgeOut untuk cepat mendapatkan semua piksel tetangga gambar asli, mewarnainya, lalu mengomposisikannya Under (DstOver) dengan gambar asli.

  magick knight.png \( +clone \
             -channel A -morphology EdgeOut Diamond +channel \
             +level-colors red \
           \) -compose DstOver -composite    knight_outlined.png

[IM Output] [IM Output]

Ini bisa sangat berguna saat membuat gambar format GIF dari gambar PNG yang mengandung piksel tepi semitransparan. Ia memberi warna latar belakang dalam jumlah minimal, tetapi membiarkan bagian lain gambar sepenuhnya transparan. Lihat GIF di atas pola latar untuk lebih banyak soal masalah ini. Metode alternatifnya adalah membuat halo semitransparan yang lembut di sekeliling bentuk. Untuk itu kita blur dan warnai ulang gambarnya, lalu sekali lagi komposisikan Under (DstOver) dengan gambar asli. |

    magick knight.png \(  +clone \
              -channel A  -blur 0x2.5 -level 0,50% +channel \
              +level-colors red \
            \) -compose DstOver  -composite    knight_halo.png

[IM Output]
Yang terakhir ini sebenarnya mirip dengan efek font majemuk garis tepi lembut, tetapi memakai gambar berbentuk alih-alih teks beranotasi.


Menggunakan mask pada gambar

Me-mask sebuah gambar

Seperti yang sudah diperlihatkan, ada beberapa cara untuk me-mask gambar, yaitu membuat sebagian gambar menjadi transparan. Metode mana yang dipilih bergantung pada apakah mask gambar Anda berupa mask grayscale atau mask bentuk.

Menyunting mask gambar

Mask dari sebuah gambar adalah sesuatu yang sungguh berguna untuk dimiliki. Kita bisa misalnya menghapus bagian-bagian gambar dengan sangat mudah dengan memodifikasi mask dari gambar aslinya. Ingat, operator "-draw" tidak bisa menggambar ketiadaan, dan saat ini tidak punya opsi hapus. Di sini kita membuat sebuah gambar, lalu mengekstrak dan memodifikasi mask-nya, sebelum mengembalikannya ke gambar asli.

  magick -size 100x100 xc:none   -stroke black  -fill steelblue \
          -strokewidth 1   -draw "circle 60,60 35,35" \
          -strokewidth 2   -draw "line 10,55 85,10"      drawn.png

  magick drawn.png -alpha extract  mask.png

  magick mask.png -fill black -draw "circle 40,80 60,60" mask_bite.png

  magick drawn.png mask_bite.png \
          -alpha Off -compose CopyOpacity -composite \
          drawn_bite.png

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

Ingat, "hitam" pada mask berarti transparan, sedangkan putih berarti buram, jadi yang perlu kita lakukan hanyalah menggambar hitam di atas apa pun yang tidak ingin terlihat. Jangan lupakan operasi "-alpha Off" di atas karena itu vital untuk memastikan gambar grayscale tidak mengandung kanal transparan yang tak diperlukan. Dan sim salabim, kita menggigit lepas sebagian gambar asli. Kita juga bisa menambahkan kembali bagian gambar yang sudah dibuang. Misalnya, di sini saya menambahkan kembali sebagian 'gigitan' yang saya buang dari gambar asli, dengan menggambar area putih pada mask-nya. Mask itu kemudian dikembalikan lagi ke gambar asli memakai komposisi kanal CopyOpacity.

  magick mask_bite.png -fill white \
          -draw "circle 50,70 60,60" \
          -draw "roundRectangle  78,5 98,25 5,5" \
          -alpha off  mask_bite2.png
  magick composite -compose CopyOpacity mask_bite2.png drawn.png drawn_bite2.png

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

Sekadar peringatan soal menambahkan kembali bagian gambar. Biasanya ImageMagick mengganti warna yang sepenuhnya transparan dengan hitam, umumnya karena begitulah cara kerja matematika di balik operator. Toh warna itu sepenuhnya transparan sehingga normalnya tidak menjadi soal. Artinya jika kita membuat buram sebagian gambar yang belum pernah kita gambari, bagian itu umumnya akan hitam, karena itulah warna di balik transparansi gambar. Namun pada contoh di atas Anda tentu memperhatikan bahwa format file gambar PNG dengan benar mempertahankan warna asli (yang dibuat transparan) dari gambar. Karena itu warna bagian yang ditambahkan kembali tetap warna 'SteelBlue' asli dari gambar semula. Jangan mengandalkan ini jika gambar disimpan ke format file lain atau dimodifikasi lebih lanjut.
Berikut metode alternatif untuk menghapus bagian-bagian dari gambar, tetapi alih-alih mengekstrak dan memodifikasi mask grayscale, kita memakai mask bentuk sebagai semacam alat 'penghapus' menggunakan metode komposisi DstOut.

  magick -size 100x100 xc:none -draw "circle 40,80 60,60" mask_shape.png

  magick drawn.png mask_shape.png -compose DstOut -composite drawn_bite3.png

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

Seperti yang terlihat, kadang mask bentuk lebih mudah ditangani, karena kita terhindar dari keharusan mengekstrak dan memulihkan kanal alpha. Namun metode komposisi alpha Duff-Porter, yang sedang saya pakai ini, tidak akan pernah membiarkan Anda memulihkan warna yang telanjur dibuat transparan. Dengan metode-metode ini, apa pun yang sudah dibuat transparan (dan karenanya warnanya tak terdefinisi) tetap transparan. Kenyataannya, menghapus bagian gambar memakai metode komposisi alpha justru akan memusnahkan warna di balik piksel yang sepenuhnya transparan. Ia tidak akan mempertahankannya. Lagi pula, warna transparan sebenarnya bukanlah warna sungguhan!

Mask sebagai bentuk berwarna

Alternatif dari sekadar memakai mask untuk menambah atau mengembalikan transparansi pada gambar adalah menggabungkan mask itu secara langsung dengan gambar dalam berbagai cara. Misalnya, andaikan kita hanya ingin memakai mask sebagai simbol atau bentuk yang akan kita tumpangkan ke sebuah gambar dalam berbagai warna. Untuk itu kita perlu sebuah mask, yang akan saya ekstrak dari sebuah font 'simbol' khusus. |

  magick -font WebDings -pointsize 24 label:Y \
          +trim +repage  -negate   heart_mask.gif

[IM Output]
Perhatikan bahwa saya menegasikan gambar label itu agar menjadi gambar mask yang semestinya, terdiri dari latar depan putih (buram) di atas latar belakang hitam (transparan). Sejak IM v6.4.3-7 cara paling sederhana mengubah mask grayscale menjadi bentuk berwarna adalah memakai operator Alpha Shape. Ini persis seperti Alpha Copy, tetapi dengan satu langkah tambahan untuk mewarnai bentuk akhirnya. |

  magick heart_mask.gif  -background Red -alpha Shape  heart_red.png

[IM Output]
| Perhatikan pemakaian format gambar 'PNG' untuk gambar berbentuk yang dihasilkan, alih-alih GIF, demi menghindari masalah dengantransparansi boolean GIF.
Sebelum itu, solusi paling sederhana adalah menegasikan mask alpha menjadi gambar kanal matte lalu memakai Combine untuk menghasilkan gambar berbentuk. |

  magick heart_mask.gif -negate  \
          -background Gold  -channel A  -combine   heart_gold.png

[IM Output]
Warna mask berbentuk dalam kasus ini ditentukan oleh warna "-background" yang dipakai Combine untuk mengisi kanal-kanal tak terdefinisi dari gambar baru. Cara yang lebih lama tapi lebih rumit adalah memakai metode komposisi 'CopyOpacity' untuk menyetel transparansi gambar ke mask yang diberikan, lalu memakai pewarnaan seragam untuk mewarnai bentuk hasilnya. Cara ini bekerja dan untuk waktu yang lama merupakan teknik terbaik, tetapi kini tidak lagi direkomendasikan. |

  magick heart_mask.gif \( +clone \) -alpha off \
          -compose CopyOpacity  -composite \
          -fill HotPink  -colorize 100%    heart_hotpink.png

[IM Output]
Kini setelah punya gambar 'berbentuk', kita tinggal menumpangkan gambar itu ke latar belakang mana pun yang kita mau, misalnya gambar mawar bawaan, memakai salah satu dari sekian banyak teknik pelapisan gambar dan metode komposisi alpha. |

  magick rose: -page +2+2  heart_gold.png \
                 \( +clone -repage +7+29 \)  \
                 \( +clone -repage +52+14 \)  \
          -flatten       rose_with_love.gif

[IM Output]
Ini baik-baik saja kalau kita ingin semua simbol berwarna sama, tetapi akan butuh banyak gambar antara jika kita mau memakai beberapa warna, sehingga tidak praktis untuk menumpangkan banyak simbol dengan banyak warna berbeda. Salah satu cara membuat tumpangan aneka warna adalah mewarnai ulang gambar berbentuk itu segera setelah gambarnya dibaca. |

  magick rose: \(  heart_gold.png           -repage +2+2   \) \
          \( +clone -fill Red     -colorize 100% -repage +7+29 \) \
          \( +clone -fill HotPink -colorize 100% -repage +52+14 \) \
          -flatten      rose_colored_love.gif

[IM Output]
Perhatikan bahwa kita hanya membaca satu gambar berbentuk, lalu mewarnai ulang sebuah klona dari gambar itu untuk setiap 'lapisan' baru yang akan ditumpangkan. Untuk lebih banyak contoh pewarnaan ulang gambar dasar, lihat seluruh bagian Modifikasi warna. Lihat juga Menggambar simbol untuk metode alternatif menandai lokasi tertentu pada gambar. Serta contoh pelapisan penanda peta untuk teknik pelapisan yang lebih otomatis.

Komposisi matematis

Alih-alih menumpangkan mask ke suatu latar belakang, bisa jadi Anda hanya berminat mewarnai gambar dengan bagian putih atau hitam dari mask itu sendiri. Ini relatif lugas, cukup memakai beberapa metode komposisi alpha matematis untuk mengubah warna mask agar sesuai dengan suatu warna, tile, atau gambar lain. Misalnya metode komposisi 'Multiply' akan mengganti area putih (nilai perkalian 1) dengan gambar tumpangan, sambil membiarkan area hitam (nilai perkalian 0) tetap hitam. Operator 'Screen' persis sama dengan 'Multiply' tetapi dengan gambar-gambar dinegasikan, sehingga efektif mengganti area hitam gambar. Sebagai contoh, mari pakai gambar mask yang lebih besar dari atas untuk menumpangi gambar lebih besar yang dibuat dengan pola tile.

  magick mask_bite.png -size 100x100   tile:tile_disks.jpg \
                        -compose Multiply  -composite   compose_multiply.png
  magick mask_bite.png -size 100x100   tile:tile_water.jpg  \
                        -compose Screen    -composite   compose_screen.png

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

Metode komposisi alpha 'Multiply' terutama berguna untuk mengganti latar belakang gambar teks (yakni teks hitam di atas latar putih), seperti gambar yang dihasilkan dari dokumen Postscript.

Komposisi alpha dengan mask

Bentuk tiga-gambar yang khusus dari komposisi alpha dengan mask memungkinkan pemakaian mask yang sama untuk langsung memadukan dua gambar. |

  magick -size 100x100   tile:tile_water.jpg  tile:tile_disks.jpg \
           mask_bite.png    -composite   compose_masked.png

[IM Output]
Gambar pertama akan mengganti bagian latar hitam dari mask, sedangkan gambar kedua mengganti bagian latar depan putih dari mask. Mask-nya sendiri diberikan sebagai gambar ketiga. Mask dipakai untuk memilih dan mencampur dua gambar berbeda guna menghasilkan hasil akhir. Ini sebenarnya agak mirip Blend terpetakan dari kedua gambar. Ingat, ukuran akhir dan meta-data gambar hasil berasal dari gambar 'latar belakang' pertama pada operasi di atas (bagian hitam), jadi tukar gambarnya dan negasikan mask-nya jika ingin sebaliknya. Dan terakhir, ingat bahwa jika Anda memakai perintah "composite" alih-alih "convert", gambar 'tumpangan' (bagian putih) diberikan lebih dulu dan gambar 'latar belakang' (bagian hitam) kedua. Dengan kata lain dua gambar pertama perlu ditukar untuk perintah itu.

Menyelaraskan dua gambar ber-mask

Sedang dikerjakan

Tentang menyelaraskan dua gambar ber-mask...

Jika mask Anda murni boolean, seharusnya tidak ada masalah bagaimanapun
cara menerapkannya.  Namun mask yang tepinya 'anti-aliased', 'gray', atau
'semi-transparent' agar tampak 'halus' bisa jadi sakit kepala serius
kalau tidak ditangani dengan benar dan hati-hati.

Sisa pembahasan ini menyangkut mask 'anti-aliased'.

Mask anti-aliased yang saling disambung hadir dalam dua gaya...

 * Yang bertaut satu sama lain seperti potongan puzzle jigsaw ATAU
   seperti pasak berbentuk ke dalam lubang berbentuk (batas bersama)

 * Mask yang dimaksudkan untuk menimpa area padat (berlapis)

Yang terakhir mudah ditangani dan merupakan efek normal yang muncul saat
Anda menimpakan suatu bentuk berwarna di atas gambar yang sepenuhnya buram.
Pada dasarnya komposisi 'over' dipakai untuk mengomposisikan bentuk itu.

Sebaliknya mask 'jigsaw' yang pertama lebih sulit.  Mask semacam itu tidak
dimaksudkan untuk saling bertindih maupun saling menyisakan celah.  Namun
jika disambung dengan komposisi 'over' yang lazim dan tampak jelas, hasilnya
adalah sambungan semitransparan tempat 'tepi anti-aliased' berbaur.

_Contoh sambungan 'mask jigsaw' yang buruk (over)_

Cara yang benar untuk menyambung mask dan gambar 'jigsaw' berbentuk adalah
memakai komposisi **Plus** untuk 'menjumlahkan' gambar-gambarnya, dengan
latar belakang hitam atau sepenuhnya transparan.

_Contoh sambungan 'mask jigsaw' yang benar (plus)_


Untuk contoh lain penyambungan gambar ala DIY, memakai komposisi 'Dst-In',
'Dst-Out', dan 'Plus', lihat contoh-contoh di...
  https://usage.imagemagick.org/compose/#dstin

Saya juga membahas detail penyambungan ini di laporan bug komposisi alpha
tiga gambar [Composite Mask Bug
- Fixed](https://usage.imagemagick.org/bugs/composite_mask/#correct).

Untuk lebih lanjut soal perbedaan 'over' dan 'plus', lihat ['Blend' (plus) vs 'Dissolve' (over)](compose.html#blend_dissolve)

Contoh penyambungan potongan bertepi selaras yang benar ditunjukkan di
[Kubus 3d - Affine](distorts.html#cube3d) dan lagi di [Kotak 3d - Perspective](distorts.html#box3d)
serta di Kubus isometrik memakai Shear
  https://usage.imagemagick.org/warping/#sheared_cube

Masalah utama dalam contoh-contoh itu adalah bagian-bagiannya TIDAK
dihasilkan memakai mask yang sama, melainkan didistorsi ke posisi akhirnya.
Karena itu potongan-potongannya tidak benar-benar bertaut rapi saat disambung.

Contoh-contoh ini perlu diperbarui agar memakai metode komposisi 'Plus'.  Untuk
menghasilkan keluaran yang lebih baik, meski begitu pun hasilnya mungkin masih
belum sepenuhnya 'pas' karena mask-nya tidak persis 'bertaut' satu sama lain.

Menghasilkan mask tepi selaras yang benar

Ide terbaik adalah memakai mask yang sama (dinegasikan) untuk KEDUA potongan,
alih-alih mencoba menggambar kedua mask secara terpisah. Kalau tidak, kedua
mask akan bertindih, ATAU menyisakan celah, persis seperti yang sudah terlihat.

Metode penyambungan mask yang benar..

    * pakai mask untuk menetapkan transparansi pada satu potongan
      pakai mask yang dinegasikan untuk transparansi potongan lainnya
      'Plus'-kan kedua potongan itu.

    * Pakai mask untuk menambahkan transparansi hanya pada satu potongan, lalu
      komposisikan potongan itu dengan 'Over' di atas gambar utuh.

    * pakai komposisi ber-mask tiga gambar
      lihat https://usage.imagemagick.org/compose/#mask
      dan https://usage.imagemagick.org/masking/#masked_compose
      Yang memakai mask untuk memilih hasil dari dua gambar berbeda.

Ingat, 'Over' hanya perlu gambar 'source' atau 'overlay' yang di-mask; gambar
latar belakang seharusnya tidak punya tepi semitransparan yang selaras.
Tapi komposisi 'plus' perlu kedua gambar di-mask dengan mask yang persis saling
menegasikan agar tepi sambungannya selaras.

PERINGATAN:  Draw saat ini TIDAK memungkinkan Anda menghasilkan dua bentuk yang
bertaut rapi tanpa saling bertindih!!!!

Lihat [Batas isian Draw](draw.html#bounds) untuk detailnya.

Saya belum memeriksa SVG untuk melihat apakah ia punya masalah yang sama.

Mask gambar khusus

Write mask - melindungi piksel dari perubahan

'Write mask' atau 'clip-mask' adalah gambar grayscale khusus yang ditambahkan ke gambar yang sudah ada dengan ukuran yang sama. Ia menentukan area-area gambar yang digolongkan 'kekal' atau 'tak-boleh-ditulisi' oleh sebagian besar operator pemrosesan gambar. Operator "-mask" mengambil sebuah gambar eksternal untuk ditautkan ke gambar-gambar di memori. Bentuk 'plus' dari operator itu, "+mask", melepas mask dari gambar. Sebagai contoh, di sini saya memakai 'write mask' untuk melindungi piksel latar belakang agar tidak ditulisi, sambil memutar rona (hue) untuk mewarnai ulang mawar merah di latar depan menjadi mawar biru.

  magick rose: -mask rose_bg_mask.png \
          -modulate 110,100,33.3  +mask rose_blue.png

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

Mask-nya agak kasar, tetapi bekerja dengan baik. Ingat saja bahwa 'write mask' dipakai untuk menentukan bagian yang hendak dilindungi atau dipertahankan. Ingat, pada IMv7...

Operator "-mask" mendefinisikan mask 'proteksi-tulis'

Untuk contoh yang lebih lanjut lihat masking chroma key, yang lebih membahas cara menghasilkan mask-nya ketimbang menerapkannya sebagai write mask. Write mask alias clip mask dirancang untuk bekerja saat piksel-piksel dalam gambar dimodifikasi secara langsung. Contoh: negate, level, pewarnaan, modulate, menggambar, composite, morfologi, konvolusi. Untuk operator yang menghasilkan gambar BARU (resize, distorsi, extent, dsb.) ia gagal mempertahankan piksel asli, karena mask tidak akan bisa berkorespondensi dengan ukuran gambar yang baru. Operasi semacam itu juga punya efek samping melepas atau membatalkan 'write-mask' gambar. Berikut contoh lain...

  magick -size 70x70 xc:red  red_image.png
  magick -size 70x70 xc: -draw 'circle 35,35 30,5'  write_mask.png

  magick red_image.png  -mask write_mask.png \
          -fill blue -opaque red   +mask    masked_color_replace.png

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

Perhatikan bahwa tepi mask maupun gambar hasil sama-sama mulus (ter-anti-alias); itu karena mask ini bukan sekadar mask boolean melainkan mask pembauran. 'Write-mask' adalah mask pembauran dalam arti piksel 'abu-abu' pada mask akan menghasilkan pembauran antara piksel baru dan nilai gambar lama, sebanyak kadar abu-abu yang ada. Ini menghasilkan tepi yang sangat mulus, dan juga memungkinkan pembuatan gradasi melintasi gambar antara area yang dimodifikasi dan yang tidak. Namun mask pembauran, walau cocok untuk satu operasi, bisa jadi tidak baik bila dipakai untuk banyak operasi karena efek pembaurannya akan diterapkan berulang kali. Masalah ini terutama menonjol pada operasi berulang seperti morfologi. Tapi hanya jika yang dipakai mask pembauran non-boolean. Jika ini menjadi masalah, kemungkinan lebih baik melakukan semua operasi pada salinan gambar, lalu memakai komposisi alpha dengan mask terhadap gambar asli. Sebaiknya berhati-hati.
Pemakaian masking seperti ini sebenarnya persis cara kerja masking komposisi! Tapi hanya selama operator komposisi itu diterapkan.

  magick -size 70x70 xc:green  green_image.png

  magick red_image.png  green_image.png  write_mask.png \
          -composite    masked_composite.png

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

Setara (dengan mask yang dinegasikan) dengan... |

  magick write_mask.png  -negate -write MPR:mask +delete \
          red_image.png -mask MPR:mask \
          green_image.png  -composite  +mask  masked_composite_equiv.png

[IM Output]
Yaitu, mask-nya dinegasikan, lalu diterapkan ke gambar 'tujuan' pertama. Gambar kedua kemudian dikomposisikan di atas gambar pertama, hanya memodifikasi area 'putih' dari gambar mask asli.

Operasi "-composite" tiga-gambar memakai mask 'write'

Dalam morfologi, write mask biasanya dipakai untuk menghasilkan bentuk operasi morfologi bersyarat atau terkekang. Salah satu contohnya dibahas di forum diskusi IM, Cleaning up noise around text, untuk membatasi efek sebuah dilasi. CATATAN: -crop semestinya bisa mempertahankan mask masing-masing gambar, dengan ikut memangkas mask-nya dan menetapkannya ke gambar baru. Namun saat ini itu belum dilakukan.

Clip mask dan clip path

Bentuk "-clip-mask" dari operator ini hampir persis sama dengan yang di atas, tetapi hanya menyediakan gaya masking boolean (semua-atau-tidak-sama-sekali). Akibatnya hasil yang 'terbaur' atau mulus tidak bisa didapat. Sebagai contoh... |

  magick red_image.png  -clip-mask write_mask.png \
          -fill blue -opaque red   +clip-mask    clipped_modulate.png

[IM Output]
Seperti yang terlihat, hasilnya sangat ter-alias (dengan tepi bertangga), karena "-clip-mask" tidak menghasilkan pembauran seperti "-mask". Satu-satunya kelebihannya adalah sedikit lebih cepat (meski tidak seberapa). Ia semula disediakan untuk memungkinkan penanganan clip path dalam file gambar TIFF, dan merupakan operator yang sangat tua (IMv5). Operator "-mask" yang lebih baru sebaiknya dipakai sebagai gantinya. | _Pada IMv7, 'write-mask' dan 'clip-mask' diimplementasikan berdampingan, meskipun secara teknis keduanya menjalankan fungsi yang persis sama. Karena itu Anda bisa menerapkan kedua mask sekaligus.

Namun memakai keduanya bersamaan tidak direkomendasikan, dan hasilnya tidak terdefinisi. Selain itu bentuk 'mask boolean' ini sudah dihapus dari IMv7.

_

Clip path untuk gambar TIFF

'Clip path' adalah bagian dari format file gambar TIFF, dan mendefinisikan sebuah path vektor yang dipakai untuk menentukan 'area berbentuk' di dalam gambar TIFF. Di IM, operator "-clip" dan "-clip-path" membaca 'clip-path' ini dan mengubahnya menjadi clip mask (di atas). Dengan demikian ia mendefinisikan 'write mask' yang akan melindungi bentuk itu dari modifikasi. Clip-path yang tersimpan dalam gambar TIFF didefinisikan sebagai gambar path SVG, yang bisa diekstrak dari file gambar TIFF menggunakan...

  magick identify -format '%[8BIM:1999,2998:#1]' image_clip.tiff

Masalah terbesar yang sering dihadapi orang adalah membuat semua yang tidak ter-clip menjadi transparan. Yang justru mengharuskan Anda menulisi area-area yang diproteksi-tulis oleh mask! Ini salah satu solusinya: ubah seluruh gambar menjadi transparan, lalu nyalakan 'clip path', kemudian buat bagian yang kini bisa ditulisi menjadi buram (terlihat) kembali.

  magick input.tiff -alpha transparent -clip -alpha opaque -strip out.tiff

Operator "+clip" juga mematikan dan melepas clip mask (persis seperti "+clip_mask"). Namun tidak ada format file yang menyimpan clip mask saat itu bersama gambar, untuk format file gambar apa pun. (Setidaknya di IMv7)

Read mask - mengabaikan masukan piksel

Penting dicatat bahwa write mask membatasi piksel mana yang akan ditulisi pada gambar. Namun ia tidak membatasi piksel mana yang 'dibaca' sebagai bagian dari operasi yang dijalankan untuk menciptakan data piksel baru yang akan ditulis. Ini pada dasarnya berarti bahwa jika Anda memakai operator jenis 'efek area' atau 'lingkungan tetangga', seperti blur, morfologi, atau konvolusi, maka 'piksel yang bisa ditulisi' di dekat tepi bisa memuat nilai warna dari area yang di-mask alias tak-boleh-ditulisi. Misalnya, di sini kita proteksi-tulis mawar di latar depan, sebelum mem-blur gambarnya. Maksudnya, kita hanya ingin mem-blur bagian latar belakang gambar, dalam kasus ini cukup tebal.

  magick rose: -mask rose_fg_mask.png \
            -blur 0x8   +mask  rose_bg_blur_fail.png

[IM Output] [IM Output] [IM Output]
Hasil ini memakai mask proteksi-tulis dan bukan yang diinginkan.

Seperti yang terlihat, meskipun warna latar depan terlindungi oleh mask, warna-warna itu tetap terpakai dalam proses blur latar belakang di sekeliling mawar. Karena itulah latar belakang ter-blur di dekat latar depan punya semburat atau halo kemerahan yang kentara. Dengan kata lain warna latar depan 'bocor' ke latar belakang di sekitarnya. Ini umumnya bukan yang orang maksudkan ketika ingin mem-blur latar belakang gambar, misalnya sebagai bagian dari efek fokus lensa. Yang orang benar-benar inginkan adalah blur yang sepenuhnya 'mengabaikan' piksel latar depan, dan hanya membiarkan warna latar belakang ikut dalam proses blur. Yakni, mereka ingin mencegah blur 'membaca' piksel latar depan.

Solusi read mask untuk IMv7

Di IMv7 satu-satunya cara membuat warna sebuah piksel tak terbaca adalah membuat piksel itu transparan. Piksel transparan menurut definisi tidak punya warna, sehingga 'warna tersembunyinya' tidak ikut dalam perhitungan operasi blur. Ini memberi kita sebuah 'akal-akalan'. Buat piksel latar depan transparan, terapkan operasi blur (atau lainnya), lalu matikan transparansi (memang tidak dibutuhkan dalam kasus ini). Kemudian kita bisa memulihkan bagian latar depan gambar. Kalau kedengarannya rumit, memang rumit. Berikut langkah-langkahnya, sambil menampilkan gambar-gambar antara supaya tekniknya jelas...

  magick rose: rose_bg_mask.png -alpha off \
          -compose CopyOpacity -composite   +compose  rose_bg_only.png
  magick rose_bg_only.png  -channel RGBA -blur 0x8   rose_bg_blurred.png
  magick rose_bg_blurred.png      -alpha off         rose_bg_blur_opaque.png
  magick rose_bg_blur_opaque.png \
                rose: rose_fg_mask.png -composite    rose_bg_blur_good.png

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

Hasilnya adalah hilangnya efek halo merah yang sebelumnya 'bocor' ke latar belakang ter-blur. Berikut perbandingan berdampingan antara versi blur latar belakang dengan write mask dan dengan read mask, supaya jelas terlihat bagaimana kita menghilangkan 'kebocoran' warna latar depan ke latar belakang. [IM Output]
Write | [IM Output]
Read
Perbedaan metode masking
Contoh di atas mengasumsikan gambar asli tidak punya alpha. Jika gambar juga mengandung kanal alpha, alpha perlu dipisahkan dan diproses tersendiri, sehingga usahanya berlipat dua. Salah satu contohnya diperlihatkan dalam diskusi 'distort resize', yang ingin mengabaikan piksel virtual yang mengelilingi gambar yang diubah ukurannya memakai distorsi. Lihat Correct Resize (using distorts) untuk perinciannya. Perhatikan bahwa yang di atas juga berkerabat sangat dekat dengan teknik pengisian lubang ter-blur. Bedanya hanya bahwa yang dipertahankan dari modifikasi adalah latar belakangnya, bukan latar depannya. Yang membuatnya sedikit lebih sederhana. 'Read mask' sejati semestinya tersedia di IMv7 sehingga yang di atas cukup dengan menambahkan 'read mask' dan opsional 'write mask'.


Region dan sub-gambar region

Region adalah cara lain membatasi efek operasi pada area gambar yang lebih kecil. Misalnya, di sini saya mewarnai seluruh region persegi panjang dengan merah... |

  magick koala.gif  -region 40x33+15+5 -fill red -colorize 50% \
          koala_region_red.gif

[IM Output]
Sebuah region juga bisa dibuat transparan... |

  magick koala.gif -alpha set \
          -region 40x33+15+5 -alpha transparent   koala_region_trans.gif

[IM Output]
Perhatikan bahwa saya perlu memastikan gambar asli sudah punya kanal alpha aktif sebelum membuat 'gambar region' transparan. Jika tidak, IM akan membuat transparansi apa pun dalam 'gambar region' tembus pandang, dan tidak akan tampak perubahan. Lihat Cara kerja region di bawah untuk perinciannya. | Sebelum IM v6.6.9-5 pengawetan transparansi rusak, dan hasil transparansi dalam sebuah region selalu "tembus ke gambar asli". Karena itu hasil perintah di atas tidak akan memuat piksel transparan sama sekali, meskipun gambarnya mengizinkan pemakaian transparansi.
Alasan terbesar memakai region adalah bahwa ia bukan sekadar membatasi efek ke area kecil; ia benar-benar mengekstrak area persegi panjang itu dari gambar, dan menerapkan semua operasi sederhana yang menyusul ke area yang lebih kecil itu. Artinya jika Anda hanya memodifikasi satu area sangat kecil dari gambar yang sangat besar, misalnya menghapus mata merah, lingkup operasi bukan hanya terbatas ke area itu, tetapi operasinya juga berjalan jauh lebih cepat, dan gambar region hasil ekstraksinya pun lebih kecil. Ringkasnya... Write mask menjalankan operasi pada seluruh gambar tetapi membatasi piksel mana yang benar-benar berubah, sedangkan region memakai sub-gambar hasil ekstraksi yang lebih kecil. Perhatikan bahwa tidak ada yang menghalangi pemakaian kedua metode ini bersamaan. Namun jika clipping mask diterapkan ke sebuah region, clipping mask itu harus cocok dengan ukuran gambar region yang diekstrak.

Melengkungkan region lokal

Karena 'region gambar' benar-benar mengekstrak 'sub-gambar kecil' dari gambar asli untuk diproses, kita bisa memanfaatkan distorsi sirkular 'terlokalisasi' yang khusus untuk melengkungkan region-region kecil dari gambar asli. Misalnya, di sini kita punya sebaris garis-garis.

  magick -size 600x70 xc:darkred \
          -fill white -draw 'roundrectangle 5,5  595,65 5,5' \
          -fill black -draw 'rectangle 5,25 595,31' \
          -fill red -draw 'rectangle 5,39 595,45' \
          lines.gif

[IM Output]

Sekarang dengan mendefinisikan region kita bisa mendistorsi garis itu dengan cara berbeda di area yang berbeda.

  magick lines.gif \
          -region 90x70+10+0    -swirl  400  \
          -region 90x70+100+0   -swirl  400 \
          -region 90x70+190+0   -swirl -400 \
          -region 120x70+280+0  -implode 1.5 \
          -region 100x70+380+0  -implode -7  \
          -region 101x70+480+0  -wave 10x50 -crop 0x70+0+10\! \
          +region lines_regions.gif

[IM Output]

Perhatikan bahwa "-implode" dan "-swirl" sangat cocok dipakai dengan region, karena keduanya punya sifat bahwa tepi luar gambar terdistorsi tetap bersambung dengan bagian gambar di luar region yang didefinisikan. Yakni, keduanya memang dirancang untuk melakukan 'pelengkungan gambar terlokalisasi'. Perhatikan bahwa saat memakai distorsi Wave, saya harus memangkas ukuran gambar 'gelombang' hasilnya agar pas kembali ke area asal ekstraksinya. Ingat, region hanya bekerja bila dipakai dengan operator pemrosesan gambar sederhana. Operator lain apa pun, termasuk operator "-region" lainnya, akan membatalkan pemrosesan region sebelum operasi itu diterapkan.

Cara kerja region, dan masalahnya

Kenyataannya, cara region bekerja adalah...

  • Ekstrak dari gambar sebuah gambar lebih kecil sesuai operator "-region", memakai crop sederhana dengan argumen region.
  • Terapkan setiap operator pemrosesan gambar sederhana yang menyusul ke gambar kecil itu.
  • Ketika operator gambar non-sederhana ditemui, ATAU operator "-region" lain ditemukan, ATAU region dimatikan dengan "+region", region hasil ekstraksi ditumpangkan ke gambar asli pada lokasi ekstraksinya.

Region bekerja dengan cara yang mirip pemakaian operator tumpukan gambar, meskipun ia sudah ada di ImageMagick jauh sebelum operator-operator itu. Ia misalnya bagian integral dari IM versi 5. Sebagai contoh, jika Anda punya operasi region ini...

  ... -region WxH+X+Y  ...simple-operators... +region ...

hasilnya setara dengan ini (untuk satu gambar)...

  ... \( +clone -crop WxH+X+Y ...simple-operators... \
         \) -geometry +X+Y -composite   ...

Atau ini (untuk banyak gambar)...

  ... \( -clone 0--1 -crop WxH+X+Y ...simple-operators... \
         null: +insert \) -geometry +X+Y -layer composite ...

Cara 'gambar region' benar-benar ditumpangkan kembali ke 'gambar asli' agak rumit... Jika gambar asli tidak punya kanal transparansi aktif, 'gambar region' dikomposisikan memakai komposisi Over. Artinya area transparan pada gambar region akan menjadi tembus pandang, memperlihatkan gambar asli di baliknya. Misalnya, di sini saya sengaja mematikan transparansi pada gambar asli, lalu memutar region-nya sehingga muncul area transparan di sudut-sudutnya. |

  magick koala.gif -alpha off -region 30x30+10+10 \
          -alpha on -background None  -rotate 30  koala_region_rotate_1.gif

[IM Output]
Seperti yang terlihat, sudut-sudut area yang diputar (yang transparan pada 'gambar region') memperlihatkan 'gambar asli'. Pada dasarnya karena gambar asli tidak bisa menangani transparansi, gambar region sekadar ditumpangkan, dengan sudut tembus pandang. Jika gambar asli memang mengandung transparansi aktif, maka transparansi pada gambar region yang dimodifikasi juga ikut termodifikasi, sehingga transparansi sekadar 'disalin' apa adanya. |

  magick koala.gif -alpha set  -region 30x30+10+10 \
          -background None  -rotate 30    koala_region_rotate_2.gif

[IM Output]
Seperti yang terlihat, IM memakai komposisi Copy, sehingga transparansi apa pun yang ada pada gambar region juga akan tersalin ke gambar asli. Jika karena suatu alasan Anda ingin gambar asli mempertahankan transparansi awalnya, matikan dulu alpha-nya, lalu setelah gambar region dikembalikan, nyalakan lagi untuk memulihkannya.
Gambar region yang diperbesar atau diperkecil bisa jadi tidak 'pas' kembali ke gambar asli. Misalnya, di sini saya mengubah ukuran (dan mewarnai) gambar region sehingga menjadi lebih kecil... |

  magick koala.gif  -region 30x30+10+10 \
          -resize 75% -fill red -colorize 30%  koala_region_shrink.gif

[IM Output]
Seperti yang terlihat, region asli tidak sepenuhnya tertutup oleh gambar region yang dikembalikan. Bagian yang tidak tertutup itu pun tidak tergantikan. Dengan cara serupa, jika region menjadi lebih besar, lebih banyak bagian gambar asli yang bisa tertutup oleh gambar region yang ditumpangkan. |

  magick koala.gif  -region 30x30+10+10 \
          -resize 150% -fill red -colorize 30%  koala_region_enlarge.gif

[IM Output]
Dalam kedua kasus, offset kiri-atas region tidak berpindah. Gambar region tidak bisa begitu saja dikecilkan lalu ditengahkan dalam area region, dan tidak bisa pula ditempatkan di posisi lain. Berhati-hatilah agar gambar region tidak berubah ukuran. Meski dalam beberapa keadaan khusus region yang berubah ukuran tetap bisa ditangani. Untuk contohnya lihat contoh 'distorsi wave' di atas. | _Seperti "mogrify", banyak sub-gambar tidak bisa digabungkan karena itu memerlukan operasi gambar non-sederhana. Namun "-draw" bisa dipakai sebagai metode komposisi alternatif. Lihat komposisi alpha dalam mogrify untuk contohnya.

_
| _Pada saat tulisan ini dibuat, 'gambar region' masih menyimpanoffset kanvas virtual hasil crop dari ekstraksinya dari gambar asli. Ini bisa dianggap bug, bisa juga tidak, tergantung Anda merasa informasi ini berguna atau tidak. Offset itu saat ini tidak dipakai ketika gambar region dikembalikan.

Jika offset itu tidak diinginkan (karena mengganggu operator seperti Distort), susulkan opsi "-region" dengan operator "+repage" untuk membuang offset dari gambar region. Pembuangan atau pengubahannya tidak akan memengaruhi pengembaliannya ke gambar asli.

_


Penghapusan latar belakang

Salah satu masalah paling umum dalam pemrosesan gambar adalah membuat mask dari gambar yang sudah ada dan sepenuhnya buram. Gambar semacam itu umumnya diunduh dari World Wide Web, atau dihasilkan program, atau berada dalam format gambar yang tidak menyediakan bentuk transparansi apa pun. Bisa juga Anda punya foto suatu objek dan ingin menghapus latar belakangnya. Ingat, foto tidak punya pemahaman apa pun tentang transparansi, jadi bagian yang tak diinginkan harus Anda buang sendiri. Sayangnya tidak ada solusi umum untuk masalah ini, terutama bila Anda juga ingin mempertahankan tepian semitransparan gambar. Akibatnya ada ratusan cara dan variasi untuk mengerjakan tugas ini, semuanya bergantung pada situasi persisnya. Berkerabat dekat dengan masking gambar adalah penyesuaian transparansi agar cocok dengan latar belakang yang akan ditumpangi gambar. Ini dibahas terperinci sebagai bagian dari penyimpanan ke format file gambar GIF yang hanya mengizinkan transparansi boolean.

Me-mask latar belakang sederhana (floodfill)

Bila latar belakang gambar berupa satu warna polos sederhana, mask sederhana sering bisa dibuat (sekaligus menghapus latar) cukup dengan mengganti warna dalam gambar. Misalnya, berikut masking floodfill langsung pada gambar dengan latar belakang warna polos. |

  magick cyclops.png -alpha set -channel RGBA \
          -fuzz 1% -fill none -floodfill +0+0 white \
          cyclops_flood_1.png

[IM Output]
Nah, itu tidak berhasil, karena titik 'benih' floodfill di pojok kanan atas ternyata tidak menjangkau semua bagian gambar!!! Solusinya adalah memperbesar gambar sedikit, agar tersedia jalur bagi floodfill untuk mencapai semua tepi luar gambar. Namun untuk itu kita perlu tahu warna latar belakangnya. |

  magick cyclops.png -bordercolor white -border 1x1 \
          -alpha set -channel RGBA -fuzz 1% \
          -fill none -floodfill +0+0 white \
          -shave 1x1    cyclops_flood_2.png

[IM Output]
Tentu saja faktor fuzz yang kita tentukan belum cukup baik. Masalahnya, muncul halo di sekeliling objek dalam gambar. Ini karena kebanyakan gambar mengandung piksel khusus di sepanjang tepi yang menghaluskan penampilannya. Namun karena gambar ini punya tepi hitam yang tegas relatif terhadap latarnya, pengaturan fuzz yang cukup besar bisa dipakai untuk memisahkan gambar dari latar belakangnya dengan rapi. |

  magick cyclops.png -bordercolor white -border 1x1 \
          -alpha set -channel RGBA -fuzz 20% \
          -fill none -floodfill +0+0 white \
          -shave 1x1    cyclops_flood_3.png

[IM Output]
Teknik ini punya beberapa masalah. Pertama, ia me-mask gambar secara semua-atau-tidak, menghasilkan tepi ter-alias, bertangga, dan sering jelek dipandang. Ini tak apa untuk format file gambar GIF yang terbatas, tetapi kurang baik jika Anda berencana menumpangkan gambar itu ke latar belakang lain. Juga sangat-sangat sulit menangkap setiap piksel tepi anti-aliasing. Karena itu jika saya tumpangkan gambar di atas ke latar hitam, mungkin terlihat beberapa piksel yang jauh lebih putih dari biasanya. |

  magick cyclops_flood_3.png -background black -flatten \
          cyclops_flood_3_over.png

[IM Output]
Selain itu, kalaupun Anda berhasil memakai faktor fuzz yang cukup tinggi, kemungkinan besar timbul masalah piksel tepian yang tersisa terlalu sedikit, atau 'bocor' ke tengah gambar. Terakhir, floodfill langsung seperti ini tidak bekerja untuk latar belakang yang bukan satu warna polos sederhana.

Memotong objek yang bertepi

Gambar yang sudah punya tepi satu warna memiliki keunggulan nyata untuk metode-metode penghapusan latar ini, karena tepi itu memberikan batas yang pasti antara apa yang 'di dalam' dan apa yang 'di luar' gambar, dan itu pada gilirannya memungkinkan cara yang lebih baik untuk menentukan batas gambar latar. Yakni, alih-alih menentukan warna mana yang dianggap latar belakang, kita bisa menentukan warna mana yang menandai tepi objek yang di-mask. Lebih jauh lagi, karena warna tepinya diketahui, hanya dua warna spesifik yang akan saling tercampur di sekitar tepian gambar. Yakni, kedua warna diketahui, sehingga seberapa transparan tepian itu seharusnya juga diketahui dengan sangat baik.

Sedang dikerjakan

Menghapus latar belakang yang diketahui

Sementara penghapusan latar sederhana menjadi mask 'boolean' relatif lugas, keadaan menjadi lebih rumit bila latarnya tidak sesederhana itu. Namun jika latar belakangnya sendiri diketahui, ia bisa dipakai untuk membantu penghapusannya dari gambar lain. Sejak IM v6.3.4 ditambahkan metode komposisi alpha khusus bernama 'ChangeMask' yang memungkinkan penghapusan langsung latar belakang yang diketahui dari sebuah gambar. Misalnya, di sini kita punya gambar latar yang tak diubah, dan satu lagi yang sudah ditumpangi gambar GIF dengan transparansi boolean sederhana (nyala/mati). Dengan 'ChangeMask' kita bisa memulihkan gambar tumpangan asli itu (jika ia sangat berbeda dari latarnya).

  magick overlay_figure.gif   overlay_bgnd.gif  \
            -compose ChangeMask  -composite  overlay_removed.png

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

Pada dasarnya yang dilakukannya adalah menentukan seberapa 'berbeda' piksel-piksel antara satu gambar dan gambar lainnya, dan jika perbedaannya kurang dari faktor fuzz saat itu, piksel itu dibuat transparan. Hanya piksel yang sepenuhnya transparan yang ditambahkan ke gambar; selebihnya gambar asli dibiarkan apa adanya, lengkap dengan transparansinya. Kita bisa menyimulasikan operator ini dengan memakai metode komposisi 'Difference' yang lebih lama untuk menghasilkan sebuah gambar selisih perbandingan...

  magick composite overlay_figure.gif   overlay_bgnd.gif  \
            -compose Difference     overlay_difference.png

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

Seperti yang terlihat, gambar selisih ini hitam pada semua bagian yang tak berubah dan berupa campuran warna pada bagian yang berubah. Dengan memisahkan dan menjumlahkan tiap kanal warna lalu menerapkan threshold, kita mendapatkan mask dari perbedaan apa pun di kanal mana pun antara kedua gambar. |

  magick overlay_difference.png -channel RGB -separate +channel \
          -evaluate-sequence add  -threshold 0   overlay_mask.png

[IM Output]
Dengan mask ini kita bisa menyetel apa pun yang tidak berubah menjadi transparan. |

  magick overlay_figure.gif overlay_mask.png \
          -alpha off -compose CopyOpacity -composite \
          overlay_removed.png

[IM Output]
Seperti yang terlihat, metode komposisi 'ChangeMask' membuat proses ini jauh lebih mudah. Namun ini hanya menyajikan masking latar gaya 'nyala/mati'. Ia tidak mengakomodasi tepi kabur atau ter-anti-alias, ataupun feathering transparan pada hasilnya.

Masking gambar selisih dan feathering

Cara di atas bisa dibawa lebih jauh ke gambar bertepi ter-alias, maupun latar yang tidak sederhana. Misalnya, di sini kita punya 'Cyclops' di atas latar putih, yang ingin kita ekstrak. Kita lalu membuat gambar grayscale dari selisih antara gambar ini dan warna latarnya (sebagaimana ditentukan oleh piksel paling kiri-atas). |

  magick cyclops.png \( +clone -fx 'p{0,0}' \) \
          -compose Difference  -composite  \
          -modulate 100,0  -alpha off  difference.png

[IM Output] [IM Output]
Tentu saja gambar selisih ini tidak layak dipakai langsung sebagai mask. Kalau dipakai, Anda efektif membuat sebagian besar gambar menjadi semitransparan, bukan cuma latar di sekelilingnya. Namun dari gambar selisih ini bisa diciptakan sangat banyak mask transparansi yang berbeda-beda, tergantung apa persisnya yang ingin dicapai. Kita bisa menyetel gambar selisih di atas untuk menghasilkan mask dari semua piksel yang berbeda dari warna latar meski sekecil apa pun. |

  magick difference.png  -threshold 0  boolean_mask.png
  magick cyclops.png  boolean_mask.png \
          -alpha off -compose CopyOpacity -composite \
          cyclops_boolean.png

[IM Output] [IM Output]
Seperti yang terlihat, mask boolean 'beda sekecil apa pun' berujung mengikutkan cukup banyak latar asli. Ini karena gambar aslinya 'ter-anti-alias' atau sedikit ter-blur dengan latarnya (dalam kasus ini akibat gambar asli di-resize dari gambar format JPEG). Ini tidak jadi masalah kalau gambar aslinya sendiri berupa tumpangan boolean (misalnya gambar format GIF yang ditumpangkan ke sebuah latar). Dalam kasus itu hasil Anda akan sempurna (lihat contoh 'ChangeMask' di atas). Dengan memvariasikan "-threshold" Anda bisa menambahkan 'faktor fuzz' pada mask boolean (hanya nyala/mati), sehingga mask lebih mendekati gambar sebenarnya. |

  magick difference.png  -threshold 15%  threshold_mask.png
  magick cyclops.png  threshold_mask.png \
          -alpha Off -compose CopyOpacity -composite \
          cyclops_threshold.png

[IM Output] [IM Output]
Perhatikan bahwa mata gambar cyclops sekarang juga dianggap sebagai lubang transparan! 'Lubang' ini menyoroti kelemahan terbesar seluruh teknik ini. Bagian-bagian objek gambar yang warnanya dekat dengan warna latar, atau lebih parah lagi persis sama dengan latarnya, akan dianggap sama dengan latar. Tentu ini bisa jadi diinginkan pada gambar objek 'berlubang', seperti donat, tapi untuk cyclops kita, 'mata bolong' jelas sebuah kekeliruan. Efek 'halo' asli juga bisa diinginkan untuk hal tertentu seperti teks, agar lebih terbaca saat Anda ingin menumpangkannya lagi ke latar lain yang 'ramai'. Anda bisa mempertegas efek halo dengan sedikit mem-blur mask sebelum menerapkannya, sehingga 'halo' hasilnya melemah seiring jarak. |

  magick difference.png -bordercolor black -border 5 \
          -threshold 10%  -blur 0x3  halo_mask.png
  magick cyclops.png -bordercolor white -border 5   halo_mask.png \
          -alpha Off -compose CopyOpacity -composite  cyclops_halo.png

[IM Output] [IM Output]
Efek 'halo' yang dihasilkan bisa dimodifikasi lebih lanjut dengan berbagai penyesuaian histogram pada gambar mask, memberi Anda kendali sangat presisi atas hasil untuk gambar tertentu. Dengan parameter yang tepat Anda bisa menyetel halo di sekeliling sampai praktis tak ada, meskipun melenyapkannya sama sekali dengan cara ini sulit. Lihat bagian berikutnya untuk teknik yang lebih baik. Sedikit blur (misalnya "-blur 0x0.707", atau akar dua) justru direkomendasikan saat membuat mask threshold, sekadar untuk menghaluskan tepian mask. Tentu hasilnya tidak lagi boolean, jadi jangan coba menyimpannya ke file gambar format GIF. Ini juga contoh dari feathering dengan blur. Tapi awas, itu tidak persis sama dengan feathering bentuk memakai jarak yang sesungguhnya. Namun bila menangani 'bitmap' atau 'mask threshold' seperti yang kita buat di atas, sedikit feathering blur disusul feathering jarak yang lebih besar kemungkinan memberi hasil keseluruhan terbaik.

Memulihkan tepi semitransparan

Teknik masking selisih yang kita pakai di atas dapat digabungkan dengan teknik masking floodfill sebelumnya untuk memecahkan sebagian besar masalah yang kita lihat pada teknik masking yang lebih sederhana. Di sini kita menilik teknik masking berlapis-lapis, tetapi yang semestinya menghasilkan penghapusan latar gambar yang nyaris ideal, sambil mempertahankan piksel gradasi anti-alias di sepanjang tepi. Namun ini terbatas pada gambar dengan latar yang diketahui, dan yang punya 'tepi' berkontras baik terhadap piksel latar depan. Untuk contoh ini saya sengaja memilih sesuatu yang sangat sulit dipisahkan, tetapi memperlihatkan JAUH lebih banyak piksel gradasi di sekitar tepinya daripada yang biasa ada untuk keperluan anti-aliasing. Sebuah bentuk dengan efek bayangan. |

  magick -size 70x60 xc:none -font Candice -pointsize 50 -stroke black \
          -fill black          -annotate +12+42 'A' -channel RGBA  -blur 0x3 \
          -fill tile_disks.jpg -annotate +10+40 'A' \
          tile_water.jpg  -compose DstOver -composite letter.png

[IM Output]
Pertama-tama kita perlu membuat gambar selisih, dan untungnya kita memang tahu gambar latarnya seperti apa. Tentu cara ini bekerja sama baiknya untuk latar polos berwarna, selama kontrasnya cukup untuk membuat dua mask. Pada dasarnya dengan gambar selisih kita bisa menyingkirkan segala pengaruh gambar latar, dan dari situ membuat mask-mask yang akan kita pakai. |

  magick letter.png  tile_water.jpg \
          -compose Difference -composite \
          -modulate 100,0 -channel B -evaluate set 0 \
          -alpha Off  diff_mask.png

[IM Output]
Perhatikan bahwa kali ini saya memproses gambar selisih grayscale itu sedikit, membatasinya ke kanal merah dan hijau sambil mengosongkan kanal biru, menghasilkan gambar selisih hitam-kuning. Ini semacam trik karena membebaskan kanal 'biru' untuk pembuatan mask floodfill yang bersih, terpisah dari gambar selisihnya sendiri. Secara teknis saya bisa juga mengosongkan kanal hijau supaya bisa dipakai untuk mask kedua. Tapi jangan buru-buru. Sekarang kita perlu dua mask: mask luar, yang mendefinisikan semua area yang pasti akan transparan; dan mask yang mendefinisikan bagian dalam objek pada gambar, tanpa menimbulkan 'lubang' yang tak diinginkan. Jadi mari floodfill gambar itu dari luar ke dalam, memakai sejumlah faktor fuzz berbeda, supaya kita bisa memilih dua mask (dalam dan luar) yang akan dipakai.

  for fuzz in 01 03 06   28 32 34; do \
    magick diff_mask.png -fill blue -fuzz $fuzz% \
            -bordercolor black -border 1x1 -floodfill +0+0 black \
            -shave 1x1 diff_mask_$fuzz.png; \
  done

[IM Output]
-fuzz 1% | [IM Output]
-fuzz 3% | [IM Output]
-fuzz 6% | | [IM Output]
-fuzz 28% | [IM Output]
-fuzz 32% | [IM Output]
-fuzz 34%

Area biru pada gambar-gambar di atas adalah area yang di-mask. Ingat, kanal biru memang kita kosongkan untuk keperluan ini. Mask pertama sebaiknya me-mask area gambar yang pasti ingin kita buat sepenuhnya transparan. Yakni bagian-bagian yang jelas kita harapkan sepenuhnya transparan pada gambar akhir. Area di dalam mask itu harus masih memuat sebagian besar bayangan halo hitam gambar. Dalam kasus ini ada banyak interaksi antara gambar sebenarnya dan sisa latarnya, jadi saya memilih faktor fuzz '1%' yang masih menyisakan area luas di sekeliling gambar. Pada kasus lebih lazim tanpa bayangan, area ini bisa lebih kecil lagi, sampai nilai non-persen seperti 5 atau 10. Mask kedua harus punya 'fuzz' cukup besar untuk melahap semua piksel semitransparan yang ada. Yakni, tepat sampai dan sebaiknya benar-benar masuk ke tepi gambar tanpa melenyapkan tepinya sama sekali, ataupun 'bocor' ke dalam gambar sebenarnya (lihat gambar terakhir di atas). Negatif dari mask ini justru akan mewakili semua piksel yang akan sepenuhnya buram (dan dengan demikian mewakili bagian dalam) pada gambar akhir. Pemilihan ini bisa sulit dan mungkin butuh banyak coba-coba untuk menemukan nilai terbaik. Untuk gambar ini, fuzz sangat tinggi '32%' bisa dipilih tanpa masalah berarti. Pada dasarnya Anda ingin nilainya cukup tinggi agar gambar akhir tidak memuat piksel 'latar' asli sama sekali, tetapi tanpa mask itu menggerogoti (atau bocor ke) bagian dalam gambar. Bahkan mungkin perlu sedikit penyuntingan tangan agar mask-nya pas benar bila ada celah pada warna 'tepi' di sekeliling. Kini mask ini bisa kita pakai untuk mengekstrak 'inti' atau bagian dalam gambar kita. Yaitu bagian-bagian yang kita yakin tidak mengandung semitransparansi apa pun terhadap pola latar yang sedang kita hapus. |

  magick diff_mask_32.png -channel blue -separate +channel -negate \
          letter.png +swap -alpha Off -compose CopyOpacity -composite \
          letter_inside.png

[IM Output]
Perhatikan cara saya mengekstrak mask biru dari gambar-gambar hasil floodfill. Selain itu, akibat sifat semua-atau-tidak dari floodfill, mask itu akan memperlihatkan efek tangga atau alias yang berat di sekitar tepi. Inilah masalah yang akan bisa kita perbaiki dengan mask kedua. Ingat, gambar ini hanya berisi piksel-piksel yang kita tahu tidak berinteraksi dengan latar asli, dan akan dibiarkan apa adanya pada gambar akhir. Ia tidak memuat efek bayangan maupun piksel anti-aliasing yang justru sedang saya coba pulihkan. Memulihkan piksel-piksel itulah letak kerja yang sesungguhnya. Dengan menegasikan dan mengurangkan (mengalikan) kedua mask, kita bisa membuat mask baru yang mendefinisikan area tempat kita ingin mengekstrak piksel tepian atau bayangan semitransparan... |

  magick diff_mask_01.png -negate diff_mask_32.png \
          -channel blue -separate +channel -compose multiply -composite \
          mask_aliasing_area.png

[IM Output]
Area ini lalu dipakai untuk mengekstrak piksel anti-aliasing dari mask selisih, yang menentukan seberapa transparan piksel-piksel itu seharusnya. Kita normalkan piksel-piksel itu untuk mendapat transisi mulus dari buram ke transparan. |

  magick diff_mask.png -channel red -separate +channel \
          mask_aliasing_area.png -alpha Off -compose CopyOpacity -composite \
          -background gray30 -compose Over -flatten -normalize \
          mask_antialiased_pixels.png

[IM Output]
Makin terang warna pada mask di atas, makin buram pikselnya. Sebaliknya makin gelap warnanya, makin transparan jadinya. Perhatikan bahwa saya memakai latar abu-abu di sini untuk memastikan warna transparan yang ada dalam gambar tidak mengganggu normalisasi gambar. Tanpa ini normalisasi tersebut akan gagal. Warna abu-abu polosnya sendiri tidak penting karena berada di luar area mask, jadi nanti akan diabaikan. Setelah tingkat transparansinya tepat, kita perlu tahu warna apa yang harus dipakai untuk piksel semitransparan ini. Warna ini biasanya sama dengan warna tepi gambar; dalam kasus ini sederhana saja, hitam. Namun karena interaksi latar asli, saya memutuskan memakai warna abu-abu gelap untuk bayangannya | _Anda perlu mencari tahu dengan suatu cara warna apa yang semestinya dipakai piksel semitransparan itu, supaya bisa menyetel warna yang benar untuk piksel anti-aliasing.

Ini bisa berupa_

  1. Warna tepi tetap (misalnya: nyaris hitam, seperti pada contoh ini)
  2. Memakai warna piksel tepi sepenuhnya buram yang terdekat (memakai morfologi. LihatSparse Color sebagai operator pengisi
  3. Dihitung: begitu alpha dan warna latar diketahui, warna latar bisa dikurangkan untuk mengoreksi warna piksel. Lihatpenghapusan latar belakang dengan dua latar di bawah.

Pada dasarnya tergantung gambar Anda.
Sekalian saja kita mask ulang gambarnya agar menyisakan piksel-piksel tepian khusus ini saja. |

  magick mask_antialiased_pixels.png mask_aliasing_area.png \
          -compose multiply -composite -negate \
          -background '#444' -channel A  -combine letter_edging.png

[IM Output]
Yang tersisa tinggal melapiskan 'inti' bagian dalam gambar dengan piksel tepian semitransparan tadi. |

  magick letter_inside.png letter_edging.png \
          -background none  -flatten    letter_recovered.png

[IM Output]
Dan sim salabim, kita punya gambar yang latarnya sudah dihapus menjadi gambar ter-anti-alias sempurna, dengan tepian dan bayangan semitransparan yang terpulihkan dengan benar. Anda bahkan bisa menumpangkannya ke latar yang sama sekali berbeda. |

  magick letter_recovered.png tile_aqua.jpg \
          -background none -compose DstOver -flatten    letter_on_aqua.png

[IM Output]
Gambar yang saya pakai untuk contoh ini sangat sulit, dengan wilayah 'tepi' yang luas. Kebanyakan gambar tidak separah itu, tetapi metode ini boleh jadi teknik penghapusan latar terbaik dan paling universal. Teknik ini kini sudah dituangkan ke dalam skrip shell bernama "**bg_removal**", yang memakai satu perintah, tanpa file sementara, dan punya sejumlah opsi tambahan atas metode masking yang dilakukan.

Penghapusan latar belakang dengan dua latar

Masalah utama teknik-teknik sebelumnya adalah Anda sungguh tidak punya cukup informasi untuk memulihkan seluruh informasi tentang objek latar depan secara lengkap. Ada dua keping informasi yang perlu dipulihkan: seberapa transparan tiap piksel objek latar depan, dan apa warna aslinya. Dan kedua keping informasi itu tidak bisa dipulihkan dengan sempurna dari satu gambar saja. Bahkan bila Anda tahu persis rupa gambar latarnya, Anda tidak bisa sekadar mengurangkannya dari objek latar depan, kecuali keduanya berwarna sangat berbeda dan diketahui. Masalahnya, Anda sungguh tidak bisa memastikan apakah warna yang terlihat memang warna yang diberikan (buram), atau pembauran antara warna lain dan latarnya (semitransparan). Warna asli tidak bisa dipisahkan dari nilai alpha yang dibutuhkan, kecuali ada sumber informasi tambahan. Satu situasi ketika seluruh detail objek latar depan bisa dipulihkan sepenuhnya adalah ketika Anda punya dua gambar berisi dua warna latar yang sangat berbeda tetapi sepenuhnya diketahui. Dalam situasi itu informasi memang cukup untuk memulihkan baik warna maupun transparansi objek latar depan, untuk penghapusan latar yang sempurna. Faktor penting dalam memilih dua gambar adalah warna latarnya harus sebisa mungkin berbeda di seluruh gambar. Yakni, kedua warna bukan hanya saling komplementer, tetapi juga berlawanan intensitasnya di semua kanal. Sebagai contoh...

[IM Input] [IM Input]

Meskipun warna latar yang dipakai berbeda, kedua gambar memuat objek yang persis sama. Objek yang ditampilkan tidak sederhana, melainkan mengandung banyak warna semitransparan. Anda bisa melihatnya dari cara latar biru tua tampak menembus lidah api pada gambar, meskipun transparansi ini nyaris tak terlihat pada latar kuning yang lebih terang. Dengan memakai dua warna, piksel semitransparan objek tumpangan akan tercampur dengan dua warna yang sangat berbeda, sehingga menjadi warna yang sedikit berbeda pada kedua gambar. Dengan mengukur seberapa berbeda tiap piksel, Anda bisa menentukan persis piksel mana yang semitransparan, dan seberapa banyak. Intinya ada cukup informasi untuk memulihkan transparansi objek tumpangan itu dengan sempurna. Memulihkan transparansi alias 'mask' tentu langkah pertama, dan sebenarnya langkah yang sangat lugas. Buat gambar selisih, lalu gabungkan dan maksimalkan selisih yang ditemukan di tiap kanal. |

  magick match_navy.gif match_gold.gif \
          -compose difference -composite -separate \
          -evaluate-sequence max -auto-level -negate \
          match_alpha.png

[IM Output]
Gambar hasil ini adalah peta sempurna dari seberapa transparan tiap piksel. Ia pada dasarnya 'mask alpha' dari objek asli pada gambar-gambar sumber. Namun ini hanya bekerja jika gambar tumpangan mengandung baik area yang sepenuhnya transparan maupun sepenuhnya buram. Jika tidak, alih-alih langkah normalisasi ("-evaluate-sequence max -auto-level") di atas, Anda perlu membagi tiap kanal dengan selisih kedua warna latar. Yakni membagi dengan nilai antara 0.0 dan 1.0; makin besar selisihnya makin baik. Jika kedua warna latar adalah hitam murni dan putih murni, tidak diperlukan normalisasi, cukup selisih kedua gambar. Selisih itu lalu dinegasikan sehingga selisih maksimum menghasilkan alpha nol alias transparan penuh, dan tanpa selisih menghasilkan alpha maksimum alias buram penuh. Tugas berikutnya lebih sulit: karena warna tiap piksel semitransparan dimodifikasi oleh latar, Anda tidak bisa sekadar memakai mask alpha untuk mengekstrak objek dari salah satu gambar sumber. Sebagai contoh... |

  magick match_navy.gif match_alpha.png \
          -alpha Off -compose Copy_Opacity -composite \
          match_bad_colors.png

[IM Output]
Pada dasarnya yang kita dapat adalah halo mengerikan berwarna latar pada 'lidah api' semitransparan gambar. Sama sekali bukan hasil yang bagus. Ini dikenal sebagai 'color spill' (istilah dari masking chroma key, yang juga dikenal sebagai teknik layar biru atau hijau) dan bisa menjadi masalah besar. Yang perlu kita lakukan adalah membuang warna latar dari piksel-piksel semitransparan. Namun karena kanal alpha gambar asli sudah kita pulihkan, kita tahu persis berapa banyak warna yang perlu dibuang dari tiap piksel demi memulihkan warna asli tumpangannya. Untuk itu kita bukan hanya butuh salah satu gambar sumber dan kanal alpha yang barusan diekstrak, tetapi juga perlu tahu warna persis latar pada gambar sumber itu. Masalah yang relatif mudah bila memakai latar satu warna polos, seperti pada contoh-contoh ini. Sebagai contoh, di sini saya memulihkan warna-warna aslinya... |

  magick match_navy.gif match_alpha.png -alpha Off \
          -fx "v==0 ? 0 : u/v - u.p{0,0}/v + u.p{0,0}" \
          match_alpha.png -compose Copy_Opacity -composite \
          match_recovered.png

[IM Output]
Saya memakai piksel pojok kiri-atas (formula FX 'u.p{0,0}') pada gambar sumber sebagai warna latar yang dibuang dari piksel semitransparan. Sesuaikan ini, atau langsung substitusikan warna yang akan dibuang bila perlu. Kunci pemulihan warna adalah operasi pengurangan terbaur FX yang rumit di atas. Ia akan menguatkan warna asli ('u') gambar sumber sesuai mask alpha ('v'), lalu mengurangkan warna latar (u.p{0,0}, alias piksel pojok kiri-atas) dari hasil akhirnya. Formulanya tidak lurus-lurus saja, dan terima kasih besar patut diberikan kepada HugoRune, dalam diskusi forum IM Undo a Composite -dissolve, yang menentukan matematika yang diperlukan. Diskusi itu juga membahas persis bagaimana semua langkahnya bekerja, bagaimana diturunkan, dan bahkan bagaimana Anda juga bisa mengekstrak tumpangan dari dua pola latar apa pun yang diketahui tetapi berbeda. Berikut seluruh rangkaiannya dalam satu perintah. |

  magick match_gold.gif match_navy.gif -alpha off \
          \( -clone 0,1 -compose difference -composite \
             -separate -evaluate-sequence max -auto-level -negate \) \
          \( -clone 0,2 -fx "v==0?0:u/v-u.p{0,0}/v+u.p{0,0}" \) \
          -delete 0,1 +swap -compose Copy_Opacity -composite \
          match_recovered_2.png

[IM Output]
| _Pada IM v6.6.8-3, jika FX merujuk piksel transparan memakai 'p{}', ia mendapat nilai nol alih-alih nilai warna sepenuhnya-transparan yang sesungguhnya! Ini bug, yang sudah dilaporkan dan diperbaiki pada IM v6.6.8-5. Tidak diketahui kapan bug ini muncul.

Ini hanya menjadi masalah jika Anda memutuskan menggabungkan dulu gambar alpha ke gambar sumber, baru kemudian mencoba memperbaiki warna semitransparan alias 'spill' memakai warna latar yang diketahui._
Kali ini gambar latar 'emas' yang dipakai untuk ekstraksi warna, dipilih lewat angka '0' pada operasi "-clone" kedua, tetapi gambar sumber mana pun bisa dipakai. Satu peringatan saja. Perintah di atas mengasumsikan piksel kiri-atas adalah warna latar yang murni. Jika bukan, Anda mungkin harus mengubah perintahnya untuk menentukan warna piksel tertentu, atau memakai gambar ketiga yang memang memuat informasi warna latar yang benar. Metode terakhir itu vital bila warna latar tidak konstan di seluruh gambar, meski komplikasi itu pun bisa diatasi. Berikut rangkaian yang lebih sederhana untuk gambar yang ditumpangkan ke latar hitam murni dan putih murni. Dalam kasus ini warna selalu dipulihkan dari gambar berlatar hitam, karena tinggal pembagian sederhana, sehingga komposisi Divide yang lebih cepat bisa dipakai menggantikan operator FX rakitan yang sangat lambat.

  magick match_black.gif match_white.gif -alpha off \
          \( -clone 0,1 -compose difference -composite -negate \) \
          \( -clone 0,2 +swap -compose divide -composite \) \
          -delete 0,1 +swap -compose Copy_Opacity -composite \
          match_recovered_3.png

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

Foto studio untuk pemulihan latar Latar yang ideal adalah hitam matte (tak memantul) dan putih murni sederhana (tak memantul). Latarnya juga harus semulus dan serata mungkin gradasinya. Untuk pemotretan yang khusus ditujukan bagi penghapusan latar, dua warna komplementer bisa bekerja lebih baik. Misalnya memotret dengan latar hijau dan magenta. Pada dasarnya Anda perlu mengganti layar warna latar dengan suatu cara sebelum mengambil foto kedua. Perhatikan bahwa urutan kedua foto tidak berpengaruh pada penghapusan latar, tetapi keduanya harus sebersih dan seseragam mungkin, dan objek utama maupun kamera harus tetap diam dan terpasang sempurna. Cara yang lebih baik mungkin sekadar menempatkan layar putih cukup jauh di belakang objek dan menerangi layar itu secara merata dengan dua lampu berwarna berbeda agar tidak menimbulkan bayangan dari objek. Dengan teknik ini Anda bisa berpindah ke warna latar satunya tanpa perlu perubahan fisik apa pun di studio untuk mengambil dua foto dengan dua latar berbeda. Teknik dua warna latar ini semestinya bekerja baik untuk objek transparan, tetapi pantulan, ataupun pelengkungan latar atau efek 'lensa' oleh objek yang difoto, tidak akan terekam oleh teknik ini, hanya transparansinya. Sebaliknya, pantulan sumber cahaya konstan pada objek justru akan terawetkan! Jika Anda mencoba ini, beri tahu kami, dan berikan contoh foto sumber beserta hasil Anda untuk dimuat di sini. Nama Anda akan dicantumkan dengan tautan ke situs Anda agar bisa dilihat orang.
Pemulihan latar video Jika Anda punya deret gambar yang cukup besar dengan banyak latar berbeda tapi kompleks (misalnya video), Anda bisa mencoba mengambil nilai minimum dan maksimum dari semua gambar untuk menghasilkan gambar latar yang nyaris hitam murni dan putih murni untuk dipakai. Makin banyak gambarnya, makin baik cara ini bekerja. Dengan kedua gambar itu, logo konstan mana pun beserta semitransparansinya bisa diekstrak, dan teknik yang sama lalu bisa dipakai untuk menghapusnya dari semua frame. Namun ini hanya bekerja untuk tumpangan semitransparan yang konstan, dan mungkin tidak bekerja untuk logo yang memakai distorsi warna atau rona, atau bahkan logo satu warna polos. Tapi setidaknya ia membiarkan Anda menentukan bentuk persis logonya. Untuk logo yang sepenuhnya buram atau lebih sulit, pengisian lubang (lihat berikutnya) lalu bisa dipakai untuk mengisi detail yang hilang dari warna di sekitarnya. Lihat diskusi forum IM untuk perinciannya.


Pengisian lubang

Meskipun masking, penambahan transparansi, dan penghapusan latar memberi satu cara menangani elemen yang tak diinginkan, sering kali 'lubang' bukanlah hasil yang sebenarnya Anda mau. Memang Anda bisa saja menumpangkan gambar berlubang ke gambar lain untuk mengisinya, tetapi hasilnya belum tentu mulus. Untuk menghapus elemen dari sebuah gambar, Anda bukan sekadar ingin memotongnya keluar, melainkan menggantinya dengan warna, gradasi, dan tekstur bagian-bagian yang mengelilingi lubang itu. Berikut berbagai teknik untuk menentukan apa yang dipakai mengisi lubang tersebut.

Membuat lubang untuk diisi

Andaikan kita punya gambar dengan teks yang jelek... |

  magick zelda_tn.gif -gravity Southwest -annotate +8+20 Zelda zelda_text.jpg

Nah, yang sebenarnya ingin kita lakukan adalah menghapus teks itu, dan cara paling sederhana adalah me-mask-nya, sehingga tersisa 'lubang' di bekas tempat teksnya. Ini menyederhanakan masalah, karena tidak lagi penting apa yang dihapus. Kita tinggal punya lubang untuk diisi. [IM Output]
Namun untuk kasus ini saya akan membuat mask memakai garis yang digambar menutupi 'teks jelek' itu, seolah-olah seorang pengguna asal-asalan memakai editor gambar. |

  magick -size 120x90 xc:black  -stroke white  -strokewidth 7 \
          -draw 'stroke-linecap round line 9,62 36,63' \
          -threshold 10%  zelda_text_mask.gif

[IM Output]
Pembuatan 'lubang'-nya sendiri pun bisa jadi perkara pelik, dan solusi otomatisnya bisa bergantung pada apa persisnya yang ingin dihapus, atau bahkan melibatkan pembandingan ratusan gambar dengan 'teks' atau 'logo' yang sama untuk menemukan letak persisnya. Perhatikan bahwa makin kecil lubangnya, makin baik hasil akhirnya. Makin banyak informasi yang bisa dipertahankan dari gambar asli, makin baik hasilnya. Lubang kasar berbentuk ganjil juga lebih baik daripada lubang bergaris tepi sangat mulus. Jadi meluangkan waktu untuk membuat lubang sekecil mungkin yang menghapus semua efek tak diinginkan bisa membawa perbedaan besar. Sekarang mari pakai mask itu untuk memotong lubang dari gambar, sekalian memeriksa bahwa ia menutupi semua bagian yang tak diinginkan. |

  magick zelda_text.jpg \( zelda_text_mask.gif -negate \) \
          -compose CopyOpacity -composite   zelda_text_hole.png

Jadi di sini kita punya gambar dengan 'lubang' yang perlu diisi. [IM Output]

Pengisian dengan blur

Jadi kita punya lubang yang perlu diisi dengan suatu warna. Sesuatu yang tidak akan tampak seperti kita baru saja menghapus sesuatu dari gambar. Salah satu metode paling sederhana adalah sekadar mem-blur gambarnya, membiarkan warna di sekitar lubang 'merembes' ke dalam lubang, lalu menghapus transparansinya. |

  magick zelda_text_hole.png -blur 0x1 -alpha off zelda_text_fill.png

Banyaknya blur yang dipakai bergantung pada ukuran lubangnya. [IM Output]
Sekarang kita bisa melapiskan dari bawah gambar ter-blur ini untuk 'mengisi lubang' yang tadi kita buat...

  magick zelda_text_hole.png zelda_text_fill.png \
          -compose Dst_Over  -composite   zelda_text_removed.png

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

Dan teksnya pun hilang. Ini tidak sempurna, karena pengaburan warna di area itu membuat kentara bahwa ada sesuatu yang dihapus. Misalnya kalau Anda amati baik-baik kusen jendela di sebelah kepala Zelda, efek blur-nya terlihat. Area itu juga tampak lebih 'halus' daripada bagian gambar lainnya, yang terutama kentara pada foto. Tapi ini teknik yang tersebar luas dan cepat, dan sering Anda jumpai di video, ketika orang mencoba menghapus logo yang ditambahkan stasiun TV sebagai upaya perlindungan hak cipta. Alternatif dari menyembunyikan penghapusan adalah justru membuat penghapusan itu kentara. Misalnya jika Anda ingin melindungi anonimitas seseorang.

Sedang dikerjakan

Tautan ke metode lain. Metode pengisian lubang dengan blur via resize... Sparse Color, metode Shepard (cepat). Lihat juga snibgo, Filling holes Mem-blur piksel tepi saja...Sparse Color sebagai operator pengisi. Lihat juga snibgo, Filling holes in priority order Saya ingin memakai operator morfologi yang menyetel warna di kanal warna sambil menghitung jarak di kanal latar tersembunyi. Ini semestinya menghasilkan pengisian ala Shepard yang sangat cepat dan bebas bocor, dikenal sebagai 'Color Diffusion'. Lihat makalah Diffusion Curves yang banyak memakai teknik ini. Diskusi besar dan lama tentang pengisian lubang (penghapusan teks) ada di forum pengguna IM Text Removal Discussion. Diskusi yang lebih baru adalah Fill area with nearest colour from boundary, yang lebih membahas pengisian tanpa blur. Beberapa metode non-IM lain untuk 'pengisian lubang' guna menghapus bagian gambar diperlihatkan di Stack Overflow, Remove text from jpeg. Misalnya memakai Python Skimage. Atau memakai inpainting Python OpenCV