Contoh penggunaan ImageMagick -- dasar-dasar warna dan kanal
- Apa itu warna?
- Ruang warna RGB
- Ruang warna CMY
- Ruang warna CMYK
- Koreksi gamma
- Gamma monitor Anda
- Koreksi ruang warna sRGB
- Konflik nama warna
- Memisahkan gambar kanal
- Kanal grayscale dari ruang warna
- Metode pemisahan kanal lainnya
- Menggabungkan gambar kanal RGB
- Menggabungkan gambar kanal non-RGB
- Menghasilkan roda warna HSL
- Ruang warna perseptual (Lab, Luv)
-
Mengganti warna dalam gambar (mengganti warna tertentu)
- Mengganti warna di dalam gambar
- Floodfill dengan draw
- Operator floodfill
- Faktor fuzz, mencocokkan warna yang berdekatan
- Jarak faktor fuzz
- Faktor fuzz dan warna transparan
Gambar raster, yang secara umum menjadi objek kerja ImageMagick, pada dasarnya terdiri atas larik titik atau piksel warna satu per satu. Memodifikasi tiap titik dan cara titik itu direpresentasikan adalah yang akan kita lihat di bagian ini. Di bagian berikutnya kita akan melihat modifikasi warna yang lebih umum dan menyeluruh pada sebuah gambar secara keseluruhan.
Apa itu warna?
Untuk benar-benar memahami warna, Anda perlu tahu persis apa itu warna. Di dunia fisik, warna sebenarnya adalah ilusi. Kita melihat warna karena mata kita menangkap dunia fisik dengan cara yang sangat khusus dan terbatas. Pada dasarnya di dalam mata kita ada sensor khusus untuk merah, hijau, dan biru, ditambah satu sensor kecil untuk penglihatan tepi dan kondisi minim cahaya. Sensor terakhir inilah sebabnya pada malam hari kita hanya melihat warna abu-abu.
Untuk keterangan lebih lanjut lihat Wikipedia, Cone Cells; grafik di sebelah kanan adalah respons mata manusia pada umumnya terhadap panjang gelombang cahaya yang berbeda-beda. Karena itu kita hanya menangkap dunia dalam bentuk panjang gelombang elektromagnetik merah, hijau, dan biru, dan inilah sebabnya gambar dan pemrosesan gambar pada umumnya berkisar pada merah, hijau, dan biru, atau RGB. Namun persoalannya tidak sesederhana itu juga. Masing-masing sensor warna kita sebenarnya menanggapi satu rentang panjang gelombang. Misalnya ketika kita melihat cahaya kuning, sebenarnya kita menangkap cahaya itu dengan sensor merah dan sensor hijau sekaligus. Seandainya sensor warna kita benar-benar hanya mendeteksi merah dan hijau murni, kita sama sekali tidak akan melihat warna kuning. Pelangi malah akan tampak berlubang. Artinya, TV atau layar komputer sebenarnya mengelabui kita agar melihat kuning, dengan memancarkan campuran cahaya merah dan hijau yang pas alih-alih cahaya kuning yang sesungguhnya. Sensor warna kita menangkap intensitas yang sama seperti pada cahaya kuning murni, sehingga kita pun melihat kuning, padahal kenyataannya kita sedang melihat dua frekuensi warna yang berbeda. Kita memang tidak bisa membedakan kuning murni dari campuran cahaya merah dan hijau. Dengan cara serupa, warna biru-merah (ungu) sebenarnya tidak ada sebagai satu panjang gelombang tertentu, melainkan hanya sebagai campuran setidaknya dua frekuensi warna, meskipun secara ketat violet memang frekuensi tersendiri yang kita tanggapi, terutama lewat sensor biru dan sedikit sekali lewat dua sensor lainnya. Perhatikan bahwa kita sebenarnya punya sensor penglihatan keempat, tetapi bukan sensor warna melainkan detektor cahaya redup, yang dipakai untuk penglihatan malam ketika sensor kerucut tidak lagi bekerja dengan baik. Inilah sebabnya malam hari tampak monokromatik dan cahaya bulan serba abu-abu. Sensor ini juga barangkali menjadi alasan mengapa ruang warna sRGB (lihat di bawah) memiliki komponen linear yang ganjil untuk warna-warna yang sangat gelap. CATATAN SAMPING: Hewan lain memiliki sensor yang berbeda dari kita. Lebah dan kebanyakan serangga lain punya sensor untuk ultraviolet, sehingga bagi mereka gambar cetak, TV, dan papan reklame kita mungkin nyaris tidak bermakna. Kemungkinan besar gambar buatan itu akan tampak lebih mirip gambar warna palsu yang mengerikan ketimbang warna nyaris sempurna yang kita manusia dikelabui untuk melihatnya. Sebagian hewan punya 4 sensor warna, sementara yang lain hanya punya satu (hitam putih) atau dua. Sebagian hewan juga jauh lebih peka pada gerakan daripada pada warna tertentu. Banteng misalnya, tidak bisa melihat merah, hanya panjang gelombang biru-violet dan hijau, tetapi jubah yang dikibas-kibaskan akan tampak sebagai kilatan warna 'gerakan'. Bagi banteng, siklus penyegaran monitor 50/60Hz mungkin tampak seperti kilatan 'gerakan' alih-alih gambar yang masuk akal! Untuk informasi lebih lanjut lihat Wikipedia, Color Vision dan Wikipedia, Color.
Ruang warna RGB dan kanal
Jadi ruang warna RGB sebenarnya adalah cara merepresentasikan gambar memakai tiga nilai, merah, hijau, dan biru, yang akan mengelabui kita seolah-olah sedang melihat sesuatu di dunia nyata. Dengan begitu gambar dapat disimpan sebagai 3 larik nilai, dan ketiga nilai itu bersama-sama membentuk satu piksel, atau titik warna, yang akan ditampilkan. Masing-masing dari ketiga larik nilai itu disebut kanal, yang tak lain adalah gambar grayscale yang menyatakan seberapa banyak cahaya yang harus dihasilkan untuk satu sensor warna kita saja. Sebagai contoh, berikut komponen merah, hijau, dan biru dari sebuah gambar mawar. ![[IM Output]](../static/img/images/rose.gif)
Mawar | | ![[IM Output]](../static/img/color_basics/separate_RGB_0.gif)
Merah | ![[IM Output]](../static/img/color_basics/separate_RGB_1.gif)
Hijau | ![[IM Output]](../static/img/color_basics/separate_RGB_2.gif)
Biru
Perhatikan betapa gambar 'Merah' jauh lebih terang dalam menampilkan mawar dibandingkan dua komponen warna lainnya. Tetapi ketiga gambar itu sama-sama terang pada bercak putih di dekat bagian bawah. RGB adalah warna aditif Nah, warna merah, hijau, dan biru disebut warna 'aditif'. Artinya, warna-warna itu dijumlahkan untuk membentuk gambar berwarna yang final. Ini karena ketiganya adalah warna dominan yang dilihat mata kita, dan dengan menggabungkannya kita praktis dapat menghasilkan hampir semua warna yang bisa dilihat mata kita. Sifatnya aditif dalam arti prosesnya dimulai dari hitam, misalnya monitor yang kosong, lalu menambahkan cahaya merah, hijau, dan biru untuk menghasilkan warna yang sesuai bagi gambar yang kita lihat. Kuncinya adalah bermula dari hitam, atau ketiadaan cahaya, lalu menambahkan merah, hijau, dan biru dalam takaran yang pas. Efek yang sama juga bisa diperoleh dengan menyorotkan tiga senter yang ujungnya ditempeli selofan merah, hijau, dan biru di dalam ruang gelap. Ketika ketiga warna itu menyinari titik yang sama, misalnya pada dinding putih, yang kita lihat adalah putih. Karena cara mata kita melihat warna 'primer' inilah gambar berwarna umumnya dinyatakan dalam nilai RGB, yang juga disebut 'kanal warna'.
Ruang warna CMY
Saat mencetak, persoalannya berbeda. Selembar kertas tidak dapat menghasilkan cahaya, hanya memantulkannya. Karena itu prosesnya harus dimulai dari permukaan yang memantulkan seluruh cahaya yang mengenainya, ke segala arah. Permukaan seperti itulah yang kita sebut putih. Diharapkan cahaya yang dipantulkannya sendiri adalah cahaya putih murni, entah dari matahari yang masuk lewat jendela atau dari lampu di ruangan kita. Nah, untuk membuat gambar di atas kertas itu tinta perlu dibubuhkan pada permukaannya, dan tinta itu sebenarnya membuang panjang gelombang cahaya tertentu. Karena yang kita 'tangkap' adalah warna merah, hijau, dan biru, itulah warna-warna yang ingin kita buang secara selektif dari cahaya yang dipantulkan lembar kertas putih tadi. Karena itu kita memakai tinta cyan untuk membuang cahaya merah, magenta untuk membuang cahaya hijau, dan kuning untuk membuang cahaya biru. Banyaknya tinta cyan, magenta, dan kuning yang diperlukan untuk menghasilkan warna tertentu menghasilkan apa yang disebut ruang warna CMY. Di sini saya membuat mask tinta yang diperlukan untuk menghasilkan gambar mawar hanya dengan tinta cyan, magenta, dan kuning (dengan asumsi tintanya 'linear') ![[IM Output]](../static/img/images/rose.gif)
Mawar | | ![[IM Output]](../static/img/color_basics/separate_CMY_0.gif)
Cyan | ![[IM Output]](../static/img/color_basics/separate_CMY_1.gif)
Magenta | ![[IM Output]](../static/img/color_basics/separate_CMY_2.gif)
Kuning
Artinya, makin terang nilai mask cyan, makin banyak tinta cyan yang dibutuhkan untuk membuang lebih banyak merah. Dengan kata lain, mask cyan adalah negatif persis dari banyaknya cahaya merah yang kita ingin dipantulkan kertas. Sebenarnya ketiga gambar kanal di atas adalah negatif persis dari yang dihasilkan untuk ruang warna RGB. Jadi sesungguhnya, untuk mengubah gambar RGB menjadi gambar CMY, yang perlu dilakukan hanyalah menegasikan gambar lalu menyatakan bahwa gambar itu berada dalam ruang warna CMY. Karena kita membuang panjang gelombang secara selektif, cyan, magenta, dan kuning dikenal sebagai 'warna subtraktif'.
Ruang warna CMYK
Masalah utama dari membuang panjang gelombang secara selektif adalah bahwa membuang seluruh cahaya merah, hijau, dan biru dengan membubuhkan ketiga tinta cyan, magenta, dan kuning ternyata tidak benar-benar membuang seluruh cahaya yang dipantulkan. Akibatnya yang tersisa bukan warna hitam, melainkan warna cokelat kusam yang tampak mengerikan. Tinta (atau penyaring cahaya) tidak sempurna, sebagaimana mata kita sendiri juga tidak sempurna. Seperti sudah saya sebutkan tadi, masing-masing sensor warna kita tidak melihat satu panjang gelombang cahaya saja, melainkan satu rentang panjang gelombang yang kita tafsirkan sebagai 'merah', 'hijau', atau 'biru' (atau campuran warna-warna itu). Begitu lebarnya sampai-sampai sensor cahaya 'biru' kita sebenarnya masih bisa melihat (walau tidak begitu baik) sedikit ultraviolet. CATATAN SAMPING: penyaring 'lampu ultraviolet' sengaja dibuat tidak sempurna, agar kita 'sekadar bisa melihat' cahaya dari lampu semacam itu, sehingga kita tahu lampunya menyala atau tidak. Karena 'kebocoran' warna dari tinta CMY inilah, dan karena mata kita sendiri tidak sempurna, kita menambahkan pula tinta hitam murni ke dalam campuran, sehingga tinta itu dapat dipakai untuk menghapus SELURUH cahaya yang mungkin dipantulkan kertas. Agar tidak tertukar dengan biru, tinta atau kanal hitam diberi huruf K. Jadi untuk pencetakan kita memakai empat tinta berwarna: Cyan, Magenta, Yellow, dan blacK; dan gambar didefinisikan dengan tinta-tinta ini sehingga membentuk ruang warna CMYK. Sebagai contoh, berikut komponen CMYK yang sesuai, dipisahkan dari gambar ini. ![[IM Output]](../static/img/images/rose.gif)
Mawar | | ![[IM Output]](../static/img/color_basics/separate_CMYK_0.gif)
Cyan | ![[IM Output]](../static/img/color_basics/separate_CMYK_1.gif)
Magenta | ![[IM Output]](../static/img/color_basics/separate_CMYK_2.gif)
Kuning | ![[IM Output]](../static/img/color_basics/separate_CMYK_3.gif)
blacK
Perhatikan bahwa jumlah cyan, magenta, dan kuning telah berkurang dan kini lebih gelap dibandingkan pada ruang warna CMY, karena pemakaiannya digantikan oleh sejumlah hitam yang sepadan. Artinya, ketika ketiga tinta hadir bersama pada suatu piksel, yang dipakai adalah hitam. Jadi untuk mencetak hitam murni, misalnya, cukup dipakai tinta hitam murni tanpa tinta lain. Ingat bahwa 'blacK' di atas adalah banyaknya tinta hitam yang dibubuhkan ke selembar kertas, jadi makin terang gambar kanal grayscale-nya, makin banyak tinta hitam yang harus dipakai. Dengan demikian gambar itu pun tampak seperti negatif, sama seperti tiga gambar lainnya. Tentu saja menambahkan hitam murni pada printer warna membuat pencetakan teks hitam jauh lebih sederhana, karena tidak perlu lagi mencetak tiga tinta berbeda yang harus tertumpuk sempurna di titik yang sama untuk menghasilkan garis, huruf, dan bentuk hitam murni. Ini berarti jauh lebih sedikit tinta, kertas menjadi tidak terlalu 'basah' dan lebih kecil kemungkinannya meleber atau mengotori, yang khususnya menguntungkan bagi printer. Untuk pembahasan serupa tentang cara kerja warna RGB dan CMYK, lihat halaman pengantar dari XaraXone Workbook, Defining Color.
Ruang warna lainnya
Ruang warna lain hanyalah cara lain untuk merepresentasikan warna yang sama itu, atau sebagian warna di luar RGB murni yang masih dapat ditangkap mata kita yang tidak sempurna ini. Namun ruang warna semacam itu hampir tidak berpengaruh pada penampilan warna di monitor maupun pada pencetakan. Pada dasarnya semuanya mewakili cara lain untuk menangani dan/atau memproses warna sebuah gambar, agar hal-hal tertentu dapat diperkuat atau ditonjolkan, misalnya...
- Penanganan non-linear yang lebih baik untuk warna gelap (sRGB)
- Pelangi warna dan rona (ruang warna HSB,HSL,HSI,OTHA - intensitas tidak dipertahankan)
- Warna dengan definisi terstandardisasi (XYZ)
- Perbedaan warna yang presisi atau perseptual (ruang warna LAB dan LUV, beserta padanan rona siklisnya LCHab dan LCHuv)
- Rentang dinamis tinggi yang diperluas (untuk dipakai dengan gambar HDRI) (scRGB)
- Kompresi nilai warna yang lebih baik (seperti pada YIQ dan YUV)
- Transmisi untuk TV (YCbCr, YPbPr, dengan Y = sinyal BW)
Satu ruang warna terakhir yang belum saya sebut adalah 'GrayScale', tetapi itu hanyalah satu larik nilai piksel yang sederhana. Cara menafsirkan nilai-nilai ini bermacam-macam karena bisa mewakili banyak hal yang berbeda. Biasanya gambar semacam itu dianggap Linear-Grayscale dan mirip dengan RGB linear (berbeda dengan sRGB yang non-linear). IM versi 6 sebenarnya tidak punya ruang warna grayscale semacam itu, dan hanya memalsukannya dengan ruang warna RGB linear, yaitu dengan menyetel semua nilai RGB ke angka yang sama. Jika ketiga nilai itu tidak sama, gambar tersebut bukan lagi grayscale. Pada IM versi 7, Greyscale adalah gambar satu kanal (pemakaian memori jauh lebih kecil). | _Perubahan 'colorspace' sebuah gambar di atas hanyalah penataan kasar warna gambar itu di dalam memori. Perubahan itu juga menyediakan konversi warna yang sangat mendasar (sederhana) antarruang warna yang berbeda.
Untuk spesifikasi warna dan konversi warna yang persis, sebaiknya dipakai profil warna, tetapi cara ini hanya berfungsi bila memakai format file gambar yang dapat menangani profil warna.
_
Koreksi gamma dan ruang warna sRGB
Persepsi warna manusia
Di atas kita sudah melihat bahwa gambar dapat direpresentasikan dengan banyak cara yang berbeda. Semua ruang warna yang kita lihat di atas dikenal sebagai ruang warna 'linear', artinya nilai yang dipakai benar-benar mewakili nilai 'intensitas' warna yang sesungguhnya di dalam gambar. Namun kenyataan tidak pernah sesederhana itu. Tidak pernah! Sebagai contoh, mari kita hasilkan dan simpan sebuah gambar berisi deret nilai abu-abu yang linear... |
magick -size 100x100 gradient:'gray(100%)-gray(0)' \
-set colorspace sRGB gradient.gif
- Penggunaan "
gradient:'gray(100%)-gray(0)'" memastikan IM menghasilkan gradien berisi data RGB linear, yang akan berada dalam ruang warna RGB linear. - "-set colorspace sRGB" memberi tahu IM bahwa gradien 'linear' ini sebenarnya berada dalam "sRGB" sehingga tidak perlu 'dikoreksi' saat disimpan ke format file gambar GIF yang hanya bisa menyimpan nilai ruang warna sRGB.
Nah, nilai warna yang sebenarnya dipakai dalam gambar ini adalah gradien linear yang mestinya berubah mulus dari putih di atas ke hitam di bawah, dengan abu-abu 50% yang secara matematis persis di tengah. Namun bila gambarnya diamati, gambar itu justru seolah-olah mengandung jauh lebih banyak warna gelap (mendekati hitam) daripada warna terang (mendekati putih). Mengapa? Karena penglihatan manusia, ketika diberi intensitas cahaya yang hanya setengah dari rentang maksimumnya ('putih'), tidak melihat abu-abu nada tengah murni sebagaimana ditunjukkan nilai warnanya, melainkan warna yang jauh lebih gelap. Akibatnya gradien linear di atas tidak tampak sebagai sebaran warna yang linear dan seragam dari putih ke hitam, melainkan punya jauh lebih banyak warna gelap daripada seharusnya. Hubungan antara nilai gambar yang sebenarnya dan nilai yang dipersepsikan kira-kira berupa 'fungsi pangkat' berbentuk...
**_perceived_grey_ = _value_ 2.2**
Nilai '2.2' adalah nilai rata-rata fungsi gamma, yang khas bagi kebanyakan manusia.
Koreksi gamma
Koreksi gamma adalah cara menyesuaikan nilai warna yang benar-benar disimpan, sehingga sebaran warna pada gambar akhir tampak jauh lebih seragam. Pada dasarnya, karena penglihatan manusia membuat cahaya tampak lebih gelap dengan faktor pangkat 2.2, maka agar gambar linear 'terlihat' linear kita perlu membalik fungsi pangkat itu memakai nilai 1/2.2. Jadi, agar sebuah gambar terlihat linear, kita perlu mengoreksinya dengan rumus berikut...
**_gamma_corrected_value_ = _value_ 1/2.2**
IM menyediakan koreksi gamma lewat operator level, argumen gamma, atau lebih khusus lagi lewat operator gamma. Namun nilai gambar juga dapat langsung dimodifikasi dengan fungsi Evaluate POW.
Jadi mari kita terapkan dan lihat hasil 'gambar yang terkoreksi gamma'.. |
magick -size 100x100 gradient:'gray(100%)-gray(0)' -gamma 2.2 \
-set colorspace sRGB gradient_gamma.gif
![[IM Output]](../static/img/color_basics/gradient_gamma.gif)
Perhatikan bahwa kini gambarnya punya porsi warna terang dan gelap yang jauh lebih seimbang. Namun nilai yang sebenarnya di dalam gambar tidak lagi 'linear', dan ini dapat menimbulkan masalah ketika gambar tersebut diproses lebih lanjut. Koreksi gamma hanyalah metode 'cepat' yang kasar untuk menyesuaikan warna agar sebuah gambar 'terlihat' benar. Ini bukan metode yang lazim, apalagi metode terbaik, untuk mengoreksi gambar terhadap respons manusia. Untuk contoh yang lebih spesifik tentang koreksi gamma dalam pemrosesan gambar, lihat Mengubah ukuran dengan koreksi gamma Untuk keterangan lebih lanjut tentang koreksi gamma lihat
- Gamma Correction (Wikipedia)
- Gamma error in picture scaling (memuat satu bagian tentang penggunaan IM)
- Gamma FAQ, Image Processing
Anda mungkin juga tertarik melihat operator "-auto-gamma", yang berusaha menyesuaikan gamma untuk menghasilkan gambar RGB linear dengan porsi terang dan gelap yang sama (dalam ruang linear).
Gamma monitor Anda
Mundurlah beberapa meter dari monitor Anda lalu lihat gambar di sebelah kiri. Jika monitor (dan peramban web) Anda menampilkan gambar sRGB dengan benar, titik tempat pola 'arsir' di tengah kira-kira sama terangnya dengan gradien sRGB di sekitarnya seharusnya berada tepat di tengah. Kebanyakan monitor komputer gagal dalam tes ini! Namun TV HDMI mestinya keluar sempurna. Gambar ini dibuat dengan... |
magick -size 45x256 gradient: -size 10x256 pattern:gray50 \
-duplicate 1,0 +append -set colorspace sRGB -colorspace RGB \
monitor_sRGB.png
![[IM Output]](../static/img/color_basics/monitor_sRGB.png)
Berikut beberapa gambar serupa dengan tingkat 'gamma' yang berbeda-beda, sehingga Anda dapat melihat seberapa dekat monitor Anda dengan tampilan gamma '2.2' yang benar bagi persepsi manusia.
for gamma in 1.6 1.8 2.0 2.2 2.4
do
magick -size 45x256 gradient: -size 10x256 pattern:gray50 \
-duplicate 1,0 +append -gamma $gamma monitor_g$gamma.png
done
![[IM Output]](../static/img/color_basics/monitor_g1.6.png)
Gamma 1.6 | ![[IM Output]](../static/img/color_basics/monitor_g1.8.png)
Gamma 1.8 | ![[IM Output]](../static/img/color_basics/monitor_g2.0.png)
Gamma 2.0 | ![[IM Output]](../static/img/color_basics/monitor_g2.0.png)
Gamma 2.2 | ![[IM Output]](../static/img/color_basics/monitor_g2.4.png)
Gamma 2.4
Gambar yang (ketika Anda mundur) titik kesetaraan terangnya berada kira-kira di angka 50% menunjukkan kira-kira berapa tingkat gamma monitor Anda. Bila disetel dengan benar, monitor Anda semestinya punya tingkat gamma 2.2 yang sangat mendekati gamma ruang warna sRGB. Ketika saya menulis ini, layar lama saya (dari kantor) sangat buruk. Pengaturan gammanya sekitar 1,8, dan gammanya di bagian atas layar (lebih gelap) bahkan berbeda dari gamma di bagian bawah layar (lebih terang). Hal itu menyulitkan saya ketika membandingkan gambar di posisi yang berbeda pada layar, sebab gambar yang sama terlihat berbeda bila diletakkan pada posisi vertikal yang berbeda! Sebaliknya laptop pribadi saya (waktu itu) punya tampilan yang sangat seragam, dengan pengaturan gamma 2,0 yang lumayan menurut ukuran di atas.
Koreksi ruang warna sRGB
Menyimpan gambar memakai ruang warna sRGB sangat mirip dengan mengoreksi gamma sebuah gambar, tetapi sedikit lebih rumit agar respons mata manusia tereproduksi lebih baik, khususnya pada gradasi warna yang sangat gelap. Jadi mari kita simpan gradien linear kita dalam ruang warna terkoreksi sRGB. |
magick -size 100x100 gradient:'gray(100%)-gray(0)' \
-set colorspace RGB -colorspace sRGB gradient_sRGB.gif
![[IM Output]](../static/img/color_basics/gradient_sRGB.gif)
| Sejak IM v6.7.7 perintah di atas disederhanakan menjadi |
magick -size 100x100 gradient:white-black gradient_sRGB.gif
_Ini karena gradien linear selalu dihasilkan dalam ruang warna linear (RGB), yang memang satu-satunya cara yang masuk akal bagi operator ini.
Namun karena yang diminta adalah warna sRGB 'white-black', gradien berdata linear itu akan otomatis dikonversi ke ruang warna sRGB, sehingga menghasilkan nilai data non-linear dan gradien yang linear secara perseptual.
| _Sebelum IM versi 6.7.5 perintah di atas akan gagal karena IM menukarbalikkan makna ruang warna 'sRGB' dan 'RGB'. Karena itu pada IM versi lama kedua nama ruang warna tersebut perlu ditukar. Sebagai contoh... |
magick -size 100x100 gradient: -set colorspace sRGB \
-colorspace RGB gradient_sRGB.gif
_Keanehan penanganan ruang warna ini lama dianggap sebagai bug IMv6; meskipun rencananya hanya akan diperbaiki di IMv7, perbaikannya kemudian di-backport ke IMv6. (Catatan penerjemah: naskah asli menulis 'IMv7' di ketiga tempat, yang tidak konsisten dengan konteksnya.)
Perhatikan bahwa gradien di atas (atau gradien mana pun) tidaklah sempurna, sebab kesempurnaan memang mustahil: setiap orang melihat sesuatu dengan caranya sendiri, dengan perbedaan-perbedaan kecil. Singkatnya: _apa yang Anda lihat tidak pernah persis sama dengan apa yang dilihat orang lain (sebenarnya ini sangat Zen). sRGB tak lebih dari hampiran yang sangat baik bagi mayoritas orang, menurut banyak survei dan menurut banyak ahli cetak, cat, dan warna. Untuk rincian rumus sRGB yang persis, lihat Wikipedia, sRGB Colorspace. Model respons luminans manusia yang lebih lengkap dan akurat pernah dikembangkan dan dapat dibaca daring dalam tesis Human Vision, Just Noticeable Difference. Model itu mencakup respons adaptif pada situasi ketika pencahayaan berubah besar. World Wide Web telah menstandarkan penggunaan sRGB sebagai ruang warna bawaan yang direkomendasikan (dan masih cukup sederhana), sehingga sebaiknya dipakai untuk semua gambar yang tidak memuat informasi profil ruang warna. Artinya, untuk gambar seperti GIF, PNG, JPEG, dan TIFF. Semua format ini (kecuali GIF) memungkinkan penggunaan profil warna untuk menetapkan ruang warna gambar secara definitif. Namun format file gambar seperti PbmPlus biasanya tidak dianggap berada dalam ruang warna sRGB. Karena itu, saat bekerja dengan format file semacam itu, biasanya ada baiknya memakai "-set colorspace ..." untuk memastikan ruang warnanya sesuai harapan. Dan berikut ketiga gambar tadi disandingkan agar Anda dapat membandingkannya. ![[IM Output]](../static/img/color_basics/gradient.gif)
Linear | ![[IM Output]](../static/img/color_basics/gradient_gamma.gif)
Gamma | ![[IM Output]](../static/img/color_basics/gradient_sRGB.gif)
sRGB
Seperti terlihat, gambar yang terkoreksi gamma dan yang terkoreksi sRGB nyaris identik, dan selisihnya bila digrafikkan sebenarnya sangat kecil. Karena itu, meskipun memakai sRGB adalah metode yang lebih tepat, memakai koreksi gamma mungkin lebih mudah diterapkan. Perbedaan terbesar antara gambar sRGB dan gambar gamma terletak pada gambar yang sangat gelap. Untuk nilai Gray 8-bit sebesar 1, sRGB 60 kali lebih terang daripada gamma yang setara. Nilai 8 menjadi 5 kali lebih terang. Pada kebanyakan kasus ini tidak menimbulkan perbedaan yang kasatmata, tetapi bisa terasa ketika gambar yang sangat gelap ditangani.
Memproses gambar nyata
Kebanyakan operator pemrosesan gambar tidak peduli ruang warna apa yang dipakai sebuah gambar; operator itu menerapkan operasinya pada data kanal tanpa memedulikan ruang warnanya. Meski begitu, sebagian operator harus berupaya khusus untuk menangani data kanal tambahan bagi 'Black' dan, seperti akan Anda lihat nanti, 'Alpha' (atau transparansi 'Alpha'). Namun ruang warna sebuah gambar dapat sangat memengaruhi hasil akhir banyak operasi. Karena itu memproses gambar dalam ruang warna yang berbeda dapat menghasilkan hasil yang lebih baik. Contoh ini memperlihatkan dengan lebih gamblang mengapa memproses dalam sRGB bukan gagasan yang baik. Berasal dari diskusi tentang Color Blurs dan 'Broken Colors' di Forum Pengguna IM. Kita ambil dua warna yang memakai kanal warna berbeda lalu kita blur bersama-sama sehingga di dalam kanal itu warnanya meluruh ke nol (nilai warna yang rendah). Pertama-tama mari kita lakukan memakai kanal masukan sRGB yang bawaan. |
magick -size 40x80 xc:red xc:lime +append \
-blur 0x20 blur_sRGB.png
![[IM Output]](../static/img/color_basics/blur_sRGB.png)
Jika Anda melihat hasilnya, warnanya seolah-olah mem-blur dari merah melewati hitam lalu ke hijau. Itu karena nilai-nilai tersebut tampak lebih gelap bagi mata kita daripada seharusnya di dalam ruang warna sRGB. Di sini saya mem-blur gambar yang sama sekali lagi, tetapi memakai ruang warna RGB linear. |
magick -size 40x80 xc:red xc:lime +append \
-colorspace RGB -blur 0x20 -colorspace sRGB blur_RGB.png
![[IM Output]](../static/img/color_basics/blur_RGB.png)
Seperti terlihat, kali ini kita mendapat hasil yang jauh lebih masuk akal: warna merah dan hijau mem-blur melewati jingga. Hasil serupa juga diperoleh dengan memakai ruang warna linear lain seperti LAB atau LUV, yang akan kita bahas lebih rinci di bawah. Pada dasarnya, ketika memproses gambar yang melibatkan pencampuran warna, misalnya pada operasi seperti kuantisasi warna (pengurangan warna), tetapi juga pada mengubah ukuran gambar dan secara lebih umum mendistorsi gambar, sebaiknya gambar diproses dalam ruang warna linear agar hasilnya lebih akurat, walaupun kenyataannya sedikit orang yang melakukannya. | _Helmut Dersch (yang terkenal lewat Barrel Distortion dan koreksi lensa) menyarankan agar Anda mempertimbangkan pemakaian ruang warna linear 'LAB' untuk memproses gambar, terutama untuk mengubah ukuran dan mendistorsi gambar.
Saya sendiri hanya menyarankan agar Anda berpindah dari ruang warna masukan sRGB ke ruang warna 'linear' lain ketika menggambar, mengomposisikan, mengubah ukuran, atau mendistorsi gambar. Apakah itu RGB linear, LAB, atau LUV, mestinya tidak terlalu berpengaruh.
_
Berikut ini misalnya blur merah-biru dalam 3 ruang warna linear utama. Saya memilih warna-warna ini karena tampaknya menunjukkan perbedaan terbesar pada warna-warna antara yang dihasilkan.
for colorspace in RGB LUV LAB
do
magick -size 80x40 xc:red xc:blue -append \
-colorspace $colorspace -blur 0x30 -colorspace sRGB \
colorspace_$colorspace.png
done
Untuk contoh lain pemrosesan gambar yang memperhatikan ruang warna, lihat Resize dengan koreksi ruang warna. Lihat pula peringatan tentang nama warna dan menggambar dalam ruang warna linear, di Menggambar dengan koreksi gamma dan ruang warna
Spesifikasi warna
Warna di IM dapat ditentukan dengan banyak cara. Panduan terbaik mengenai hal ini ada di situs resmi IM, Color Names.
Warna berdasarkan nama
Banyak warna telah diberi nama khusus sehingga lebih mudah dipakai. Misalnya "RoyalBlue" adalah warna biru cerah yang agak menyimpang dari biru murni dan sedap dipandang.
Di sebelah kanan ada gambar berisi semua warna bernama yang tersedia di ImageMagick, termasuk yang memakai angka. Warna-warna itu mula-mula dipilah menjadi 3 kelompok, yaitu Off-White, Mid-Tone, dan warna gelap, lalu diplot pada tiga roda warna HSL terpisah, masing-masing dengan offset vertikal yang berbeda. Putih dan hitam murni muncul sebagai titik tersendiri di bagian paling atas dan paling bawah bagan, membentuk ujung-ujung rentang vertikalnya. Skrip yang menghasilkannya adalah "hsl_named_colors" dan mengikuti teknik yang dibahas di Penempatan terprogram gambar berlapis. | _Secara teknis, karena saya menggambar warna HSL dalam bentuk tiga dimensi 'bi-kerucut' alih-alih 'silinder', radius setiap titik warna disetel sama dengan 'Chroma' warna itu ('Saturation'/'Brightness'), bukan sekadar 'Saturation'-nya. Lihat Wikipedia: HSL and HSV.
Agar lebih tepat lagi, semestinya dipakai piramida heksagonal alih-alih kerucut, walaupun itu jauh lebih sulit dihitung dengan keuntungan yang sedikit.
_
Seperti terlihat, ada banyak nama warna pada rentang merah sampai kuning dan kelompok yang lebih kecil pada rona cyan sampai hijau. Ada gugus serupa pada kuning dan cyan yang keputih-putihan. Namun nyaris tidak ada nama untuk warna kehijauan. Pada dasarnya ada beberapa wilayah ruang warna HSL yang sangat sedikit warna bernamanya. Mencari nama warna tertentu untuk dipakai bisa jadi sulit. Namun dengan memuat gambar di sebelah kanan ke dalam program IM "display", tombol tengah tetikus dapat dipakai untuk melihat nama warna ImageMagick bagi warna tertentu yang diplot di situ.
Nama warna khusus
Ada beberapa warna khusus yang dipakai untuk keperluan khusus di dalam ImageMagick. 'None' atau 'Transparent' adalah warna hitam yang sepenuhnya transparan, dan umumnya dipakai untuk menentukan transparansi latar belakang, misalnya saat membuat kanvas warna polos atau saat memakai layer gambar. 'Opaque' hanyalah alias untuk 'Black', sehingga jarang dipakai. Biasanya warna ini hanya dipakai ketika yang dimaksud adalah SEMBARANG warna yang opak, misalnya saat melakukan pemrosesan kanal alpha.
Konflik nama warna
Nama warna dapat berasal dari tiga sumber yang berbeda, yaitu SVG, X11, dan XPM, dan kebanyakan nama menghasilkan warna yang sama dari sumber definisi mana pun. Tetapi ada beberapa nama warna yang menghasilkan warna berbeda, bergantung pada spesifikasi warna yang dipakai. Masalah terbesar adalah warna SVG 'Green' (hijau setengah terang) yang berbeda dari warna X11/XPM 'Green' (hijau RGB murni). Jika Anda menginginkan hijau murni, lebih baik memakai nama warna SVG 'Lime' yang tidak menimbulkan konflik. Wikipedia punya artikel yang bagus sekali tentang konflik nama warna, sekaligus tabel nama warna yang sesungguhnya, di X11 color names. Anda mungkin juga tertarik pada artikel Web Colors, yang menyajikan tabel tertata rapi untuk sejumlah rentang warna. Konflik yang paling menonjol ada pada empat warna tertentu. Berikut tabel konflik nama warna yang diketahui. Ingat bahwa warna SVG-lah yang dipakai IM secara bawaan. Konflik
Nama warna | Hasil SVG
(bawaan IM) | Hasil X11
untuk nama | Nama padanan
X11 | Nama warna
alternatif
Green | | #008000 | | #00FF00 | | | Lime
Maroon | | #800000 | | #B03060 | | FireBrick |
Purple | | #FF00FF | | #A020F0 | | Magenta |
Gray | | #7E7E7E | | #BEBEBE | | | Grey
Catatan tentang tabel di atas...
- '
Grey' X11 adalah warna abu-abu tengah secara visual. Warna ini juga sangat dekat (tetapi tidak persis sama) dengan warna X11 'Gray74' dan warna SVG 'Silver' ('gray(192)'). - '
Gray' bawaan (SVG) sangat dekat dengan abu-abu yang sempurna secara matematis, yang lebih baik ditentukan memakai nama warna 'Gray50' atau 'gray(128)' (untuk pemakaian 8-bit). - Karena semua warna bernama ditentukan memakai nilai 8-bit (0-255), tidak satu pun di antaranya akan menghasilkan warna abu-abu 16-bit yang murni!
- Ketika abu-abu diperlukan untuk pemrosesan matematis seperti FFT DC Phase deteksi tepi, gambar shade, efek pencahayaan komposisi, dan peta perpindahan relatif, jauh lebih baik memakai rumus warna '
gray(50%)' yang memang menghasilkan abu-abu nada tengah yang sempurna secara matematis pada kedalaman bit warna berapa pun.
Berhati-hatilah saat memilih warna untuk keperluan tertentu.
Warna dan ruang warna
Meskipun banyak warna punya nama, kebanyakan warna yang dijumpai dalam gambar tidak bernama; warna itu sekadar sekumpulan nilai, biasanya 3, yang menentukan suatu warna tertentu. Namun tiga nilai saja belum sepenuhnya mendefinisikan sebuah warna: Anda juga perlu menentukan 'colorspace' atau 'sistem warna' tempat nilai-nilai itu berada. Semua warna 'bernama' di atas berada dalam ruang warna sRGB, sebab itulah ruang warna tempat warna-warna tersebut didefinisikan. Tetapi kadang sebuah warna perlu didefinisikan dalam ruang warna yang lain, misalnya dalam HSL, atau CYMK, atau bahkan sebagai warna XYZ. ImageMagick dapat melakukannya dan rincian spesifikasi ini dapat dilihat di ImageMagick Color Names. Future: Examples of using other colorspaces (still in development) | _Meskipun RGB di ImageMagick mewakili ruang warna RGB linear, sudah menjadi praktik yang diterima bahwa nama warna 'rgb(value,value,value)' sebenarnya mendefinisikan sebuah warna sRGB.
Untuk benar-benar mendefinisikan warna RGB linear alih-alih warna sRGB, pakailah rumus warna 'icc-color(RGB,value,value,value)' (lihat berikutnya).
Sejak IM v6.7.8-3, fungsi 'icc-color(colorspace,color...)' dapat dipakai untuk mendefinisikan sebuah warna, atau mendefinisikan ulang ruang warna dari suatu warna tertentu. _Future: Examples of use
Warna semitransparan
Warna semitransparan hanya dapat ditentukan secara langsung dengan dua cara yang berbeda. Metode yang paling umum untuk menyetel warna semitransparan adalah memakai nilai heksadesimal. Sebagai contoh, berikut beberapa spesifikasi warna yang menunjukkan berbagai tingkat transparansi warna. Gambar warna yang dihasilkan saya tampilkan di atas pola latar belakang agar Anda bisa melihat pola itu menembus transparansi gambarnya.
magick -size 50x50 xc:'#00FF00FF' color_hex_1.png
magick -size 50x50 xc:'#00FF00C0' color_hex_2.png
magick -size 50x50 xc:'#00FF0090' color_hex_3.png
magick -size 50x50 xc:'#00FF0060' color_hex_4.png
magick -size 50x50 xc:'#00FF0030' color_hex_5.png
magick -size 50x50 xc:'#00FF0000' color_hex_6.png
| Sebelum IM v6.3.0, kelompok digit heksadesimal terakhir memuat transparansi warna dalam bentuk nilai 'matte' atau 'opacity'. Artinya, heksadesimal terakhir '00' mewakili 'opak' dan 'FF' berarti transparan.
Namun setelah IM v6.3.0, nilai ini dibalik sehingga mewakili nilai transparansi 'alpha', agar IM sejalan dengan standar SVG dan paket grafis lainnya. Dengan kata lain 'FF' kini mewakili sepenuhnya opak dan '00' sepenuhnya transparan.
Warna juga dapat ditentukan memakai fungsi warna khusus 'rgba()'. Di situ nilai RGB berkisar dari 0 sampai 255, dan kanal alpha ditentukan sebagai pecahan desimal antara 0.0 (transparan) sampai 1.0 (opak).
magick -size 50x50 xc:'rgba(255,0,0, 1.0)' color_rgba_1.png
magick -size 50x50 xc:'rgba(255,0,0, 0.8)' color_rgba_2.png
magick -size 50x50 xc:'rgba(255,0,0, 0.6)' color_rgba_3.png
magick -size 50x50 xc:'rgba(255,0,0, 0.4)' color_rgba_4.png
magick -size 50x50 xc:'rgba(255,0,0, 0.2)' color_rgba_5.png
magick -size 50x50 xc:'rgba(255,0,0, 0.0)' color_rgba_6.png
| Sebelum IM versi 6.2.7, 'rgba()' juga memakai nilai matte untuk nilai kanal alpha. Artinya, nilai 0 berarti sepenuhnya opak dan 255 sepenuhnya transparan. Ini diubah mengikuti ketentuan "W3C CSS3 Color Module recommendation for specifying colors", sebagai bagian dari upaya IM agar lebih patuh pada standar gambar lain, terutama untuk penggunaan WWW dan SVG.
Saat ini tidak mungkin menentukan warna semitransparan secara langsung lewat nama, dengan pengaturan nilai alpha tambahan. Namun hal itu bisa diakali dengan menghasilkan warna bernama tersebut lalu mengubah transparansi gambarnya. Ada kerumitan tambahan pula: Anda harus menyetel kanal alpha sebelum transparansi warnanya benar-benar dapat disetel.
magick -size 50x50 xc:RoyalBlue color_name_1.png
magick -size 50x50 xc:RoyalBlue -alpha set \
-channel A -evaluate set 80% color_name_2.png
magick -size 50x50 xc:RoyalBlue -alpha set \
-channel A -evaluate set 60% color_name_3.png
magick -size 50x50 xc:RoyalBlue -alpha set \
-channel A -evaluate set 40% color_name_4.png
magick -size 50x50 xc:RoyalBlue -alpha set \
-channel A -evaluate set 20% color_name_5.png
magick -size 50x50 xc:RoyalBlue -alpha set \
-channel A -evaluate set 0 color_name_6.png
Ya, ini merepotkan, dan alangkah baiknya bila transparansi dapat disetel sebagai bagian dari spesifikasi nama warna. Jika Anda ingin melihat hal itu terwujud, ajukan permintaan di Forum Pengembang IM. Warna isian bernama juga dapat digambar memakai pengaturan penggambaran MVG, walaupun untuk itu diperlukan kanvas awal yang transparan agar hasilnya benar. Sebagai contoh... |
magick -size 50x50 xc:none \
-draw "fill Tomato fill-opacity 0.5 rectangle 0,0 49,49" \
color_name_draw.png
| ![[IM Output]](../static/img/color_basics/color_name_draw.png)
| Perhatikan bahwa warna yang sepenuhnya transparan, meski sama sekali tidak terlihat, tetap punya warna. Namun kebanyakan operator IM menganggap warna apa pun yang sepenuhnya transparan sama saja dengan warna lain yang sepenuhnya transparan. Karena itu, dan karena cara kerja matematika internalnya, banyak operator kerap mengganti warna yang sepenuhnya transparan dengan hitam sepenuhnya transparan (yang juga dikenal sebagai warna khusus 'none').
Kanal warna
Data warna sesungguhnya dari sebuah gambar disimpan sebagai larik nilai, yang dikenal sebagai kanal. Biasanya sebuah gambar punya setidaknya 3 kanal, yang mewakili nilai warna merah, hijau, dan biru. Tetapi seperti terlihat di atas, nilai yang tersimpan bisa saja mewakili ruang warna lain.
Ruang warna dan penamaan kanal
Tujuan utama operator "-colorspace" adalah mengubah cara IM menyimpan warna sebuah gambar di dalam memori. Biasanya setiap gambar punya 3 (atau 4) kanal data gambar. 'Ruang warna' gambar saat itu menentukan apa yang diwakili data pada tiap kanal. Nah, biasanya kanal-kanal itu dinamai 'Red', 'Green', 'Blue', sebab memang itulah jenis data gambar yang lazim disimpan di kanal tersebut. Namun tidak selalu demikian. Jangan menganggap kanal 'R' atau 'Red' itu merah; anggaplah sebagai 'kanal 1' yang bisa memuat data untuk 'red', 'hue', 'cyan', atau hal lain bergantung pada ruang warna gambarnya. 'Red' hanyalah label bagi kanal yang biasanya dipakai untuk 'red', atau kanal pertama. Ruang warna kedua yang paling umum dipakai adalah 'CMYK', yang menyatakan banyaknya 'tinta' warna yang harus dibubuhkan untuk menggelapkan selembar kertas 'putih' (ruang warna subtraktif). Perhatikan bahwa K adalah singkatan dari "blacK", yaitu nilai intensitas gambar yang dinegasikan. Karena hal ini sangat umum, kanal 'RGB' juga punya penamaan alternatif 'Cyan', 'Magenta', dan 'Yellow', atau cukup huruf 'C', 'M', dan 'Y', padahal kenyataannya nama-nama itu merujuk ke himpunan kanal yang sama dengan yang dipakai untuk gambar 'RGB'. Kanal warna keempat yang khusus juga ditambahkan untuk kanal warna 'Black' atau 'K'. Pada dasarnya ini berarti kanal warna untuk "Green" sebenarnya merujuk ke kanal warna yang persis sama dengan yang akan dipakai untuk "Magenta". Apakah datanya sendiri 'green' atau 'magenta' BUKAN ditentukan oleh nama kanalnya, melainkan oleh 'colorspace' gambar yang ada di memori. Hal yang sama berlaku untuk ruang warna lain. Misalnya, memakai ruang warna 'LAB' berarti kanal 'Red' memuat nilai 'Lightness', kanal 'Green' menyimpan nilai 'A' (atau merah-hijau), dan kanal 'Blue' menyimpan nilai 'B' (atau biru-kuning).
Dengan cara serupa, nama kanal 'Alpha' ('A'), 'Opacity' ('O'), dan 'Matte' semuanya adalah alias bagi pengaturan "-channel" yang merujuk ke informasi transparansi gambar. Tidak jadi soal bahwa kanal 'alpha' adalah kebalikan dari kanal 'matte'; semuanya tetap merujuk ke kanal yang sama dan menghasilkan hasil yang sama, yaitu kanal matte internal gambar tersebut. Apakah sebuah operator memperlakukan data kanal alpha internal sebagai nilai 'alpha' atau tidak, bergantung pada operatornya. Operator kanal tingkat rendah seperti "-threshold" bekerja pada data 'matte' mentah milik kanal itu di memori. Namun kebanyakan operator tingkat lebih tinggi seperti "-fx" dan "-composite" memperlakukan data itu sebagai data 'alpha' untuk keperluan operasinya. Ada satu lagi cara mengendalikan ruang warna dari data gambar yang tersimpan. "-set colorspace" (ditambahkan pada IM v6.4.3-7) hanya akan mengubah pengaturan 'colorspace' di memori. Artinya, opsi ini dapat mengubah gambar RGB menjadi gambar HSL tanpa mengubah atau memodifikasi data piksel yang sebenarnya dipakai gambar itu. Pemakaian yang paling lazim adalah ketika Anda secara manual menggabungkan data kanal untuk menetapkan ruang warna akhir dari gambar hasil gabungan.
Jadi mari kita lihat bagaimana kanal warna dapat dimanipulasi. Ingat, setiap kanal hanyalah sebuah larik nilai. Semua kanal itu kemudian bergabung untuk mewakili warna sesungguhnya dari tiap piksel di dalam gambar.
Memisahkan gambar kanal
Cara termudah memisahkan tiap kanal warna adalah memakai operator "-separate" untuk mengekstrak isi tiap kanal saat itu sebagai gambar grayscale.
magick rose: -channel R -separate separate_red.gif
magick rose: -channel G -separate separate_green.gif
magick rose: -channel B -separate separate_blue.gif
| Perhatikan bahwa mawar merah menonjol pada gambar kanal merah, sementara cukup gelap pada kanal biru dan hijau. Sebaliknya, daun hijaunya menonjol pada kanal hijau tetapi tidak pada kanal lain. Bagian putih di dekat bawah gambar terang pada semua kanal. | Pada IM v5 dan sebelumnya, "-channel" bukan hanya pengaturan bagi operasi gambar berikutnya, tetapi sesekali juga menjadi 'operator gambar' yang mengubah kanal yang ditentukan menjadi gambar grayscale. Sangat membingungkan! Pada IM v6, "-separate" dibuat untuk 'memisahkan' kedua tugas yang sangat berbeda itu. Opsi "-channel" hanyalah pengaturan yang dipakai oleh operasi gambar berikutnya, sedangkan "-separate" akan mengekstrak kanal yang ditentukan menjadi gambar-gambar terpisah yang grayscale dan sepenuhnya opak. |
|---|---|
Sejak IM v6.2.9-3, operator "-separate" memungkinkan pemisahan beberapa kanal warna sekaligus sesuai pengaturan "-channel". Banyaknya butir pada pengaturan "-channel" menentukan banyaknya gambar yang dibuat (dalam urutan RGBA). Sebagai contoh, karena pengaturan "-channel" bawaan adalah 'RGB', tindakan bawaannya adalah membuat tiga gambar, yang saya keluarkan di bawah ini. |
magick rose: -separate separate_RGB_%d.gif
Dan di sini kita memakai operator "-colorspace" untuk mengubah cara IM menyimpan data warna gambar menjadi representasi warna CMYK. Lalu kita ekstrak keempat kanal warna yang terlibat.
magick rose: -colorspace CMYK -separate separate_CMYK_%d.gif
Gambar terakhir (kanal 'Black' atau 'K') menarik secara khusus karena tampak seperti gambar grayscale dari gambar aslinya yang dinegasikan. Kenyataannya gambar itu mewakili banyaknya 'tinta' yang harus dibubuhkan printer CMYK ke kertas, sehingga mengurangi banyaknya warna yang dibutuhkan kanal warna lain. Perhatikan bahwa secara bawaan pengaturan "-channel" tidak menyertakan kanal transparansi matte khusus milik gambar. Jika Anda ingin selalu menghasilkan semua kanal yang ada, pakailah pengaturan kanal "-channel ALL", atau pengaturan "-channel" berupa 'RGBA' atau 'CMYKA'.
Kanal grayscale dari representasi ruang warna
Nilai kanal tertentu dapat diekstrak dari ruang warna untuk keperluan khusus. Sebagai contoh, di sini kita mengekstrak kecerlangan atau intensitas grayscale dari gambar mawar, memakai beberapa representasi yang berbeda.
magick rose: -colorspace Gray channel_gray.gif
magick rose: -grayscale Rec709Luma channel_luma709.gif
magick rose: -grayscale Rec601Luma channel_luma601.gif
magick rose: -colorspace HSI -channel B -separate channel_average.gif
magick rose: -colorspace HSL -channel B -separate channel_lightness.gif
magick rose: -colorspace HSB -channel B -separate channel_brilliance.gif
magick rose: -colorspace CMYK -channel K -negate -separate channel_black.gif
magick rose: -colorspace LAB -channel R -separate channel_lab_light.gif
![[IM Output]](../static/img/color_basics/channel_gray.gif)
Gray
Gray | ![[IM Output]](../static/img/color_basics/channel_luma709.gif)
Rec709Luma
| ![[IM Output]](../static/img/color_basics/channel_luma601.gif)
Rec601Luma (Y)
YUV/YIQ | ![[IM Output]](../static/img/color_basics/channel_average.gif)
Average (I)
HSI/OHTA | ![[IM Output]](../static/img/color_basics/channel_lightness.gif)
Lightness
HSL | ![[IM Output]](../static/img/color_basics/channel_brilliance.gif)
Brightness
HSB | ![[IM Output]](../static/img/color_basics/channel_black.gif)
Neg Black
CMYK | ![[IM Output]](../static/img/color_basics/channel_luma709.gif)
Luminance*
LAB / LUV
Untuk rumus yang sesungguhnya, lihat acuan resmi opsi "-colorspace". Perhatikan bahwa sejak IM v6.7.7 gambar grayscale disimpan tanpa modifikasi gamma maupun sRGB, baik di memori maupun saat disimpan ke file. Karena itu gambarnya cenderung lebih gelap daripada sebelum versi tersebut. Perhatikan bahwa 'Gray' (yang juga dikenal sebagai 'Intensity', atau lebih tepatnya 'Luminance') dan 'Luma' dari ruang warna YUV adalah setara. Begitu pula 'Brightness' dari ruang warna HSB dan kanal 'blacK' ruang warna CMYK yang dinegasikan adalah setara (dan biasanya terlalu terang untuk pemakaian grayscale). Perhatikan bahwa kanal 'Lightness' dari ruang warna LAB (dan juga LUV), yang jangan dikacaukan dengan 'Lightness' dari HSL, dianggap paling cocok dengan persepsi penglihatan manusia, walaupun jarang dipakai untuk menghasilkan gambar grayscale. Perhatikan pula bahwa jika yang diberikan adalah gambar grayscale, semua gambar grayscale dari ruang warna tersebut menghasilkan gambar yang persis sama dengan gambar grayscale masukan, kecuali gambar kanal 'Lightness' ('R') untuk ruang warna LAB / LUV.
Metode pemisahan kanal lainnya
Salah satu metodenya adalah menyalin satu kanal ke semua kanal lain untuk menghasilkan gambar grayscale, persis seperti yang dihasilkan operator separate. Metode yang sederhana, tetapi lambat, adalah memakai operator FX DIY.
magick rose: -fx R channel_red.gif
magick rose: -fx G channel_green.gif
magick rose: -fx B channel_blue.gif
Cara ini sering dianggap solusi yang paling 'sederhana' untuk dipahami, dan sudah dipakai pada tutorial IM lain. Metode lain memakai bermacam-macam teknik untuk 'menolkan' kanal yang tidak diinginkan. Semuanya didaftar di Menolkan kanal warna di bawah, dan biasanya jauh lebih cepat daripada memakai "-fx".
Menggabungkan gambar kanal RGB
Setelah semua kanal warna gambar dipisahkan dan diproses, gambar-gambar itu juga perlu dapat disatukan kembali. Hal ini dapat dilakukan dengan operator daftar khusus "-combine", yang pada dasarnya persis kebalikan dari "-separate".
magick separate_red.gif separate_green.gif separate_blue.gif \
-combine -set colorspace sRGB rose_combined.gif
Ketiganya lalu di-"-combine" untuk menghasilkan gambar yang dinyatakan sebagai gambar dengan ruang warna sRGB. Ada pengguna yang ingin dapat menukar kanal merah dan biru sebuah gambar; cara ini membuatnya mudah: pisahkan kanalnya, tukar, lalu gabungkan kembali. |
magick rose: -separate -swap 0,2 -combine rose_rb_swap.gif
![[IM Output]](../static/img/color_basics/rose_rb_swap.gif)
Ingat, pengaturan "-channel" bawaan adalah 'RGB', dan pengaturan itulah yang menentukan gambar kanal mana saja yang disatukan. Jika tidak semua kanal yang digabungkan didefinisikan, kanal sisanya disetel memakai nilai warna dari pengaturan "-background" saat itu. Namun perlu diperhatikan bahwa baik "-combine" maupun "-separate" akan mengabaikan urutan kanal yang didefinisikan oleh "-channel". Kanal selalu diproses dan dihasilkan dalam urutan kanal baku 'Red,Green,Blue,Matte', untuk tiap kanal yang disetel pada pengaturan "-channel". Karena itu, meskipun Anda memakai pengaturan "-channel BR" atau sekadar "blue,red", operator "-combine" tetap mengharapkan kedua gambar itu merah dulu baru biru. Nilai hijau dan alpha (jika gambar punya transparansi) akan disetel dari nilai pengaturan "-background" saat itu. Sebagai contoh...
magick separate_red.gif separate_blue.gif -background black \
-channel blue,red -combine rose_red_blue.gif
Menggabungkan gambar kanal non-RGB
Sejak IM v6.4.3-7, Anda juga dapat mem-"-combine" gambar kanal yang mewakili ruang warna lain, tetapi IM perlu diberi tahu ruang warna apa yang harus dipakai gambar hasilnya. Ini dilakukan dengan operator khusus "-set colorspace". Operator ini pada dasarnya mengubah ruang warna sebuah gambar di memori tanpa memetakan data pikselnya, jadi data itu dibiarkan apa adanya. Setelah gambar tergabung dalam ruang warna yang tepat, operator "-colorspace" biasa dapat dipakai untuk memetakan data piksel kembali menjadi data RGB normal. |
magick separate_HSB_?.gif -set colorspace HSB -combine \
-colorspace sRGB rose_HSB_combined.gif
![[IM Output]](../static/img/color_basics/rose_HSB_combined.gif)
Metode ini juga berlaku untuk gambar CMYK, yang kerap sulit ditangani karena membutuhkan kanal warna keempat. |
magick separate_CMYK_?.gif -set colorspace CMYK -combine \
-colorspace sRGB rose_CMYK_combined.gif
![[IM Output]](../static/img/color_basics/rose_CMYK_combined.gif)
Cara pengganti lain (untuk IM versi lama) adalah memuat satu gambar (kanal merah) lalu mengubahnya agar berada dalam ruang warna yang tepat. Setelah itu tiap gambar kanal dapat dimuat satu per satu dan disalin sebagai kanal ke dalam gambar yang sudah disiapkan tadi. |
magick separate_HSB_0.gif -colorspace HSB \
separate_HSB_0.gif -compose CopyRed -composite \
separate_HSB_1.gif -compose CopyGreen -composite \
separate_HSB_2.gif -compose CopyBlue -composite \
-colorspace sRGB rose_HSB_combined_alt.gif
![[IM Output]](../static/img/color_basics/rose_HSB_combined_alt.gif)
Tentu saja jika Anda memakai operasi "-set colorspace", data untuk kanal pertama sudah berada di tempatnya, sebab operasi itu tidak mengubah data piksel yang sebenarnya, hanya cara data itu ditafsirkan. | Contoh terakhir tidak akan berhasil untuk gambar 'CMYK', karena gambar kanal 'Black' sebenarnya tidak memuat kanal black! Karena itu "-compose CopyBlack" tidak akan menemukan data yang sah untuk disalin. Saya menganggap ini bug, tetapi saat ini kecil kemungkinannya diperbaiki.
Memakai ruang warna lain bisa berguna. Sebagai contoh, di sini saya mengambil gambar mawar bawaan IM dan ingin menegasikan kanal luminans gambar itu dalam ruang warna 'Lab'. Setelah selesai, saya menggabungkannya kembali untuk membangun gambar sRGB lagi. |
magick rose: -colorspace Lab -separate \
\( -clone 0 -negate \) -swap 0 +delete \
-combine -set colorspace Lab \
-colorspace sRGB rose_light_neg.gif
![[IM Output]](../static/img/color_basics/rose_light_neg.gif)
| _Sebelumnya contoh ini memakai ruang warna 'HSL', tetapi itu ruang warna linear, sedangkan kita ingin menegasikan dalam 'ruang warna perseptual' seperti yang disediakan 'Lab'.
_
Perhatikan bahwa gambarnya masih punya warna yang sama, tetapi kecerlangan (lightness) warnanya dibalik sehingga menghasilkan efek yang aneh. "-negate" dapat diganti dengan rangkaian operasi Anda sendiri untuk menyesuaikan tingkat kecerlangan sebuah gambar. Namun karena "-negate" itu sendiri adalah operator yang dikendalikan kanal, kita tidak perlu mem-"-separate" kanal luminans lebih dulu untuk menegasikannya. |
magick rose: -colorspace Lab \
-channel R -negate +channel \
-colorspace sRGB rose_light_neg2.gif
![[IM Output]](../static/img/color_basics/rose_light_neg2.gif)
Seperti terlihat, cara ini menyederhanakan banyak hal, tetapi tidak selalu praktis untuk efek yang ingin Anda capai.
Menolkan kanal warna
Kadang Anda punya gambar (RGB atau ruang warna lain) yang salah satu atau dua kanal warnanya ingin dikosongkan atau 'dinolkan' saja, sementara kanal lainnya dibiarkan apa adanya. Misalnya, untuk membuat gambar grayscale tanpa memakai teknik grayscale RGB, kanal Saturation ('G') dalam ruang warna HSL dapat 'dinolkan' sehingga menghasilkan gambar grayscale. Nilai 'Hue' tidak bermakna ketika saturasinya nol, jadi yang tersisa adalah gambar grayscale. Teknik yang paling langsung biasanya adalah memakai operator Evaluate untuk menolkan semua nilai pada kanal yang tidak diinginkan... |
magick rose: -colorspace HSL \
-channel G -evaluate set 0 +channel \
-colorspace sRGB rose_grey.gif
![[IM Output]](../static/img/color_basics/rose_grey.gif)
Namun ada banyak cara lain yang tidak begitu kentara untuk melakukannya...
# Evaluate (fast and direct)
-channel G -evaluate set 0 +channel
# FX zeroing (direct simple, but slow)
-channel G -fx 0 +channel
# Separate the channels you want to keep,
# then combine using a background color to set the other channels
-channel RB -separate -background black -combine +channel
# Gamma which is a miss-use of the operator, but works VERY well!
# ( 1 = leave alone; 0 = zero channel; -1 = maximize channel )
# This is short, simple , needs no channel setting, but very obtuse!
-gamma 1,0,1
# Threshold channels to zero
-channel G -threshold 101% +channel
# Threshold to maximum value then negate to zero
-channel G -threshold -1 -negate +channel
# Multiply with an appropriate primary/secondary color
# The color specifies the channels to preserve! 'magenta' = 'red'+'blue'
\( +clone +level-colors magenta \) -compose multiply -composite
# Colorize specific channels to black
# (0 = leave alone; 100% set from fill (black) )
-fill black -colorize 0,100%,0
Bisakah Anda memikirkan cara lain untuk menolkan (atau memaksimalkan) kanal warna yang belum saya daftar di atas? -- kirimi saya email
Ruang warna
Sejauh ini kita berkutat pada ruang warna 'sRGB', 'RGB', dan 'CMYK'. Itu karena ruang warna inilah yang lazim dipakai untuk menampilkan, mencetak, dan menyimpan gambar ke file secara tradisional. Tetapi meskipun praktis, ruang warna tersebut tidak mewakili cara kita sebagai manusia benar-benar memandang dunia. Mata kita boleh jadi melihat dalam panjang gelombang merah, hijau, dan biru, tetapi otak kita menafsirkannya sebagai: rona warna (warna apa), keabuan (seberapa berwarna), dan intensitas (seberapa terang atau gelap). Karena itu banyak ruang warna dan sistem warna dikembangkan, sering kali berangkat dari kebutuhan yang sama sekali berbeda. Pelukis misalnya mengembangkan sistem warna (berdasarkan sumber warna seperti lapis lazuli), gradasi gelap, dan gradasi terang. Belakangan sistem komputer yang memakai RGB memerlukan cara yang lebih baik bagi pengguna untuk memilih atau mengubah warna, dengan cara yang tidak terlalu berat secara komputasi.
Ruang warna berbasis rona
Alternatif yang barangkali paling dikenal adalah sistem berbasis rona siklis, yang dikembangkan sebagai antarmuka pemilihan warna untuk warna RGB. Pada dasarnya kubus warna RGB diputar dalam 3 dimensi sehingga sumbu diagonal hitam-abu-putih kubus itu menjadi sumbu ruang warnanya. Sumbu inilah yang menentukan seberapa gelap atau terang sebuah warna. Ciri utama perubahan ini adalah konversi sederhana dari nilai RGB yang menempatkan warna primer berjarak sama mengelilingi sumbu tersebut, sehingga terbentuk Hue yang bersiklus dari merah, melewati hijau, lalu biru, dan kembali ke merah. Seberapa jauh warna itu dari sumbu tersebut (secara radial) dikenal sebagai saturasi atau chroma.
Sebagai contoh, mari kita pisahkan kanal gambar bawaan 'rose:' setelah mengubahnya ke ruang warna 'HSB' (Hue, Saturation, Brilliance, yang juga dikenal sebagai HSV, dengan V untuk Value).
magick rose: -colorspace HSB -separate separate_HSB_%d.gif
Atau 'HSL' (Hue, Saturation, Lightness) yang mirip tetapi tidak persis sama.
magick rose: -colorspace HSL -separate separate_HSL_%d.gif
Perhatikan bahwa gambar kanal 'Hue' pada kedua ruang warna itu sama-sama berupa belang-belang hitam dan putih yang nyaris murni. Itu karena Hue sebenarnya bersifat melingkar. Artinya, baik hitam maupun putih pada gambar kanal di atas sama-sama mewakili Hue 'Red', dan variasi kecil membuat ronanya melompat dari satu sisi merah (menghasilkan putih) ke sisi yang lain (menghasilkan hitam). Jika hal ini menjadi masalah, pengaturan rona dapat diputar memakai operator Modulate sehingga merah diwakili nilai rona yang lain. Perbedaan yang sesungguhnya antara 'HSL' dan 'HSB' terletak pada seberapa terang warna primer didefinisikan. Tetapi untuk melihatnya, lebih baik kita menengok representasi ruang warna yang lebih praktis, yaitu roda warna. Jika Anda melihat gambar 'brightness/lightness' terakhir pada pemisahan di atas, tampak bahwa 'HSB' memperlakukan warna 'red' yang kuat (mendekati primer) hampir sebagai putih, sedangkan 'HSL' memperlakukannya lebih seperti intensitas abu-abu nada tengah.
Menghasilkan roda warna HSL
Pemisahan warna mentah dari sebuah gambar seperti di atas masih sulit dipahami. Untuk memahami ruang warnanya dengan lebih baik, kita perlu mencoba melihatnya. Ruang warna lebih lazim digambarkan sebagai gradien polar melingkar yang menampilkan sebagian dari ruang warna itu. Gambar nilai tiap kanal dapat dihasilkan secara terpisah lalu digabungkan untuk menghasilkan jenis gambar tertentu yang sulit dibuat dengan cara lain. Sebagai contoh, di sini kita menghasilkan roda warna 'HSL' yang sempurna.
magick -size 100x300 gradient: -rotate 90 \
-distort Arc '360 -90.1 50' +repage \
-gravity center -crop 100x100+0+0 +repage angular.png
magick -size 100x100 xc:white solid.png
magick -size 100x100 radial-gradient: -negate radial.png
magick angular.png solid.png radial.png \
-combine -set colorspace HSL \
-colorspace sRGB colorwheel_HSL.png
![[IM Output]](../static/img/color_basics/angular.png)
Hue | ![[IM Output]](../static/img/color_basics/solid.png)
Saturation | ![[IM Output]](../static/img/color_basics/radial.png)
Luminance | | ![[IM Output]](../static/img/color_basics/colorwheel_HSL.png)
Roda warna HSL
| _Gambar grayscale itu dihasilkan sebagai gradien linear memakai nilai sRGB. Karena itu gradiennya cenderung terlihat sedikit lebih gelap daripada seharusnya. Namun yang penting di sini adalah nilai pada gambar masukan, bukan ruang warna yang dipakai untuk melihatnya.
Sebaliknya, gambar hasilnya, meski dibuat dalam ruang warna RGB linear, disimpan sebagai ruang warna sRGB agar peramban dan program penampil gambar lain menampilkan gradiennya dengan cara yang enak dipandang._
Perhatikan pula bahwa Hue adalah nilai 'modulus' yang berputar kembali pada merah (nilai hue = 0). Ini bisa merepotkan saat memproses gambar, sebab Anda punya dua warna merah yang secara visual identik tetapi secara nilai terpisah sejauh jarak rona maksimum. Ini bukan ruang warna yang baik untuk dipakai saat menggarap selisih warna. Sebenarnya kanal lightness/brilliance ruang warna HSB dan HSL tidak begitu berguna karena berbagai Hue tidak diperlakukan setara. Pada dasarnya kanal itu 'menyamaratakan' intensitas warna primer. Misalnya, memutar rona 'yellow' menjadi rona 'blue' akan membuat warna yang sangat terang menjadi sangat gelap, dan sebaliknya. Untuk rincian lebih lanjut lihat HSL Disadvantages. Sebaiknya berhati-hati.
Ada sejumlah ruang warna yang juga memakai sistem rona berbasis 'hex cone' yang sama ini: HSB, HCL, dan HCLp (HCL perseptual). Berikut roda warna dari keempat ruang warna 'hex-cone' tersebut.
magick angular.png solid.png radial.png \
-combine -set colorspace HSL \
-colorspace sRGB colorwheel_HSL.png
magick angular.png solid.png radial.png \
-combine -set colorspace HSB \
-colorspace sRGB colorwheel_HSB.png
magick angular.png solid.png radial.png \
-combine -set colorspace HCL \
-colorspace sRGB colorwheel_HCL.png
magick angular.png solid.png radial.png \
-combine -set colorspace HCLp \
-colorspace sRGB colorwheel_HCLp.png
Ingat bahwa semua warna yang ditampilkan di atas dihasilkan pada saturasi warna maksimum. Namun ruang warna 'HSB' akan menghasilkan warna primer pada kecerahan maksimum (HSL menghasilkannya pada setengah intensitas). Karena itu putih hanya dapat dihasilkan ketika saturasinya nol. Akibatnya, alih-alih area putih di sekeliling tepinya, yang Anda dapat justru warna dengan saturasi penuh. Ruang warna 'HCL' memakai perhitungan rona 'hex-cone' yang sama, tetapi menyesuaikan kanal 'lightness' agar memakai intensitas warna, bukan nilai RGB linear secara langsung. Akibatnya, saat memakai 'HCL', warna primer terletak pada tingkat intensitas yang berbeda-beda: biru lebih dekat ke warna hitam di pusat, sedangkan merah jauh lebih terang dan lebih jauh ke luar. Area intensitas 50% pada ruang warna 'HCL' tidak menghasilkan warna yang kuat, melainkan warna pastel yang lebih alami. Sebagai contoh, berikut perbandingan rona jenuh antara ruang warna HSL dan HCL pada intensitas 50%.
magick -size 100x100 xc:black \
-fill white -draw 'circle 49.5,49.5 40,4' \
-fill black -draw 'circle 49.5,49.5 40,30' \
-alpha copy -channel A -morphology dilate diamond anulus.png
magick hue_angular.png -size 100x100 xc:white xc:gray50 \
-combine -set colorspace HSL -colorspace RGB \
anulus.png -alpha off -compose Multiply -composite \
anulus.png -alpha on -compose DstIn -composite \
-colorspace sRGB hues_HSL.png
magick hue_angular.png -size 100x100 xc:white xc:gray50 \
-combine -set colorspace HCL -colorspace RGB \
anulus.png -alpha off -compose Multiply -composite \
anulus.png -alpha on -compose DstIn -composite \
-colorspace sRGB hues_HCL.png
Bukan berarti 'HCL' tidak memuat warna murni; warna-warna itu hanya tidak 'dipaksa' ke satu bidang yang sama seperti pada ruang warna 'HSL'. Perhatikan khususnya bahwa semua gradasi pada HCL punya intensitas 50% yang sama (sesuai permintaan), tidak seperti hasil rona ruang warna HSL. Hijau barangkali warna utama yang paling dekat dengan intensitas 50%, sehingga responsnya bagus pada rona 50%. Ruang warna ini disarankan untuk memutar rona, agar kecerlangan umum semua warna dalam gambar tetap terjaga. Lihat contohnya di Modulate dalam ruang warna HCL. HWB Colorspace ???
Ruang warna perseptual
Ruang warna 'Lab' dan 'Luv' dirancang agar intensitas grayscale sepenuhnya terpisah dari komponen warna sebuah gambar, tidak seperti ruang warna 'RGB' dan 'sRGB'. Ini membuat ruang warna tersebut secara umum jauh lebih mudah diproses dan dimodifikasi, begitu Anda terbiasa. Lebih khusus lagi, 'Luv' dirancang agar 'linear secara perseptual'. Artinya, perubahan warna yang kecil di satu bagian ruang warna terlihat kira-kira sama besarnya dengan perubahan serupa di bagian lain ruang warna itu. Ini membuat ruang warna Luv jauh lebih cocok untuk membandingkan selisih gambar. Kedua ruang warna itu sangat mirip, dan umumnya menghasilkan hasil yang serupa saat memproses gambar. Di sini kita pisahkan kanal untuk ruang warna 'Lab' dan 'Luv', sekadar untuk menunjukkan betapa miripnya kedua ruang warna itu sebenarnya.
magick rose: \( -clone 0 -colorspace LAB -separate +append \) \
\( -clone 0 -colorspace LUV -separate +append \) \
-delete 0 -append -set colorspace sRGB separate_lab_luv.png
Luv
Contoh lain yang lebih baik untuk ruang warna 'Lab' dan 'Luv' dapat dilihat lewat variasi silindrisnya, 'LCHab' dan 'LCHuv', di Roda warna LCH di bawah. Untuk contoh praktis pemakaian ruang warna ini lihat Resize di ruang warna LAB.
Ruang warna berbasis Lab dan Luv
Ruang warna 'HCL' didasarkan pada ruang warna 'LCHuv', yang merupakan representasi silindris dari ruang warna 'Luv', hanya saja dengan rumus yang lebih sederhana untuk kanal lightness sehingga menghasilkan putih murni pada kecerahan maksimum. Demi kelengkapan, berikut representasi silindris dari ruang warna 'Lab' dan 'Luv', yang masing-masing dikenal sebagai 'LCHab' dan 'LCHuv'. Perhatikan bahwa urutan kanalnya kebalikan dari ruang warna 'HCL' yang setara seperti ditampilkan di atas.
magick radial.png solid.png angular.png \
-combine -set colorspace LCHab \
-colorspace sRGB colorwheel_LCHab.png
magick radial.png solid.png angular.png \
-combine -set colorspace LCHuv \
-colorspace sRGB colorwheel_LCHuv.png
![[IM Output]](../static/img/color_basics/radial.png)
Lightness* | ![[IM Output]](../static/img/color_basics/solid.png)
Chroma | ![[IM Output]](../static/img/color_basics/angular.png)
Hue | | ![[IM Output]](../static/img/color_basics/colorwheel_LCHab.png)
LCHab | ![[IM Output]](../static/img/color_basics/colorwheel_LCHuv.png)
LCHuv
Perhatikan bahwa ruang warna 'LCH' adalah alias untuk 'LCHab'. Pada gambar di atas terlihat bahwa 'LCHuv' punya diskontinuitas, tempat warna yang tidak realistis disetel lewat proses roda warna ini. Konversi gambar yang normal tidak akan menghasilkan warna-warna tersebut.
Ruang warna rentang dinamis tinggi scRGB
Wikipedia: http://en.wikipedia.org/wiki/ScRGB
Ini pada dasarnya adalah metode menyimpan warna berentang dinamis tinggi
(dengan nilai negatif dan sampai 10 kali rentang RGB linear) dalam bilangan
bulat 16 bit, dengan resolusi warna hanya 1/2 dari gambar sRGB 16-bit biasa.
Karena memakai bilangan bulat 16 bit, datanya dapat disimpan dalam format file
gambar yang mampu menyimpan gambar semacam itu (PNG, PPM, MIFF), meski profil
warna atau cara lain sebaiknya dipakai untuk menandai data scRGB tersebut.
Anda harus sangat berhati-hati dengan banyak operator pemrosesan gambar di
ruang warna ini, sebab ada 'offset' agar bilangan negatif dapat ditangani.
Dan meskipun sebagian operator seperti resize dan distort dapat dipakai langsung
pada ruang warna ini, mungkin lebih baik memakai ImageMagick versi HDRI, lalu
mengonversi ke RGB linear (dengan nilai negatif), untuk pemrosesan yang lebih umum.
_Contoh dan keterangan lebih lanjut tentang pemakaian ruang warna ini akan berguna_
Mengganti warna dalam gambar
ImageMagick tentu saja menyediakan sejumlah opsi untuk mengganti warna tertentu, dan warna yang mendekatinya, dengan warna lain. Ini bagus sekali untuk menangani ikon dan gambar bertipe 'bitmap' yang warnanya sangat sedikit, tetapi cenderung gagal pada gambar yang memuat gradasi warna atau piksel tepi hasil anti-aliasing. Pada dasarnya perlu diingat bahwa warna diganti oleh satu warna tunggal. Jadi bila Anda mengganti sekumpulan atau selingkungan warna, semua warna itu diganti oleh satu warna tunggal tertentu, bukan oleh rentang warna yang bersesuaian. Bukan berarti penggantian warna bergradasi itu mustahil; hanya saja saat ini tidak sederhana dan menuntut banyak kerja. Meski begitu, gambar GIF tidak mengizinkan pemakaian semitransparansi, sehingga mengganti warna dengan cara ini adalah metode yang baik untuk mengendalikan transparansi latar belakang GIF (lihat GIF di atas pola latar belakang untuk contohnya) Sisi lainnya, meskipun semua 'warna yang berdekatan' dapat dipetakan ke suatu colormap memakai peta warna yang telah didefinisikan, tidak ada operator yang memetakan langsung satu-satu sekumpulan besar warna ke kumpulan warna lain yang sama sekali berbeda. Ini kekurangan yang mungkin berubah pada versi IM mendatang. Dengan catatan itu, mari kita lihat cara-cara yang memang disediakan IM untuk mengganti langsung satu warna tertentu dengan warna lain.
Mengganti warna tertentu
Operator "-opaque" dan "-transparent" dirancang untuk mengganti satu warna dalam gambar dengan warna lain. Misalnya, untuk mengganti warna 'blue' dengan, katakanlah, 'white', perintahnya seperti ini... |
magick balloon.gif -fill white -opaque blue balloon_white.gif
![[IM Output]](../static/img/color_basics/balloon_white.gif)
Pada dasarnya semua warna yang tadinya 'blue' telah diganti dengan warna "-fill" saat itu. Namun sejak IM v6.2.7 operator ini dibatasi oleh pengaturan "-channel". Karena itu, untuk mengubah suatu warna (misalnya biru) menjadi transparan, Anda perlu menentukan "-channel" yang menyertakan kanal alpha agar warna dapat dibuat transparan. Anda juga perlu memastikan gambarnya punya 'matte' atau kanal alpha yang aktif untuk menyimpan informasi transparansi. |
magick balloon.gif -alpha set -channel RGBA \
-fill none -opaque blue balloon_none.gif
![[IM Output]](../static/img/color_basics/balloon_none.gif)
Karena mengganti warna dengan transparansi adalah operasi yang begitu umum, tindakan di atas punya operator penggantian dengan transparansi tersendiri, yaitu "-transparent". |
magick balloon.gif -transparent blue balloon_trans.gif
![[IM Output]](../static/img/color_basics/balloon_trans.gif)
Sejak IM versi 6.3.7-10, versi 'plus' dari operator ini membalik pemilihan warnanya. Artinya, warna yang TIDAK cocok dengan warna yang diberikanlah yang akan diganti. Sebagai contoh, di sini saya mengganti setiap warna yang BUKAN hitam murni dengan putih, sehingga yang tersisa hanya tepi hitam murni pada gambar itu. |
magick balloon.gif -fill white +opaque black balloon_borders.gif
![[IM Output]](../static/img/color_basics/balloon_borders.gif)
Ini mungkin tampak sepele, tetapi ketika digabungkan dengan faktor fuzz (lihat di bawah), cara ini menjadi alat yang sangat ampuh. | Sebelum IM v6.3.7-10, operasi kebalikan ini menuntut sedikit akal-akalan memakai mask gambar. Pada dasarnya Anda mengganti warna yang ingin dipertahankan dengan transparansi, lalu men-"-colorize" semua warna lain menjadi warna yang diinginkan untuk membuat mask overlay. Mask itu kemudian ditimpakan ke gambar asli untuk 'menutupi' warna yang tidak cocok! | |
magick balloon.gif \
\( +clone -alpha set -transparent black \
-fill white -colorize 100% \) \
-composite balloon_mask_non-black.gif
![[IM Output]](../static/img/color_basics/balloon_mask_non-black.gif)
Seperti terlihat, bentuk 'plus' dari operator ini menyederhanakan operasi penggantian 'bukan warna ini' secara luar biasa.
Untuk teknik penggantian yang lebih lanjut, saya sarankan Anda melihat Penghapusan latar belakang. | _Berhati-hatilah, karena semua warna yang cocok (terutama 'warna yang cocok secara fuzzy', lihat di bawah) diganti dengan satu warna yang seragam, Anda tidak akan mendapat anti-aliasing pada tepi area berwarna itu. Anda juga akan kehilangan segala efek bayangan atau gradasi lain yang mungkin ada. Hal ini bisa sangat merusak tampilan gambar apa pun yang tidak sederhana dan tidak bergaya kartun.
Penggantian warna semacam ini tidak dirancang untuk gambar dunia nyata, melainkan lebih untuk efek masking gambar. Sebaiknya berhati-hati._
Penggantian warna "-opaque" tidak dapat mengganti sebuah warna dengan pola tile. Operator itu hanya mengganti warna dengan satu warna tertentu lainnya. Namun metode penggantian warna "-draw" dan "-floodfill" dapat melakukannya (lihat di bawah).
Mengganti memakai warna yang ada di dalam gambar
Anda juga dapat memakai penggantian warna lewat draw untuk mewarnai ulang gambar berdasarkan warna yang ada di dalam gambar itu sendiri, alih-alih berdasarkan warna tertentu. |
magick present.gif -fill red -draw 'color 0,0 replace' present_blue.gif
![[IM Output]](../static/img/color_basics/present_blue.gif)
Perhatikan bahwa saya sama sekali tidak menyebut warna yang akan diganti, hanya lokasi warnanya. Warna di lokasi itulah yang dipakai untuk 'mencocokkan' area mana yang akan diisi, apa pun warnanya. Pada contoh di atas terlihat masalah penggantian warna: warna tersebut bisa muncul di tempat lain yang tidak Anda niatkan, sehingga muncul segaris piksel merah di dalam gambar 'present' di atas. Transparansi pun tidak menimbulkan masalah, walaupun sebagian bagian dalam gambar juga menjadi transparan, persis seperti bagian itu menjadi merah pada contoh sebelumnya... |
magick present.gif -alpha set -fill none \
-draw 'color 0,0 replace' present_none.gif
![[IM Output]](../static/img/color_basics/present_none.gif)
Perhatikan bahwa, tidak seperti "-opaque" dan "-transparent", penggantian warna lewat draw tidak memungkinkan Anda membalik 'warna yang cocok' untuk diganti. Draw juga punya penggantian matte khusus, yang hanya mengganti transparansi warna isian. Artinya, Anda dapat membuat semua warna yang cocok menjadi transparan, atau semitransparan, tanpa benar-benar mengubah warna pikselnya sendiri. Tentu saja dengan format file yang sesuai. |
magick present.gif -alpha set -fill '#00000080' \
-draw 'matte 0,0 replace' present_semi.png
![[IM Output]](../static/img/color_basics/present_semi.png)
Cara ini menjadi jauh lebih berguna bila faktor fuzz turut ditentukan. Keuntungan terbesar memakai "-draw" adalah warnanya juga dapat diganti dengan pola tile. Sebagai contoh.. |
magick present.gif -tile pattern:right30 \
-draw 'color 0,0 replace' present_tile.gif
![[IM Output]](../static/img/color_basics/present_tile.gif)
Untuk teknik penggantian yang lebih lanjut, saya sarankan Anda melihat Penghapusan latar belakang.
Floodfill dengan draw
Metode draw color juga menyediakan cara sederhana untuk mengganti warna lewat 'floodfill'. Artinya, alih-alih mengganti SEMUA warna yang cocok di dalam gambar, Anda dapat memilih hanya warna yang 'terhubung' atau 'menempel' pada titik yang ditentukan di gambar itu. Titik yang ditentukan itu bukan hanya menyatakan titik awal (titik benih), tetapi juga warna yang hendak Anda ganti. |
magick present.gif -fill red -draw 'color 0,0 floodfill' present_fill.gif
![[IM Output]](../static/img/color_basics/present_fill.gif)
Perhatikan bahwa area merah yang tidak 'menempel' pada piksel 0,0 tidak ikut diganti. Untuk penggantian latar belakang hal itu bisa menjadi masalah, tetapi solusinya sama mudahnya. Perlebar gambarnya sedikit agar floodfill dapat 'merembes' masuk dari segala arah, lalu buang ruang tambahan itu setelah selesai. |
magick present.gif -bordercolor white -border 1x1 \
-fill red -draw 'color 0,0 floodfill' \
-shave 1x1 present_bgnd.gif
![[IM Output]](../static/img/color_basics/present_bgnd.gif)
Tentu saja Anda dapat menyesuaikan warna mana saja yang 'cocok' memakai pengaturan kendali faktor fuzz di bawah, yang khususnya penting untuk gambar JPEG.
Operator floodfill
Operator "-floodfill" ditambahkan agar floodfill sedikit lebih mudah, terutama ketika Anda ingin menentukan dengan persis warna mana yang hendak diganti. Hal ini bisa sangat penting saat memakai pencocokan warna faktor fuzz. Namun berhati-hatilah: jika titik benih itu tidak masuk dalam kecocokan faktor fuzz terhadap warna yang dicari, "-floodfill" tidak melakukan apa pun. Ini bisa dianggap keunggulan sekaligus kutukan operator tersebut.
Faktor fuzz yang kecil disarankan untuk flood fill.
Atau pastikan titik benih persis cocok dengan warna yang dicari.
Sebagai contoh, tambahkan border berwarna yang sudah diketahui agar flood fill dapat dimulai dari tepi... |
magick present.gif -bordercolor white -border 1x1 \
-fill red -floodfill +0+0 white \
-shave 1x1 present_floodfill.gif
![[IM Output]](../static/img/color_basics/present_floodfill.gif)
Perintah ini akan mengganti setiap warna 'white' menjadi 'red' yang secara langsung merupakan bagian dari area di sekitar piksel benih mulai dari +0+0, yang dijamin 'white' berkat border yang ditambahkan tadi. Floodfill juga dapat dilakukan dengan pola tile. |
magick present.gif -bordercolor white -border 1x1 \
-tile pattern:left30 -floodfill +0+0 white \
-shave 1x1 present_pattern.gif
![[IM Output]](../static/img/color_basics/present_pattern.gif)
Argumen 'color ' kadang merepotkan, sebab argumen itu harus cocok dengan warna titik benih; kalau tidak, tidak akan terjadi apa-apa. Tetapi hal ini juga bisa berguna, karena memastikan floodfill melakukan persis apa yang Anda inginkan, bukan sesuatu yang tak terduga. Sebagai contoh, di sini saya mencoba mengisi cakram putih dengan berbagai warna... |
magick disks.gif \
-fill Red -floodfill +30+50 white \
-fill Green -floodfill +60+60 white \
-fill Blue -floodfill +10+40 white \
floodfill_hit_miss.gif
![[IM Output]](../static/img/color_basics/floodfill_hit_miss.gif)
Dalam kasus ini hanya operasi flood-fill 'Green' dan 'Blue' yang 'mengenai cakram' (dan mengisinya), sedangkan flood-fill 'Red' tidak mengenai cakram sehingga tidak ada cakram yang terisi, tanpa sampai mengisi latar belakang gambar secara tidak sengaja. Ini juga berarti bahwa jika Anda sudah mengisi suatu area tertentu, pengisian berikutnya tidak akan 'mengisi ulang' area yang sama meski ada dua titik yang mengenainya. Hal itu dapat menghemat banyak waktu. Anda mungkin juga tertarik melihat dilasi bersyarat, yang merupakan operasi floodfill tingkat lebih rendah dari beberapa titik 'benih' sekaligus di dalam gambar.
Faktor fuzz - mencocokkan warna serupa atau berganda
Hasil keseluruhan dari sekadar memilih satu warna untuk diganti, seperti pada contoh-contoh sebelumnya, biasanya tidak begitu bagus. Tepi atau area warna polos umumnya punya campuran warna di bagian tepinya akibat anti-aliasing (lihat Anti-aliasing untuk keterangan lebih lanjut). Karena itu sebaiknya hindari penggantian warna langsung bila memungkinkan. Sebagai contoh, di sini saya mengambil gambar 'sapi' yang tampak hitam putih sederhana dan mencoba menjadikannya sapi merah.
magick cow.gif -fill red -opaque black cow_replace_red.gif
Seperti terlihat, hanya bagian tengah area 'hitam' yang benar-benar menjadi merah. Itu karena, meskipun gambarnya tampak hitam putih, sebenarnya gambar itu grayscale dengan hampir semua tepinya berupa berbagai gradasi abu-abu. Artinya, warnanya bukan persis hitam murni. Faktor fuzz ("-fuzz") menyatakan kecocokan 'kemiripan' berupa jarak bola multidimensi antarwarna, memakai ruang warna apa pun yang sedang dipakai gambar itu. Baiklah, mari kita coba mengatakannya dengan bahasa sehari-hari. Anda punya suatu warna tertentu. Warna lain akan diperlakukan sama dengan warna yang dicari, jika selisih kedua warna itu lebih kecil daripada pengaturan faktor fuzz. Makin besar 'faktor fuzz', makin banyak warna yang 'berdekatan' akan cocok dan ikut diganti. Jadi mari kita coba pada gambar sapi kita, supaya bukan hanya hitam murni tetapi juga warna yang mendekati hitam ikut diubah menjadi merah.
magick cow.gif -fuzz 40% -fill red -opaque black cow_replace_fuzz.gif
Seperti terlihat, kini semua piksel 'gelap' pada gambar itu sudah kita ganti menjadi merah. Tetapi hasilnya masih sangat buruk, dengan semburat keabuan di tepinya dan efek aliasing yang kuat. Penggantian warna langsung bukan solusi yang baik untuk gambar ini, walaupun hal itu bisa dibuat bekerja dengan 'faktor fuzz' yang besar. Lihat contoh di Penyesuaian level menurut warna untuk solusi yang ideal bagi gambar ini. Masalah ini bahkan lebih parah pada gambar yang warna latar belakangnya hendak Anda ganti dengan transparansi. Ujung-ujungnya Anda mendapat 'halo' di sekeliling objek pada warna latar belakang tersebut. Ini sangat sulit dipecahkan, dan masalah seperti ini dibahas secara rinci di Penghapusan latar belakang. Operasi apa saja yang memakai faktor fuzz Operator "-fuzz" memengaruhi hampir semua operator yang membandingkan warna tertentu di dalam sebuah gambar. Termasuk di antaranya: "-opaque", "-transparent", "-floodfill", "-trim", "-deconstruct", "-draw 'color'", "-draw 'matte'", dan mungkin operator lain. Faktor fuzz juga memengaruhi penanganan GIF "-layers OptimizeTransparency" dan "-compose ChangeMask". Ia juga memengaruhi hasil "magick compare", khususnya "-metric AE" alias Absolute Error Pixel Count.
Jarak faktor fuzz
Pengaturan "-fuzz" sebenarnya adalah semacam pengaturan 'jarak' warna. Warna apa pun yang berada dalam jarak tertentu dari warna yang dicari akan dianggap cocok, meskipun tidak persis sama. Nilai '200' berarti jarak 200 satuan warna pada kedalaman warna IM yang sedang dipakai. Untuk IM Q16 (kualitas 16 bit untuk penyimpanan warna) nilai ini cukup kecil, sedangkan untuk IM Q8 nilai ini SANGAT besar dan akan membuat banyak warna saling cocok. Di sini misalnya saya mengubah semua warna yang berada dalam 30.000 satuan warna (untuk IM Q16) dari 'blue' menjadi putih. Pada program ImageMagick Q16 saya, jarak itu kira-kira setara dengan jarak dari 'blue ke 'navy' (biru tua dengan separuh kecerlangan), |
magick colorwheel.png \
-fuzz 30000 -fill white -opaque blue \
opaque_blue.jpg
![[IM Output]](../static/img/color_basics/opaque_blue.jpg)
Agar lebih mudah dipahami, di sini saya membalik warna yang cocok sehingga warna yang tidak cocok menjadi putih. |
magick colorwheel.png \
-fuzz 30000 -fill white +opaque blue \
opaque_blue_not.png
![[IM Output]](../static/img/color_basics/opaque_blue_not.png)
Jika IM Anda lebih tua daripada versi 6.3.7-10, saat bentuk 'plus' dari operator "-opaque" ditambahkan, metode masking berikut dapat dipakai untuk membalik hasil pencocokan warna... |
magick colorwheel.png \
\( +clone -fuzz 30000 -transparent blue \
-channel RGB +level-colors white +channel \) \
-composite opaque_blue_inv.png
![[IM Output]](../static/img/color_basics/opaque_blue_inv.png)
Atau metode berikut, yang membatasi seluruh modifikasi hanya pada 'kanal alpha', sehingga semua warna aslinya dibiarkan apa adanya. Artinya, Anda membuat mask ternegasi dari pemilihan warna itu, agar semua warna yang tidak terpilih menjadi sepenuhnya transparan. Warnanya tetap ada, hanya transparan! |
magick colorwheel.png -fuzz 30000 -transparent blue \
-channel A -negate +channel opaque_blue_inv_alpha.png
![[IM Output]](../static/img/color_basics/opaque_blue_inv_alpha.png)
Keuntungan metode alternatif ini adalah Anda dapat mengembangkannya menjadi teknik 'bukan warna-warna ini '. Yang perlu dilakukan hanyalah menambahkan lebih banyak warna ke daftar yang dibuat transparan, sebelum mask itu dinegasikan, dan mungkin membuang transparansi ternegasi tersebut. |
magick colorwheel.png \
-fuzz 25000 -transparent blue -transparent red -transparent lime \
-channel A -negate +channel \
-background white -alpha remove opaque_multi_inv.png
| _Sebagai catatan menarik, pada IM yang dikompilasi dengan pengaturan Q8, faktor "-fuzz" sebesar 256 (28) akan membuat warna 'black' dan 'blue' setara. Untuk IM dengan pengaturan Q16, angkanya adalah 65536 (216).
Agar warna 'blue' dan 'red' saling cocok, angka ini harus dikalikan dengan akar dua, jadi 362 untuk IM Q8 dan 92682 untuk IM Q16.
Agar semua warna saling cocok (misalnya warna 'black' dan 'white'), Anda perlu mengalikannya dengan akar tiga. Dengan kata lain, pengaturan faktor fuzz sebesar 444 untuk IM Q8 dan 113512 untuk IM Q16.
| _Kemungkinan besar jarak warna yang lebih baik dan lebih realistis dapat didefinisikan memakai ruang warna 'perseptual' seperti 'LAB' atau 'LUV'. Cukup ubah gambar ke ruang warna itu sebelum melakukan pencocokan warna fuzzy. Dengan begitu warna seperti biru murni dan hitam menjadi jauh lebih dekat, dan kuning dengan putih pun lebih dekat, dibandingkan pada ruang warna 'sRGB' atau 'linear-RGB'.
Seperti terlihat dari rumus di atas, jarak warna langsung jelas bukan cara yang praktis untuk mengatur faktor fuzz, sebab jarak itu juga bergantung pada pengaturan kualitas yang dipakai saat kompilasi. Menyetel faktor "-fuzz" sebagai persentase membuat pemakaiannya jauh lebih sederhana. Dalam hal ini '100%' menyatakan faktor fuzz yang cukup besar untuk mencakup semua warna. Artinya, angka itu menyatakan jarak warna dari 'black' ke 'white', menyusuri diagonal tiga dimensi kubus warna RGB. Di sini kita mengganti setiap warna yang berada dalam 90% jarak dari putih ke hitam dengan warna putih. Hasilnya semestinya hanya menyisakan 10% warna terakhir di dekat 'black' pada gambar, sebab hitam berada di sisi seberang kubus warna RGB. |
magick colorwheel.png -fuzz 90% -fill white -opaque white opaque_w90.jpg
![[IM Output]](../static/img/color_basics/opaque_w90.jpg)
Perhatikan bahwa 90% ini menyatakan sebuah bola warna di sekeliling 'white' dalam kubus warna RGB. Namun ini tidak sama dengan mengganti warna yang tidak berada dalam bola 10% di sekitar hitam. |
magick colorwheel.png -fuzz 10% -fill white +opaque black opaque_k10.jpg
Seperti terlihat, bola warna 10% di dekat hitam jauh lebih seragam daripada memilih bola 90% warna di sekeliling putih. Bayangkan bagaimana sebuah bola besar yang berpusat di sudut putih sebuah kubus mengisi kubus itu. Lalu bayangkan bola kecil yang berpusat di sudut hitam, dan Anda akan dapat memahami perbedaan kedua gambar itu. ![[IM Output]](../static/img/color_basics/opaque_k10.jpg)
| _Faktor "-fuzz" sebesar 100% setara dengan jarak kubus warna RGB dari 'black' ke 'white'. Dari situ dapat dihitung bahwa persentase sekitar 57,7% adalah jarak antara 'black' dan 'blue', dan 81,6% adalah jarak dari 'blue' ke 'red' atau dari salah satu warna itu ke 'white'.
Ringkasnya, apa pun yang lebih besar dari sekitar 25% (sedikit di bawah jarak RGB dari 'blue' ke 'navy blue') sudah menyatakan perubahan warna yang sangat besar._
Untuk memperjelas jarak warna itu, mari kita pakai persentase faktor fuzz yang makin besar di sekitar warna biru...
magick colorwheel.png -fuzz 10% -fill white -opaque blue opaque_b10.jpg
magick colorwheel.png -fuzz 25% -fill white -opaque blue opaque_b25.jpg
magick colorwheel.png -fuzz 57% -fill white -opaque blue opaque_b57.jpg
magick colorwheel.png -fuzz 81% -fill white -opaque blue opaque_b81.jpg
magick colorwheel.png -fuzz 95% -fill white -opaque blue opaque_b95.jpg
Dari sini jelas terlihat bahwa bukan 'black' atau 'white' yang paling jauh dari 'blue', melainkan justru 'yellow' yang paling jauh di dalam ruang warna RGB. Perhatikan pula bahwa selisih warna 81% hanya nyaris saja gagal mencocokkan warna 'red' murni; namun meski merah murni tidak cocok, merah-merah lain (di luar warna merah kejinggaan) tetap cocok. Sekali lagi, itu karena sifat 'bola' dari pencocokan warna ini. Pelajarannya, Anda mungkin lebih baik memakai beberapa pencocokan "-fuzz" bernilai kecil, atau 'pencocokan terbalik' yang lebih kecil, ketimbang satu nilai besar. Di sini kita membandingkan warna dalam gambar dengan warna lain, yaitu warna 'abu-abu nyaris sempurna', lalu mengubah warna yang serupa menjadi abu-abu yang sama itu seiring 'faktor fuzz' membesar.
magick colorwheel.png -fuzz 25% -fill gray50 -opaque gray50 opaque_g25.jpg
magick colorwheel.png -fuzz 30% -fill gray50 -opaque gray50 opaque_g30.jpg
magick colorwheel.png -fuzz 35% -fill gray50 -opaque gray50 opaque_g35.jpg
magick colorwheel.png -fuzz 45% -fill gray50 -opaque gray50 opaque_g45.jpg
magick colorwheel.png -fuzz 51% -fill gray50 -opaque gray50 opaque_g51.jpg
Seperti terlihat, warna dalam gambar roda warna baru mulai cocok pada faktor fuzz sedikit di bawah 30%, lalu perlahan bertambah sampai pada 45% semua warna kecuali yang paling ekstrem sudah lenyap. Pada 51%, semua warna dalam gambar sudah cocok dengan abu-abu nyaris sempurna itu. Yang Anda lihat adalah akibat dari cara warna RGB ditata menjadi sebuah kubus dalam ruang tiga dimensi. Namun gambar 'roda warna' hanya memuat 'warna dengan saturasi penuh', yang pada dasarnya berarti semua warna ekstrem yang terletak di sisi-sisi luar kubus warna RGB. Sementara itu abu-abu sempurna terletak di pusat kubus, cukup jauh dari semua 'warna jenuh' tadi. Karena itu warna di tengah sisi kubus baru mulai cocok setelah Anda mencapai faktor fuzz yang besar, sekitar 28%. Makin besar faktor fuzz, makin banyak warna yang cocok sampai akhirnya hanya warna di sudut-sudut terjauh kubus warna yang tersisa. Di sekitar 50%, warna sudut pun mulai cocok, sehingga pada 51% setiap warna RGB yang opak sudah cocok semua.
Faktor fuzz dan warna transparan
Memakai faktor "-fuzz" menjadi lebih rumit ketika pencocokannya melibatkan warna transparan dan semitransparan. Sebagai contoh, di sini saya membuat gradien antara hitam dan putih melintang di gambar, lalu menambahkan gradien transparan secara vertikal. Setelah itu saya melakukan pencocokan warna fuzzy untuk warna abu-abu sempurna (yaitu abu-abu 50%). Pada gambar berikutnya warna yang dicocokkan saya buat makin transparan sampai sepenuhnya transparan, sementara faktor fuzz tetap 20%.
magick -size 100x100 gradient: \( +clone -rotate 90 \) +swap \
-compose CopyOpacity -composite trans_gradient.png
magick trans_gradient.png -channel RGBA \
-fuzz 20% -fill Gray50 -opaque 'GrayA(50%,1.0)' fuzz_trans_100.png
magick trans_gradient.png -channel RGBA \
-fuzz 20% -fill Gray50 -opaque 'GrayA(50%,.75)' fuzz_trans_75.png
magick trans_gradient.png -channel RGBA \
-fuzz 20% -fill Gray50 -opaque 'GrayA(50%,.40)' fuzz_trans_40.png
magick trans_gradient.png -channel RGBA \
-fuzz 20% -fill Gray50 -opaque 'GrayA(50%,0.0)' fuzz_trans_00.png
Perhatikan bahwa pemakaian "-channel RGBA" di atas bukan untuk mencocokkan warna, melainkan untuk menentukan kanal warna mana yang akan 'diisi'. Artinya, tanpa itu perintah di atas tetap mencocokkan warna yang sama, tetapi 'isian' abu-abunya akan tetap semitransparan dan tidak disetel menjadi abu-abu yang opak. Jika Anda ingin mencocokkan semua warna tanpa memedulikan transparansinya, Anda perlu mematikan kanal transparan gambar itu, setidaknya untuk sementara. Kanal itu dapat dinyalakan lagi sesudahnya, walaupun warna isian Anda akan kembali punya transparansi yang sama dengan warna aslinya. Pada gambar pertama, pencocokan dengan abu-abu yang sepenuhnya opak (alpha='1.0') menghasilkan kecocokan berbentuk bola yang rapi untuk semua warna abu-abu yang nyaris opak. Namun ketika warna yang dicocokkan makin semitransparan, jumlah warna semitransparan yang cocok tampak makin banyak, sampai abu-abu yang sepenuhnya transparan akan cocok dengan warna mana pun yang nyaris transparan. Yang terjadi adalah, seiring transparansi bertambah, jarak antarwarna semitransparan mengecil. Makin transparan dua warna, makin dekat pula keduanya dibandingkan padanan opaknya. Ketika kedua warna sepenuhnya transparan, keduanya dianggap cocok sempurna, atau berjarak '0'. Hal lain yang perlu diperhatikan adalah (sejak IM v6.6.6-4) jarak dari warna yang sepenuhnya transparan (abu-abu atau warna lain) semata-mata merupakan fungsi transparansi warna itu (nilai alpha). Gambar terakhir di atas mencocokkan semua piksel yang berada dalam 20% dari kondisi sepenuhnya transparan, apa pun warna sebenarnya. Ini juga berarti faktor fuzz yang besar dengan warna yang sepenuhnya transparan (seperti 'none') dapat dipakai untuk mencocokkan semua, atau hampir semua, warna semitransparan. Sebagai contoh... |
magick trans_gradient.png -channel RGBA \
-fuzz 95% -fill Gray50 -opaque None \
-alpha off fuzz_trans.jpg
![[IM Output]](../static/img/color_basics/fuzz_trans.jpg)
Perhatikan bahwa hanya 5% teratas dari warna yang nyaris opak di atas yang tidak cocok, sementara semua warna semitransparan lainnya berubah menjadi abu-abu. "-alpha off" di bagian akhir membuang sisa semitransparansi terakhir dari gambar itu. Karena itu pengaturan "-channel RGBA" sebenarnya tidak diperlukan, tetapi tetap disarankan demi kelengkapan. Contoh ini pada dasarnya setara dengan melakukan threshold pada kanal alpha, lalu menambahkan lapisan warna abu-abu di bawahnya (untuk membuat warna transparan menjadi abu-abu) | Sebelum IM v6.6.6-4, pencocokan warna fuzz tidak memperlakukan warna yang sepenuhnya transparan dan warna opak secara setara. Nyatanya hitam jauh lebih cocok daripada putih. Karena itu contoh terakhir akan gagal. Lihat Fuzz Distance and Transparent Colors Bug untuk rinciannya.
| Lebih parah lagi, sebelum IM v6.2.6-2 pencocokan warna fuzz tidak menganggap semua warna yang sepenuhnya transparan sebagai warna yang sama. Artinya, hitam yang sepenuhnya transparan (yang juga dikenal sebagai 'None') tidak sama dengan putih yang sepenuhnya transparan (atau warna '#FFF0'), padahal keduanya sama-sama sepenuhnya transparan.
Sedang dikerjakan
Matematika warna (mendapatkan rata-rata dua warna atau lebih)....
Contoh merata-ratakan dua warna... Misalnya '#000000' dan '#DDDDDD'
Umumnya warna-warna itu ditambahkan ke gambar, lalu hasilnya dikeluarkan
sebagai gambar 'txt:-' satu piksel, yang warnanya dapat diambil dari situ.
* gunakan -resize untuk melebur warnanya
magick -size 2x1 xc:'#000000' -fill '#DDDDDD' \
-draw 'point 0,0' -resize 1x1 txt:-
* Gunakan -evaluate-sequence mean pada keduanya!
magick -size 1x1 xc:'#000000' xc:'#DDDDDD' \
-evaluate-sequence mean txt:-
Atau untuk warna yang banyak, filter resize 'Box' dapat dipakai
magick rose: -filter Box -resize 1x1\! txt:
# ImageMagick pixel enumeration: 1,1,255,RGB
0,0: (145, 89, 80) #915950
* Gunakan -fx untuk menerapkan rumus apa pun yang Anda mau
magick -size 1x1 xc:'#000000' xc:'#DDDDDD' \
-fx '(u+v)/2' txt:-
Dengan API ImageMagick, hasilnya dapat diambil lebih langsung dari
gambar tersebut.
![[IM Output]](../static/img/color_basics/colorspace_RGB.png)
![[IM Output]](../static/img/color_basics/colorspace_LUV.png)
![[IM Output]](../static/img/color_basics/colorspace_LAB.png)
![[IM Output]](../static/img/color_basics/color_hex_1.png)
![[IM Output]](../static/img/color_basics/color_hex_2.png)
![[IM Output]](../static/img/color_basics/color_hex_3.png)
![[IM Output]](../static/img/color_basics/color_hex_4.png)
![[IM Output]](../static/img/color_basics/color_hex_5.png)
![[IM Output]](../static/img/color_basics/color_hex_6.png)
![[IM Output]](../static/img/color_basics/color_rgba_1.png)
![[IM Output]](../static/img/color_basics/color_rgba_2.png)
![[IM Output]](../static/img/color_basics/color_rgba_3.png)
![[IM Output]](../static/img/color_basics/color_rgba_4.png)
![[IM Output]](../static/img/color_basics/color_rgba_5.png)
![[IM Output]](../static/img/color_basics/color_rgba_6.png)
![[IM Output]](../static/img/color_basics/color_name_1.png)
![[IM Output]](../static/img/color_basics/color_name_2.png)
![[IM Output]](../static/img/color_basics/color_name_3.png)
![[IM Output]](../static/img/color_basics/color_name_4.png)
![[IM Output]](../static/img/color_basics/color_name_5.png)
![[IM Output]](../static/img/color_basics/color_name_6.png)
![[IM Output]](../static/img/color_basics/separate_red.gif)
![[IM Output]](../static/img/color_basics/separate_green.gif)
![[IM Output]](../static/img/color_basics/separate_blue.gif)
![[IM Output]](../static/img/color_basics/channel_red.gif)
![[IM Output]](../static/img/color_basics/channel_green.gif)
![[IM Output]](../static/img/color_basics/channel_blue.gif)
![[IM Output]](../static/img/color_basics/rose_combined.gif)
![[IM Output]](../static/img/color_basics/rose_red_blue.gif)
![[IM Output]](../static/img/color_basics/separate_HSB_0.gif)
![[IM Output]](../static/img/color_basics/separate_HSB_1.gif)
![[IM Output]](../static/img/color_basics/separate_HSB_2.gif)
![[IM Output]](../static/img/color_basics/separate_HSL_0.gif)
![[IM Output]](../static/img/color_basics/separate_HSL_1.gif)
![[IM Output]](../static/img/color_basics/separate_HSL_2.gif)
![[IM Output]](../static/img/color_basics/colorwheel_HSB.png)
![[IM Output]](../static/img/color_basics/colorwheel_HCL.png)
![[IM Output]](../static/img/color_basics/colorwheel_HCLp.png)
![[IM Output]](../static/img/color_basics/hues_HSL.png)
![[IM Output]](../static/img/color_basics/hues_HCL.png)
![[IM Output]](../static/img/color_basics/separate_lab_luv.png)
![[IM Output]](../static/img/images/cow.gif)
![[IM Output]](../static/img/color_basics/cow_replace_red.gif)
![[IM Output]](../static/img/color_basics/cow_replace_fuzz.gif)
![[IM Output]](../static/img/color_basics/opaque_multi_inv.png)
![[IM Output]](../static/img/color_basics/opaque_b10.jpg)
![[IM Output]](../static/img/color_basics/opaque_b25.jpg)
![[IM Output]](../static/img/color_basics/opaque_b57.jpg)
![[IM Output]](../static/img/color_basics/opaque_b81.jpg)
![[IM Output]](../static/img/color_basics/opaque_b95.jpg)
![[IM Output]](../static/img/color_basics/opaque_g25.jpg)
![[IM Output]](../static/img/color_basics/opaque_g30.jpg)
![[IM Output]](../static/img/color_basics/opaque_g35.jpg)
![[IM Output]](../static/img/color_basics/opaque_g45.jpg)
![[IM Output]](../static/img/color_basics/opaque_g51.jpg)
![[IM Output]](../static/img/color_basics/trans_gradient.png)
![[IM Output]](../static/img/color_basics/fuzz_trans_100.png)
![[IM Output]](../static/img/color_basics/fuzz_trans_75.png)
![[IM Output]](../static/img/color_basics/fuzz_trans_40.png)
![[IM Output]](../static/img/color_basics/fuzz_trans_00.png)