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

Contoh penggunaan ImageMagick -- modifikasi warna

Kata pengantar dan indeks contoh penggunaan ImageMagick
Mengubah warna menjadi grayscale
Penyesuaian level gambar

Di sini kita melihat teknik untuk memodifikasi semua warna sebuah gambar sekaligus. Entah untuk mencerahkan atau menggelapkan gambar, atau untuk modifikasi warna yang jauh lebih drastis. Untuk menjajal teknik-teknik ini kita memerlukan sebuah gambar uji...
Jangan pusingkan bagaimana saya membuat gambar ini, itu tidak penting untuk latihannya. Saya memang merancangnya supaya memuat aneka warna, transparansi, dan sifat lain, khusus agar IM benar-benar terkuras saat dipakai. | [IM Output]
Kalau Anda memang penasaran dengan perintah yang dipakai untuk membuat gambar ini, lihat skrip khusus "**generate_test**" yang saya pakai untuk membuatnya. | PERINGATAN: proses warna di bawah ini umumnya mengandaikan gambar memakai ruang warna linear. Padahal sebagian besar gambar disimpan memakai ruang warna sRGB atau yang sudah dikoreksi gamma, sehingga agar hasilnya benar koreksi ruang warna sebaiknya diterapkan lebih dulu.


Mengubah warna menjadi grayscale

Gambar grayscale berguna untuk banyak hal, misalnya untuk memproses gambar aslinya lebih lanjut atau untuk dipakai dalam komposisi latar belakang. Metode terbaik untuk mengubah gambar menjadi grayscale adalah meminta IM me-magick gambar itu menjadi representasi Ruang warna grayscale.

  magick test.png  -colorspace Gray   gray_colorspace.png

[IM Output] [IM Output]

Perhatikan betapa jauh lebih gelapnya biru dibanding merah, karena pembobotannya disesuaikan dengan intensitas sebagaimana tampak oleh mata manusia. Artinya, 'red' adalah warna yang cukup terang dibanding 'blue' yang terlihat lebih gelap. Ini setara dengan pemakaian formula konversi 'rec709luma' pada operator khusus "-grayscale" (ditambahkan pada IM v6.8.3-10). |

  magick test.png  -grayscale rec709luma  gray_grayscale.png

[IM Output]
Nilai 'rec709luma' hanyalah satu dari sekian banyak formula grayscale yang didefinisikan untuk dipakai oleh pengaturan (setting) "-intensity" (lihat di bawah). Berikut misalnya formula grayscale umum lainnya, 'rec601luma' |

  magick test.png  -grayscale rec601luma  gray_grayscale_601.png

[IM Output]
Seperti terlihat, ada sedikit perbedaan tingkat intensitas untuk kanal warna merah, hijau, dan biru.
Namun ada banyak metode lain, dan banyak pula makna 'grayscale'... Misalnya, semua warna bisa dikuras habis dari gambar memakai operator modulate, dengan menolkan seluruh tingkat saturasi warna. |

  magick test.png  -modulate 100,0  gray_modulate.png

[IM Output]
Pada dasarnya ini mengubah gambar ke ruang warna HSL, lalu mengambil nilai grayscale 'Lightness' dari ruang warna itu. Namun dengan "-define modulate:colorspace" model ruang warna lain dapat ditentukan. Lihat Modulate di ruang warna lain di bawah. Perhatikan bahwa warna 'green' IM yang saya pakai untuk cakram berwarna di tengah gambar uji saya sebenarnya bukan hijau murni seperti yang dipakai pada pelangi berwarna, melainkan hijau setengah terang yang didefinisikan oleh standar baru SVG -- Scalable Vector Graphics. Kalau yang diperlukan hijau RGB murni, pakai warna 'lime' sebagai gantinya. Lihat Konflik nama warna untuk rinciannya. Cara lain adalah memakai Operator DIY FX untuk merata-ratakan ketiga kanal sehingga didapat makna grayscale yang murni matematis. |

  magick test.png -fx '(r+g+b)/3' gray_fx_average.png

[IM Output]
| Rata-rata nilai kanal sRGB juga setara dengan kanal intensitas ruang warna 'OHTA' (kanal merah). Atau kanal 'I' dari ruang warna HSI.
Teknik lain adalah menjumlahkan begitu saja ketiga kanal (ukuran warna yang dikenal sebagai jarak manhattan); gambar hasilnya memang tidak kehilangan informasi akibat efek 'quantum rounding', tetapi informasi tentang warna-warna paling terang bisa hilang. Sayangnya kanal transparansi pun ikut hilang. |

  magick test.png -separate \
          -background black -compose plus -flatten   gray_added.png

[IM Output]
Teknik penjumlahan kanal yang sama bisa dipakai untuk mengatur pembobotan tiap kanal warna. Misalnya, ini satu formula DIY yang dapat dipakai... |

  magick test.png -fx '0.3*r+0.6*g+0.1*b' gray_diy.png

[IM Output]
'intensity' juga bisa dipakai kalau makna yang sama diinginkan di dalam operator "-fx". |

  magick test.png  -fx intensity  gray_intensity.png

[IM Output]

Namun karena Operator DIY FX bersifat interpretatif, jalannya bisa sangat sangat lambat. Untuk operasi yang lebih rumit tersedia Operator Evaluate yang lebih sederhana, "-evaluate". Sebagai contoh, berikut gambar grayscale dengan rasio 2/5/3, meski sekali lagi saya tidak berusaha mempertahankan kanal transparansi gambar aslinya. | |

  magick test.png -channel R -evaluate multiply .2 \
                   -channel G -evaluate multiply .5 \
                   -channel B -evaluate multiply .3 \
                   -channel RGB -separate -compose add -flatten gray_253.png

[IM Output]
| _Perintah di atas akan terkena efek 'kuantisasi' pada ImageMagick yang dikompilasi pada tingkat kualitas 'Q8'. Sebabnya, hasil "-evaluate" disimpan ke bilangan bulat 8 bit yang kecil, yang dipakai untuk nilai gambar. Nilai-nilai itu baru dijumlahkan sesudahnya, dengan akibat hilangnya ketelitian.

ImageMagick yang dikompilasi dengan opsi kualitas 'Q16', atau lebih baik lagi HDRI, akan memberi hasil yang jauh lebih tepat. Alternatif baru lainnya adalah Poly - operator penggabungan gambar berbobot, yang melakukan pembobotan sekaligus penjumlahan gambar kanal terpisah dalam satu operasi, sehingga efek 'quantum rounding' terhindari.

_
Teknik serupa bisa dipakai untuk menghasilkan grayscale yang murni matematis, dengan langsung merata-ratakan ketiga kanal RGB secara setara. |

  magick test.png -separate -evaluate-sequence mean  gray_average.png

[IM Output]
Namun seperti terlihat, saya tidak berusaha mempertahankan kanal alpha pada gambar hasilnya. Alternatif cepat lainnya adalah operator matriks warna "-recolor", yang memungkinkan pembobotan ketiga kanal warna ditentukan sendiri. |

  magick test.png -recolor '.2 .5 .3
                             .2 .5 .3
                             .2 .5 .3'   gray_recolor.png

[IM Output]
Cara ini tidak memengaruhi transparansi, sehingga jauh lebih baik untuk mengonversi warna dengan pembobotan tertentu. Pada dasarnya baris angka pertama adalah pembobotan kanal untuk kanal merah gambar hasil, tiga angka berikutnya untuk hijau, dan tiga angka terakhir untuk biru. "-type" juga bisa dipakai untuk memberi tahu IM agar memperlakukan gambar sebagai grayscale, baik saat gambar dibaca maupun ditulis. |

  magick test.png  -type GrayScaleAlpha  gray_type.png

[IM Output]
| Pengaturan "-type" umumnya hanya dipakai sebagai panduan ketika gambar dibaca dari atau ditulis ke sebuah file. Karena itu tindakannya ditunda sampai penulisan akhir gambar. Efeknya juga sangat bergantung pada kemampuan format file gambar yang terlibat, dan dipakai untuk menimpa penentuan normal ImageMagick pada proses tersebut. Lihat contoh Type untuk keterangan lebih lanjut.
| Sebelum IM v6.3.5-9 perintah di atas akan menghapus transparansi apa pun pada gambar yang ditulis (setara dengan "-type Grayscale") karena sebuah bug. Ini diperbaiki begitu saya menyadari masalahnya dan melaporkannya. (Ada pelajaran di sini :-)

Teknik yang jauh lebih menarik adalah menggali beragam makna kecerlangan dengan mengambil Kanal warna yang sesuai dari berbagai representasi Ruang warna gambar tersebut. Untuk contohnya lihat Kanal grayscale dari representasi ruang warna.


Penyesuaian level gambar

Bentuk penyesuaian paling dasar yang dapat diterapkan pada gambar dikenal sebagai penyesuaian 'level'. Pada dasarnya ini berarti mengambil masing-masing nilai warna RGB (atau bahkan nilai kanal alpha) lalu menyetelnya sehingga nilai-nilai itu meregang atau memampat. Karena yang disetel hanya nilai kanal, penyesuaian ini paling jelas diperagakan pada gambar grayscale, bukan pada gambar berwarna. Namun bila semua kanal warna sebuah gambar disetel dengan kadar yang sama, penyesuaian itu dapat dipakai pada gambar berwarna juga, baik untuk memperkuat maupun untuk menyetel gambar. Jangan mengacaukannya dengan bentuk penyesuaian level yang lebih otomatis, yang akan kita lihat pada bagian contoh besar berikutnya di bawah, Penyesuaian Normalize. Fungsi ini melakukan operasi yang persis sama tanpa peduli isi gambar yang sesungguhnya. Tidak jadi soal apakah gambarnya terang atau gelap, atau bersemburat biru atau kuning. Operasinya buta terhadap isi gambar yang sebenarnya. [IM Graph] Dalam memperagakan operasi-operasi ini saya akan memakai grafik "gnuplot" yang sudah dimodifikasi seperti yang tampak di sebelah kanan, yang saya hasilkan memakai skrip khusus "im_graph". Grafik itu punya garis merah yang memetakan nilai 'x' asli yang diberikan (mewakili nilai grayscale gradien paling atas) ke nilai 'y' yang ditampilkan. Gradien warna hasilnya juga ditampilkan di bawah gradien linear masukan. Grafik di sebelah kanan adalah grafik operator IM "-noop" yang sebenarnya tidak melakukan apa pun terhadap gambar. Karena itu setiap nilai warna gambar dipetakan persis ke nilai yang sama tanpa perubahan. Gradien bawah pun sama dengan gradien atas.

Negasi gambar

Penyesuaian level global yang paling sederhana dan paling dasar adalah menegasikan gambar, memakai operator gambar "-negate". Pada intinya ini menjadikan putih menjadi hitam, dan hitam menjadi putih, sambil menyetel semua warna lain agar sepadan. Artinya, warna merah menjadi warna komplementernya yaitu sian, biru menjadi kuning, dan seterusnya. Hal ini terlihat pada grafik pemetaan di bawah, ketika saya memakai operator "-negate" pada gambar 'test' sekaligus pada gambar bawaan IM 'rose' yang standar. Perhatikan gradien bawah pada gambar grafik pemetaan kini terbalik, sehingga hitam dan putih bertukar, dan pembalikan yang sama muncul pada gambar 'test' yang dinegasikan.

  magick test.png  -negate  test_negate.png
  magick rose:    -negate  rose_negate.gif

[IM Output]
[IM Output] | [IM Graph] | [IM Output]
[IM Output]

Di dalamnya negate sebenarnya agak bodoh. Ketiga kanal warna ditangani secara terpisah, dan secara bawaan kanal alpha diabaikan. Kalau tidak begitu, hasilnya akan konyol sekali seperti ini...

  magick test.png -channel RGBA  -negate  negate_rgba.png

[IM Output] [IM Output]

Gambarnya memang ternegasikan, terlihat dari gradien warna yang semitransparan. Tetapi karena kanal transparansi ikut dinegasikan, semua warna opak dalam gambar jadi hilang. Inilah sebabnya pengaturan bawaan untuk "-channel" adalah 'RGB'. Lihat Kanal warna untuk keterangan lebih lanjut. Negasi dapat dibatasi hanya pada satu kanal saja, misalnya kanal warna hijau. Ini sekilas tampak tidak berguna, tetapi adakalanya justru sangat penting.

  magick test.png -channel green  -negate  negate_green.png

[IM Output] [IM Output]

Operator "-negate" sebenarnya merupakan invers bagi dirinya sendiri. Dua kali negasi dengan pengaturan "-channel" yang sama akan saling meniadakan.

  magick negate_green.png  -channel green  -negate  negate_restore.png

[IM Output] [IM Output]

Negasi sangat lazim dalam pemrosesan gambar, terutama saat menangani gambar grayscale sebagai langkah sebelum atau sesudah opsi pemrosesan lain. Karena itu saya sarankan Anda bermain-main dengannya dan terus mengingatnya apa pun yang sedang dikerjakan, sebab bekerja dengan gambar yang dinegasikan bisa memecahkan sejumlah masalah yang tanpa itu terasa sulit.

Penyesuaian level langsung

Operator "-level" adalah operator penyesuaian level yang lebih umum. Pada dasarnya operator ini diberi dua nilai, sebuah 'black_point' dan sebuah 'white_point', ditambah nilai ketiga yang opsional (penyesuaian gamma), yang akan saya bahas nanti. Yang dilakukannya adalah memetakan setiap nilai warna dalam gambar yang sama dengan atau lebih kecil daripada 'black_point' menjadi hitam (atau nilai 0). Begitu pula, setiap nilai warna yang sama dengan atau lebih terang daripada 'white_point' dijadikan putih (atau nilai Maksimum). Warna-warna di antara kedua titik itu lalu 'diregangkan' secara linear untuk mengisi seluruh rentang nilai. Efeknya adalah kontras membaik dan warna di dalam gambar menguat. Sebagai contoh, berikut penguatan kontras 25% pada gambar uji kita, memakai nilai yang sama dengan yang ditunjukkan grafik. Karena titik hitam dan titik putih biasanya digeser dengan kadar yang sama dari nilai 0% dan 100%, cukup tentukan 'black_point' saja. Titik putih akan digeser ke dalam dengan kadar yang sama.

  magick test.png  -level 25%,75%  test_level.png
  magick rose:    -level 25%      rose_level.gif

[IM Output]
[IM Output] | [IM Graph] | [IM Output]
[IM Output]

Perhatikan bahwa 25% adalah penguatan kontras yang sangat besar untuk gambar apa pun, tetapi jelas memperlihatkan apa yang dikerjakannya. Titik 'black' dan 'white' tidak harus diubah dua-duanya. Boleh saja hanya satu ujung rentang warna yang disetel. Misalnya kita bisa membuat gambar rose yang sangat terang, atau yang sangat gelap.

  magick rose: -level 0,75%     rose_level_light.gif
  magick rose: -level 25%,100%  rose_level_dark.gif

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

Namun sekali lagi saya ingatkan bahwa warna di luar rentang yang diberikan akan 'terpotong' atau 'terbakar', sehingga tidak lagi tersedia untuk pemrosesan gambar berikutnya. Inilah masalah terbesar dalam memakai operator "-level". [IM Graph] Dengan nilai negatif, kontras gambar dapat dikurangi secara kasar. Maksudnya, alih-alih memberi nilai warna yang akan dipetakan ke 'black' dan 'white' sehingga warna di antaranya meregang, nilai warna justru dimampatkan sehingga warna negatif khayalanlah yang terpetakan ke hitam atau putih. Hasilnya gambar mengelabu secara menyeluruh. |

  magick rose: -level -25%  rose_decontrast.gif

[IM Output]

Namun metode pengurangan kontras seperti ini sangat tidak akurat dan tidak dianjurkan, kecuali kalau IM Anda lebih tua daripada versi 6.4.2 sehingga Operator level terbalik yang baru belum tersedia. [IM Graph] Operator "-level" dapat dipakai untuk menegasikan gambar (seperti sudah diperlihatkan di atas), cukup dengan menukar nilai titik 'black' dan 'white' yang diberikan, memakai "-level 100%,0". |

  magick rose: -level 100%,0  rose_level_neg.gif

[IM Output]

[IM Graph] Atau dengan menyetel keduanya ke nilai yang sama, semua nilai warna dalam gambar praktis dikenai ambang batas (threshold). Memakai "-level" untuk mengambangkan gambar persis sama dengan memakai Operator Threshold pada nilai itu. Grafik pemetaan di sebelah kanan memperlihatkan hasil operasi "-level 50%,50%" dan efeknya pada gradien grayscale. |

  magick rose: -level 50%,50%  rose_level_thres.gif

[IM Output]

Perhatikan bahwa tidak seperti "-threshold", gambar tidak otomatis dikonversi menjadi gambar grayscale ketika dipakai dengan pengaturan "-channel" bawaan. Sifat umum level yang memodifikasi gambar secara linear membuat operator "-level" cocok untuk modifikasi gambar grayscale pada umumnya, dan untuk penyesuaian mask. Tambahkan kenyataan bahwa kanal dapat dimodifikasi satu per satu (memakai pengaturan "-channel") alih-alih seluruh gambar, dan jadilah ia salah satu operator modifikasi warna terbaik yang tersedia bagi pengguna IM. Perhatikan bahwa operator evaluate dan function juga dapat dipakai untuk modifikasi nilai warna yang lebih langsung secara matematis, guna mencapai hasil yang sama bagi -level dalam bentuk + maupun -).
Perlu diingat bahwa operator "-level" memperlakukan kanal transparansi sebagai nilai 'matte'. Karena itu 100% berarti sepenuhnya transparan dan 0% berarti opak. Harap perhitungkan hal ini saat memakai "-level" pada gambar bentuk yang sudah di-blur. Ini paling lazim dilakukan setelah gambar 'bentuk' di-blur, untuk memperluas dan meregangkan hasilnya. Untuk contohnya lihat Tepi lembut, dan Garis luar bayangan.
--- ---

Penyesuaian level terbalik -- mengurangi kontras gambar

Sejak IM versi 6.4.2 Operator level diperluas sehingga menyediakan bentuk 'terbalik' "+level" (perhatikan tanda 'plus'-nya). Sebagai alternatif, bentuk asli operator "-level" tetap bisa dipakai dengan menambahkan '!' pada argumen level yang diberikan (untuk antarmuka API yang lebih tua). Argumen varian ini persis sama, tetapi alih-alih meregangkan nilai supaya 'black_point' dan 'white_point' terpetakan ke 'black' dan 'white', justru 'black' dan 'white' yang dipetakan ke titik-titik yang diberikan. Dengan kata lain "+level" adalah kebalikan tepat dari "-level". Sebagai contoh, di sini kita memetakan 'black' ke abu-abu 25%, dan putih ke abu-abu 75%, sehingga kontras gambar berkurang dengan sangat tepat, memakai dua cara penulisan bentuk 'terbalik' tersebut.

  magick test.png   +level 25%    test_level_plus.png
  magick rose:     -level 25%\!  rose_level_plus.gif

[IM Output]
[IM Output] | [IM Graph] | [IM Output]
[IM Output]

Kalau operasi "+level 25%" di atas dibandingkan dengan pengurangan kontras bernilai negatif, operator "-level -25%" yang tadi kita perlihatkan, terlihat bahwa keduanya tidak sama. Versi 'plus' menghasilkan gambar yang jauh lebih berkurang kontrasnya (lebih kelabu), tetapi melakukannya dengan memetakan ke nilai persis yang diberikan kepada operator, bukan ke nilai 'khayalan' seperti pada bentuk 'minus'. Pemakaian nilai yang persis ini penting, dan menjadi salah satu alasan bentuk 'plus' operator ini ditambahkan. Tentu saja '25%' sekali lagi merupakan nilai yang sangat besar, dan tidak dianjurkan untuk pekerjaan gambar sehari-hari. Perhatikan bahwa "-level" dan "+level" sebenarnya benar-benar merupakan kebalikan satu sama lain bila diberi argumen yang sama. Artinya, yang satu memetakan nilai ke ujung-ujung rentang, sementara yang lain memetakan dari ujung-ujung rentang. Sebagai contoh, di sini kita memampatkan warna gambar uji memakai "+level", lalu memuaikannya kembali memakai "-level", sehingga gambar pulih mendekati tampilan aslinya.

  magick test.png  +level 20%  -level 20%  test_level_undo.png

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

Kedua gambar tampak sangat sangat mirip, dan karena saya memakai IM versi kualitas tinggi 'Q16', Anda akan kesulitan menemukan bedanya sama sekali. Namun nilainya belum tentu persis sama, sebab nilai warna gambar sudah dimampatkan ke rentang bilangan bulat yang lebih sempit lalu dipulihkan lagi. Dalam kasus ekstrem hal ini dapat menimbulkan efek pembulatan kuantum. Melakukan kedua operasi itu dalam urutan terbalik (regangkan dulu, lalu mampatkan nilai warnanya) akan menghasilkan efek pemotongan kuantum. Sisi berguna lain dari operator "+level" adalah semua nilai warna dalam gambar dapat dimampatkan sepenuhnya ke tingkat grayscale yang sama.

  magick test.png  +level 30%,30%  test_level_const.png

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

Dengan menentukan level menurut nilai warna tertentu untuk masing-masing kanal, sebuah gradien grayscale praktis dapat di-magick menjadi gradien warna tertentu. Namun cara ini agak sulit dihitung dan dikerjakan. Karena itu disediakan pula operator "-level-colors" yang memungkinkan titik hitam dan putih ditentukan dalam bentuk warna tertentu, bukan nilai 'level'. Lihat Level berdasarkan warna di bawah.

Penyesuaian level gamma

Kedua varian "-level" di atas juga memungkinkan pemakaian pengaturan ketiga: nilai penyesuaian 'gamma'. Secara bawaan nilainya 1.0', yang tidak melakukan penyesuaian nada tengah apa pun pada gambar hasil, sehingga pemetaan nilai dari gambar lama ke gambar baru murni linear. Namun dengan memperbesar nilai ini, garis hasilnya melengkung sehingga gambar menjadi lebih terang, sedangkan memperkecilnya membuat gambar lebih gelap. Sebagai contoh, di sini saya memakai pengaturan 'gamma' saja untuk mencerahkan dan menggelapkan nada tengah gambar.

  magick rose: -level 0%,100%,2.0   rose_level_gamma_light.gif
  magick rose: -level 0%,100%,0.5   rose_level_gamma_dark.gif

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

Nilainya umumnya berkisar dari 10 untuk gambar yang menyilaukan terangnya, sampai .2 untuk gambar yang sangat gelap. Seperti disebutkan, nilai 1.0 tidak mengubah 'gamma' gambar sama sekali. Namun nilai khusus '2.0' (lihat di atas) dapat dipakai untuk memperoleh akar kuadrat warna gambar yang sudah dinormalisasi. Kedua versi operator "-level" menangani 'gamma' dengan cara yang sama. Artinya penyesuaian level pada ujung 'black' dan 'white' dapat digabungkan dengan penyesuaian 'gamma' yang nonlinear. Satu kanal saja dari sebuah gambar pun dapat disetel. Sebagai contoh, di sini kita memberi gambar semburat halus di ujung hitam hanya pada kanal biru, sambil memakai gamma untuk mempertahankan tingkat warna nada tengah gambar.

  magick test.png  -channel B +level 25%,100%,.6 test_blue_tint.png

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

Contoh khusus ini bisa dipakai untuk mewarnai foto satelit cuaca, yang hanya lautnya hitam murni sementara daratannya lebih kelabu. Alternatif lain bagi penyesuaian kanal biru ini diberikan di bawah pada Penyesuaian nonlinear matematis DIY.

Penyesuaian operasi gamma

Operator "-gamma" juga tersedia, dan efeknya persis sama dengan pengaturan 'gamma' pada operator "-level". Bedanya, tingkat penyesuaian 'gamma' dapat disetel untuk tiap kanal secara terpisah. Kegunaan sebenarnya adalah menyetel fungsi 'gamma' sebuah gambar sebelum operasi linear dijalankan padanya. Untuk rinciannya lihat Persepsi warna manusia dan koreksi gamma. Fungsi ini juga bisa kita pakai untuk mencerahkan gambar dengan kadar yang berbeda pada tiap kanal RGB. |

  magick rose: -gamma 0.8,1.3,1.0  gamma_channel.gif

[IM Output]
Seperti terlihat, cara ini bisa dipakai untuk pewarnaan halus dan penyesuaian warna pada gambar, atau untuk mengoreksi gambar yang terlalu banyak mengandung satu warna tertentu. | _Untuk alasan mengapa fungsi ini sebaiknya dipakai, lihat Koreksi gamma.

_
Fungsi ini sebenarnya setara dengan fungsi Evaluate POW tetapi dengan argumen yang dibalik. Karena itu "-evaluate POW 2.2" sebenarnya menjalankan operasi "-gamma 0.45455" (0.45455 sama dengan 1/2.2), yang merupakan kebalikan dari "-gamma 2.2".
Salah satu kegunaan "-gamma" yang kurang kentara adalah menolkan kanal gambar tertentu (lihat Menolkan kanal warna). Atau mewarnai gambar sepenuhnya menjadi 'black', 'white', atau warna primer lainnya (lihat Kanvas warna primer).

Penyesuaian level berdasarkan warna

Operator "-level-colors" ditambahkan pada IM v6.2.4-1. Pada dasarnya ia persis sama dengan Operator level yang kita bahas di atas, hanya saja nilai untuk tiap kanal ditentukan sebagai nilai warna. Artinya, opsi "-level-colors" memetakan warna yang diberikan ke 'black' dan 'white' lalu meregangkan semua warna lain di antaranya secara linear. Efeknya, rentang warna yang diberikan itu terbuang dari gambar. Cara ini memang berjalan, tetapi tidak begitu berguna, sebab gampang gagal untuk warna yang punya nilai sama pada suatu kanal. Misalnya, warna 'DodgerBlue' dan 'White' punya nilai warna yang sama pada kanal biru. Karena itu "-level-colors DodgerBlue,White" tidak selalu berhasil me-magick kedua warna itu menjadi hitam dan putih. Teknik yang lebih baik dalam kasus seperti itu adalah mengambil gambar grayscale dari kanal yang selisihnya paling besar (misalnya merah) lalu me-level atau menormalisasi kanal tersebut. PERINGATAN: hati-hati dengan warna 'transparent'.
Sebaliknya bentuk plus operator ini, "+level-colors", justru sangat berguna karena memetakan warna 'black' dan 'white' ke nilai yang diberikan sambil memampatkan semua warna lain secara linear agar pas di antara kedua warna itu. Misalnya mari kita petakan 'black' dan 'white' ke 'green' dan 'gold'...

  magick test.png  +level-colors green,gold   levelc_grn-gold.png

[IM Output] [IM Output]

Seperti terlihat, gradien grayscale dipetakan ulang menjadi gradien yang dibatasi warna-warna yang diberikan, dan meski warna di luar rentang grayscale ikut dimodifikasi, warna-warna itu pun mengikuti gaya dasar rentang warna yang ditentukan. Inilah yang membuat operator "+level-colors" sangat berguna, terutama saat memetakan gambar grayscale. Kalau hanya satu nama warna yang diberikan tetapi komanya tetap disertakan, warna yang hilang memakai nilai bawaan 'black' atau 'white' sesuai keperluan.

  magick test.png  +level-colors ,DodgerBlue   levelc_dodger.png
  magick test.png  +level-colors ,Gold         levelc_gold.png
  magick test.png  +level-colors ,Lime         levelc_lime.png
  magick test.png  +level-colors ,Red          levelc_red.png

  magick test.png  +level-colors Navy,         levelc_navy.png
  magick test.png  +level-colors DarkGreen,    levelc_darkgreen.png
  magick test.png  +level-colors Firebrick,    levelc_firebrick.png

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

Dengan begitu gambar grayscale mudah di-magick menjadi gradien warna apa pun yang Anda suka. Sebagai contoh, di sini saya memetakan ulang gradien hitam-putih menjadi gradien merah-putih (perhatikan ',' pada argumennya)...

  magick cow.gif   +level-colors red,   cow_red.gif

[IM Output] [IM Output]

Ini tidak sekadar mengganti 'black' dengan 'red', tetapi juga memetakan ulang semua warna abu-abu hasil anti-alias menjadi campuran 'red' dan 'white' yang pas, sehingga hasilnya sangat halus. [IM Output] Seandainya saya cuma melakukan Penggantian warna langsung sederhana yang mengubah warna hitam murni menjadi merah, hasilnya akan berupa gambar yang mengerikan (tampak di sebelah kanan). Lihat Faktor fuzz untuk contoh yang dipakai menghasilkan gambar itu. Tentu saja kalau yang diinginkan justru salah satu warnanya menjadi transparan, lebih baik pakai operator -alpha Shape, sebab cara itu menuntut gradiennya dipindahkan ke kanal alpha.
Kalau hanya satu warna yang diberikan, tanpa pemisah 'koma', warna itu dipakai untuk titik hitam sekaligus titik putih. Artinya semua warna dalam gambar disetel ulang menjadi satu warna itu. (sesuai batasan pengaturan "-channel" yang sedang berlaku). |

  magick test.png  +level-colors dodgerblue  levelc_blue.png

[IM Output]
Hasilnya identik dengan memakai "-fill DodgerBlue -colorize 100%" untuk Mewarnai gambar (lihat di bawah). Kalau pengaturan transparansi gambar juga ingin diubah, "-channel" perlu disetel agar mencakup kanal transparansi, ATAU Kanal alpha disetel menjadi sepenuhnya opak, memakai "-alpha opaque" atau "-alpha off". |

  magick test.png -channel ALL +level-colors dodgerblue levelc_blue2.png

[IM Output]
Lihat juga Mengosongkan gambar yang sudah ada. Berikut beberapa contoh lagi pemakaiannya untuk menyetel atau 'mewarnai' gambar berwarna, bukan gambar grayscale.

  magick rose: +level-colors             navy,lemonchiffon  levelc_faded.gif
  magick rose: +level-colors        firebrick,yellow        levelc_fire.gif
  magick rose: +level-colors 'rgb(102,75,25)',lemonchiffon  levelc_tan.gif

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

Ringkasnya, "+level-colors" adalah penggantian warna gradien, operator pewarnaan linear, dan sekaligus dapat menyetel ulang warna sepenuhnya.

Kontras nonlinearitas sigmoidal

Dari sebuah makalah PDF berjudul 'Fundamentals of Image Processing ' (halaman 44) disajikan alternatif bagi kendali kontras linear (level), yaitu kendali yang memakai koreksi gamma dan dikenal sebagai 'sigmoidal non-linearity contrast control '. Hasilnya adalah perubahan kontras yang nonlinear dan mulus (dalam istilah matematika sebuah 'Fungsi Sigmoid') di sepanjang rentang warna, dengan warna putih dan hitam tetap terjaga, jauh lebih baik untuk penyesuaian warna foto. Formula persisnya dari makalah itu sangat rumit, bahkan mengandung kekeliruan, tetapi pada dasarnya menuntut dua nilai penyesuaian: tingkat ambang batas yang menjadi pusat fungsi kontras (biasanya berpusat di '50%'), dan faktor kontras ('10' berarti sangat tinggi, dan '0.5' sangat rendah). | Bagi yang tertarik, formula 'sigmoidal non-linearity contrast control' yang sudah dibetulkan adalah... ( 1/(1+exp(**β** *(**α** -u))) - 1/(1+exp(**β** *(**α**)) ) / ( 1/(1+exp(**β** *(**α** -1))) - 1/(1+exp(**β** * **α**)) ) _Denganα adalah tingkat ambang batas, dan β faktor kontras yang akan diterapkan.

Berikut versi lain formula tersebut yang memakai variabel antara. x = exp(**β** * (**α** - u)) y = exp(**β** + 1 result (x / y + 1) * (1 / (x + 1) - 1 / y) _Formula ini sebenarnya kurva eksponensial yang sangat sederhana; sebagian besar isi formula di atas dirancang untuk memastikan 0 tetap nol dan 1 tetap satu. Artinya, grafiknya selalu melewati titik 0,0 dan 1,1. Dan gradien perubahan tertingginya berada pada ambang batas yang diberikan.
Berikut misalnya implementasi "-fx" dari formula di atas, dengan hasil dari nilai kontras yang sangat tinggi '10' dan nilai ambang batas '50%'. Nilai-nilai itu sudah dilebur ke dalam konstanta bilangan pecahan, untuk mempercepat fungsinya.

  magick test.png  -fx '(1/(1+exp(10*(.5-u)))-0.006693)*1.013567' \
              sigmoidal.png

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

Untungnya bagi kita, IM v6.2.1 sudah memasang fungsi rumit ini sebagai operator baru "-sigmoidal-contrast", sehingga penerapannya jauh lebih sederhana. |

    magick test.png  -sigmoidal-contrast 10,50% test_sigmoidal.png

[IM Output]
Sebagai bonus IM juga menyediakan inversnya, fungsi 'pengurangan kontras sigmoidal' (sebagai bentuk plus '+' operator tersebut), yang bila diterapkan dengan argumen yang sama akan memulihkan gambar asli kita (hampir persis). |

    magick test_sigmoidal.png +sigmoidal-contrast 10,50% \
                                             test_sigmoidal_inv.png

[IM Output]
Dan di sini kita menerapkannya pada gambar rose... |

    magick rose: -sigmoidal-contrast 10,50%  rose_sigmoidal.gif

[IM Output]
Saya memang bilang '10' adalah faktor kontras yang sangat berat. Nyatanya apa pun yang lebih tinggi daripada nilai ini bisa dianggap lebih mirip operasi ambang batas yang kabur ketimbang penguatan kontras. Untuk contoh praktis pemakaian operator ini lihat contoh Efek "Gel" yang tergolong lanjut, tempat operator ini dipakai untuk menajamkan area terang yang ditambahkan pada warna area berbentuk.

Aneka operator kontras

Sedang dikerjakan

   -contrast  and   +contrast
         Operator penyesuaian kontras kecil yang agak tidak berguna

<a id="threshold"></a>-threshold
   Mengambangkan gambar; setiap nilai yang sama dengan atau lebih kecil dari
   nilai yang diberikan disetel ke 0 dan yang lebih besar ke nilai maksimum.

   Perhatikan bahwa seperti level, ini operator kanal, tetapi bila 'pengaturan
   kanal' bawaan yang dipakai hanya intensitas grayscale gambar yang
   diambangkan sehingga menghasilkan gambar hitam-putih.

   magick rose: -threshold 45%  x:

   Perilaku kanal yang normal, yaitu tiap kanal diambangkan sendiri-sendiri,
   dapat dipaksakan dengan memakai "-channel All"

   magick rose: -channel All -threshold 45%  x:

<a id="black-threshold"></a>-black-threshold
<a id="white-threshold"></a>-white-threshold
   Ini seperti -threshold hanya saja cuma satu sisi dari nilai ambang batas
   yang benar-benar dimodifikasi.

   Sebagai contoh, di sini apa pun yang lebih gelap dari 30% disetel ke hitam.

   magick rose: -black-threshold 30%  x:
   magick rose: -white-threshold 50%  x:

   Namun operator ini sepertinya tidak terpengaruh kanal, jadi mungkin hanya
   cocok untuk gambar grayscale!

Penyesuaian melalui modifikasi histogram

Bagian ini merupakan hasil kerja bersama Fred Weinhaus dan Anthony Thyssen. Apa itu histogram? Histogram adalah jenis grafik khusus. Ia sekadar memilah tingkat warna piksel dalam sebuah gambar ke sejumlah 'bin' tetap yang masing-masing mencakup rentang nilai yang kecil. Jadi setiap bin memuat cacah tingkat warna (nilai piksel) dalam gambar yang jatuh ke rentang itu. Hasilnya adalah gambaran bagaimana nilai warna penyusun sebuah gambar tersebar, dari hitam di sebelah kiri sampai putih di sebelah kanan. Histogram dapat dihasilkan untuk tiap kanal secara terpisah atau sebagai histogram global yang melihat nilai dari semua kanal sekaligus. Hasilnya sering ditampilkan sebagai gambar diagram batang. Di IM, hal ini dilakukan memakai format keluaran khusus Histogram:. Sebagai contoh... |

  magick rose: histogram:histogram.gif

[IM Output]
Tetapi ia juga dapat ditampilkan sebagai grafik garis, dengan garis yang menghubungkan puncak batang-batangnya. Ini akan diperagakan nanti dalam pembahasan di bawah. Lihat Histogram: untuk rincian format keluaran khusus ini. Bacaan itu dianjurkan pada titik ini karena merupakan cara terbaik menggali informasi histogram sebuah gambar memakai IM. Tinggi sesungguhnya sebuah diagram histogram nyaris tidak bermakna, sebab biasanya diskalakan agar puncak tertingginya menyentuh tepi atas gambar. Karena itu tinggi tiap 'batang' tidak relevan. Yang jauh lebih penting adalah sebaran histogram di sepanjang rentang, dan bagaimana tinggi relatifnya saling berhubungan di keseluruhan diagram. Saat memandang sebuah histogram, faktor-faktor berikut patut dipertimbangkan.

  • Apakah histogramnya membentuk satu pita nilai yang lebar? Ini berarti gambar memanfaatkan ruang warna secara luas sehingga kontrasnya bagus.
  • Atau semuanya berkerumun rapat di tengah atau di salah satu ujung rentang? Ini berarti kontras gambar rendah, sehingga tampak 'berkabut' atau 'kelabu', atau mungkin terlalu terang atau terlalu gelap.
  • Apakah ia membentuk dua puncak atau lebih? Sebagai akibat adanya area atau wilayah yang sangat berbeda dalam gambar.
  • Di mana sebagian besar pikselnya? Di sebelah kiri, berarti gambarnya sangat gelap. Atau di sebelah kanan, berarti sangat terang. Atau tersebar di sekitar tengah?
  • Adakah celah atau ruang kosong yang teratur di antara batang-batangnya? Biasanya ini berarti gambar punya sangat sedikit piksel sehingga tidak mampu mengisi penuh seluruh histogram, atau warna gambar sudah direduksi, atau dimodifikasi sedemikian rupa sehingga celah-celah itu muncul.

Pada dasarnya histogram adalah representasi gambar yang lebih sederhana, sehingga jauh lebih mudah mengubah atau menyetel gambar lewat histogramnya. Hampir setiap transformasi warna matematis yang diterapkan pada sebuah gambar biasanya membuat bukan hanya gambarnya yang termodifikasi, melainkan histogramnya juga. Termasuk di dalamnya operasi linear seperti Operator level atau operasi nonlinear seperti Operator gamma (lihat di atas). Grafik pemetaan yang kita lihat di atas menggambarkan bagaimana tingkat abu-abu dalam sebuah gambar, dan dengan begitu histogram gambar itu, akan ditransformasikan. Sebagai contoh, mari kita buat gambar berkontras rendah untuk memperagakannya. Hasil akhirnya bukan sekadar gambarnya termodifikasi, melainkan modifikasi itu terjadi dengan mengubah histogram gambar tersebut (dengan memampatkannya).

  magick chinese_chess.jpg -contrast -contrast -contrast -contrast \
          chinese_contrast.png

  magick chinese_chess.jpg     histogram:chinese_chess_hist.gif
  magick chinese_contrast.png  histogram:chinese_contrast_hist.gif

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

Pada kasus di atas, "-contrast" adalah operator sederhana bertipe Level yang menambahkan sedikit saja kontras pada gambar. Akibatnya histogramnya sendiri lebih tersebar, sehingga menutupi seluruh rentang warna yang mungkin dengan lebih baik. Dari histogram sebelum dan sesudahnya juga terlihat bahwa warna-warnanya berakhir dengan celah dan lubang di antara 'bin', karena cara peregangan itu dilakukan. Tepatnya ia membuat 'histogram' dengan semua warna ditempatkan ke dalam 'bin'. Warna-warna yang sudah di-'bin' itu lalu dimodifikasi sebagai satu kesatuan, sehingga warna gambar terkelompok-kelompok. Ini bukan cara yang bagus untuk menangani warna gambar. Namun operator ini bekerja buta, tanpa pengetahuan apa pun tentang isi gambar atau sebaran warnanya. Karena itu ia tidak bisa dijalankan tanpa kendali dari pengguna, sebab operator ini gampang sekali membuat gambar apa pun yang dikenainya menjadi lebih buruk, bukan lebih baik. Pada bagian ini kita akan melihat operator pemrosesan gambar yang memeriksa histogram gambar sebagai bagian dari proses pengambilan keputusannya. Ia lalu memodifikasi gambar memakai hasil telaah itu, guna memperbaiki suatu mutu sebaran warna gambar. Karena operator semacam ini memakai informasi nyata yang berasal dari gambar yang sedang diproses, ia sering dapat dipakai lebih global pada banyak gambar tanpa perlu banyak pemeriksaan dari pengguna. Operator jenis ini mencakup operator 'level' linear otomatis seperti "-normalize", "-contrast-stretch", dan "-linear-stretch", tetapi juga yang nonlinear seperti "-equalize", serta yang lain yang mungkin kelak masuk ke ImageMagick seperti skrip milik Fred Weinhaus, "redist".

Peregangan histogram

Teknik yang paling sederhana, seperti contoh sebelumnya, sekadar meregangkan histogram gambar ke luar untuk memperbaiki rentang warnanya. Namun alih-alih memilih black-point dan white-point secara membabi buta untuk operasi Level, teknik ini memilih titiknya berdasarkan histogram gambar. Pada dasarnya ia menghitung banyaknya nilai warna di tiap bin histogram, dari kedua ujung ke arah dalam, sampai mencapai suatu ambang. Titik-titik itulah yang kemudian dipakai sebagai black-point dan white-point untuk peregangan histogram (level). Diagram diperlukan Pada dasarnya cacah histogram memberikan nilai tingkat abu-abu yang akan dipaksa menjadi hitam dan putih oleh peregangan itu. Artinya semua piksel dalam gambar yang jatuh dalam rentang bin dari hitam murni sampai tingkat abu-abu yang bersesuaian dengan bin black-point terpilih akan berakhir hitam murni. Demikian pula piksel dalam gambar yang jatuh dalam rentang bin dari putih murni sampai tingkat abu-abu yang bersesuaian dengan bin white-point akan berakhir putih murni. Sementara piksel di luar titik-titik itu sudah teregang melampaui rentang nilai warna yang mungkin, sehingga hasilnya sekadar disetel ke batas rentang. Artinya, piksel-piksel itu 'terpotong' dan 'terbakar' karena dikonversi ke nilai warna ekstrem hitam murni atau putih murni. Akibatnya, kalau batas 'ambang' untuk memilih black-point dan white-point disetel terlalu tinggi, akan muncul banyak area hitam dan putih dalam gambar, dan histogram hasilnya punya cacah besar (batang tinggi) di bin-bin ujung yang ekstrem. Contoh burn-in parah -- gambar Chinese Chess? Ringkasan operator 'stretch'... -contrast-stretch dan -linear-stretch sama-sama menghasilkan histogram (memakai 1024 bin) untuk menentukan posisi warna yang akan diregangkan, jadi hasilnya tidak 'persis'. Perbedaan lainnya adalah cara 'nol' ditangani, dan bahwa -linear-stretch sebenarnya menjalankan operasi -level untuk meregangkan, sedangkan -contrast-stretch memakai nilai bin histogram untuk peregangan lewat penggantian warna (yang menimbulkan efek pembulatan kuantum 1024. -normalize memakai -contrast-stretch secara internal. Operator peregangan normalisasi yang sempurna secara matematis adalah -auto-level. Meski versi 'white-point saja' atau 'black-point saja' yang sempurna itu mungkin dibuat, sampai saat ini belum diimplementasikan.

Auto-Level - normalisasi matematis yang sempurna

"-auto-level" mencari nilai terbesar dan terkecil dalam gambar untuk dipakai meregangkan gambar ke seluruh Quantum Range. Nilai tidak akan pernah 'terpotong' atau 'terbakar' akibat histogram teregang melampaui rentang nilai. Pengaturan "-channel" menentukan apakah semua kanal diregangkan sama rata 'seirama' (memakai maksimum dan minimum atas seluruh kanal) atau sendiri-sendiri (tiap kanal sebagai entitas terpisah). Untuk saat ini warna tersembunyi dari piksel yang sepenuhnya transparan juga ikut dipakai dalam menentukan level, dan itu bisa menimbulkan masalah ketika transparansi terlibat. Hal ini dianggap sebagai bug.

FUTURE: We actually need three modes of operation...
  synced color channels with 'alpha' (and 'read') masking.
  synced channels (as defined by channel)       (current default)
  individual separate channels   (currently if -channel is set by user)

Ini peregangan histogram yang murni matematis, sama seperti Operator level manual. Artinya, minimumnya disetel ke nol dan maksimumnya ke Quantum range, lalu persamaan linear dipakai untuk menyetel semua nilai lain dalam gambar. Ia tidak memakai 'bin histogram' atau 'pengelompokan nilai' lain yang mungkin dipakai metode lain, baik untuk menentukan level yang akan dipakai maupun untuk penyesuaian histogram lainnya.

Normalize

Operator "-normalize" adalah yang paling sederhana dari ketiga operator ini. Ia sekadar melebarkan histogram grayscale sehingga menempati seluruh rentang dinamis nilai abu-abu, sambil memotong atau membakar 2% di ujung bawah (hitam) dan 1% di ujung atas (putih) histogram. Artinya, 2% abu-abu tergelap dalam gambar menjadi hitam dan 1% abu-abu paling terang menjadi putih. Pada kebanyakan gambar kehilangan ini tidak besar, dan hasil keseluruhannya adalah kontras (rentang intensitas) gambar otomatis dimaksimalkan. Diagram ideal diperlukan di sini!__Contoh memakai chinese chess? Di sini kita membuat gradien grayscale, lalu memuaikannya ke seluruh rentang hitam dan putih.

  magick -size 150x100 gradient:gray70-gray30 gray_range.jpg
  magick gray_range.jpg  -normalize  normalize_gray.jpg

[IM Output] [IM Output]

| _Karena alasan praktis yang berkaitan dengan ketidakakuratan warna JPEG (lihat Distorsi warna JPEG untuk rinciannya) dan noise gambar hasil pemindaian, "-normalize" tidak memuaikan warna yang paling terang dan paling gelap saja, melainkan sedikit di luar nilai-nilai itu. Artinya, ia setara dengan "-contrast-stretch" bernilai '2%,99%' (lihat di bawah).

Artinya kalau nilai warna tertinggi dan terendah sangat berdekatan, "-normalize" akan gagal, dan tidak ada tindakan yang dilakukan.

Kalau nilai warna paling terang dan paling gelap yang persis memang ingin dimuaikan sampai ke ujung ekstremnya, pakai "-auto-level" sebagai gantinya._
Sampai IM versi 6.2.5-5, "-normalize" bekerja murni sebagai operator grayscale. Artinya, kanal merah, hijau, biru, dan alpha masing-masing dimuaikan secara terpisah sesuai pengaturan "-channel". Sejak IM versi 6.2.5-5, kalau hanya pengaturan bawaan "+channel" yang diberikan, "-normalize" mengikat semua kanal warna dan menormalisasi semuanya dengan kadar yang sama. Ini menjamin warna piksel di dalam gambar tidak bergeser. Namun berarti pula piksel berwarna putih atau hitam murni belum tentu didapat. Sebagai contoh, di sini kita menambahkan beberapa warna ekstra (gradien blue ke navy) pada gambar uji normalisasi kita.

  magick -size 100x100 gradient:gray70-gray30 \
          -size  50x100 gradient:blue-navy  +append  color_range.jpg
  magick color_range.jpg -normalize  normalize.jpg

[IM Output] [IM Output]

Seperti terlihat pada contoh terakhir, untuk gambar berwarna "-normalize" memaksimalkan semua kanal bersama-sama sehingga satu kanal bernilai nol dan kanal lain bernilai maksimum. Artinya tidak ada piksel hitam yang dihasilkan, sebab semua warna biru yang ditambahkan sudah memuat nilai 'nol' pada kanal 'red' dan 'green'. Karena itu batas bawah gambar tidak memuai. Kalau perilaku "-normalize" yang lama (sebelum IM v6.2.5-5) yang diinginkan, pengaturan "-channel" apa pun selain bawaan perlu ditentukan. Untuk gambar yang tidak punya kanal alpha (atau matte), cukup pakai pengaturan kanal 'all'. |

  magick color_range.jpg -channel all  -normalize   normalize_all.jpg

[IM Output]
Sebagai alternatif, tiap kanal dapat dinormalisasi sebagai gambar terpisah memakai operator "-separate" (sejak IM v6.2.9-2), lalu digabungkan lagi menjadi satu gambar dengan "-combine". |

  magick color_range.jpg -separate -normalize -combine normalize_sep.jpg

[IM Output]
Pada dua contoh terakhir ini, terlihat bahwa area grayscale gambar berubah menguning, sebab kanal 'red' dan 'green' dicerahkan sementara kanal 'blue' hanya digelapkan sedikit. Ini membawa kita ke satu hal penting

Normalise dan operator Histogram lainnya sebenarnya operator grayscale,
berhati-hatilah saat memakainya pada gambar berwarna.

Sebenarnya "-normalize" hanyalah bagian dari "-contrast-stretch" yang lebih umum, dengan nilai bawaan black-point 2% dan white-point=1%. Jadi, apa itu "-contrast-stretch"?

contrast-stretch

Operator "-contrast-stretch" (ditambahkan pada IM v6.2.6) mirip dengan "-normalize", hanya saja pengguna boleh menentukan sendiri banyaknya piksel yang akan dipotong atau dibakar. Artinya, ia memberi sedikit kendali atas pemilihan 'black-point ' dan 'white-point ' yang akan dipakainya untuk peregangan histogram. Jadi pengguna menentukan cacah (atau cacah dalam persen) abu-abu tergelap dalam gambar yang akan menjadi hitam dan cacah abu-abu paling terang yang akan menjadi putih. Sebagai contoh, perintah ini mengganti 15% warna teratas sekaligus 15% terbawah dengan nilai ekstremnya (putih dan hitam), lalu meregangkan sisa 70% warnanya sebagaimana mestinya. Hasil akhirnya adalah upaya memperbaiki kontras gambar secara keseluruhan.

  magick gray_range.jpg  -contrast-stretch 15%  stretch_gray.jpg

[IM Output] [IM Output]

Efek 'burn' dan 'clip' juga mudah terlihat di bagian atas dan bagian bawah gradien di atas, karena warna abu-abu itu teregang jauh melampaui batas rentang warna. Dan di sini saya sengaja 'membakar' 90% abu-abu yang lebih gelap, menyisakan hanya 10% piksel paling terang untuk diregangkan menjadi gradien linear yang rapat di bagian atas gambar. |

  magick gray_range.jpg  -contrast-stretch 90%x0%  stretch_black.jpg

[IM Output]
Ini cukup berguna untuk menemukan 'N' piksel paling terang dalam sebuah gambar, sebab hanya piksel itulah yang tidak 'terbakar' menjadi nilai nol. (Cara yang lebih baik adalah memakai "-threshold-black") Satu aspek penting "-contrast-stretch" adalah pemakaian nol untuk cacah ambang black-point dan white-point. Dalam hal ini, "-contast-stretch 0" akan mencari bin minimum dan maksimum pada histogram gambar. Karena pencacahan sebenarnya dimulai di bin-bin itu, hasilnya sekadar meregangkan bin min dan maks menjadi hitam penuh dan putih penuh. Hasilnya berupa peregangan kontras dengan pemotongan seminimal mungkin atau bahkan nol, dan semua nilai di dalam 'bin' tersebut menjadi 0 dan nilai maksimum.
| | | |
Sedang dikerjakan

Linear-Stretch

Dalam banyak hal "-linear-stretch" sangat mirip dengan operator "-contrast-stretch" sebelumnya. Kedua fungsi dapat menerima argumen black-point dan white-point, baik sebagai cacah mentah maupun sebagai persentase jumlah total piksel yang terlibat. Namun ada beberapa perbedaan penting. Perbedaan pertama menyangkut cara black-point dan white-point bawaan dihitung. Pada "-contrast-stretch". Kalau hanya satu nilai yang diberikan, yaitu black-point, titik putihnya bernilai sama. Jadi "-contrast-stretch 1" setara dengan "-contrast-stretch 1x1" dan "-contrast-stretch 1%" setara dengan "-contrast-stretch 1x1%"". Sebaliknya pada "-linear-stretch", kalau hanya satu nilai yang diberikan, yaitu black-point, titik putihnya bernilai komplemennya. Artinya, kalau black-point ditulis sebagai cacah mentah, white-point-nya adalah total piksel dalam gambar dikurangi cacah black-point. Begitu pula, kalau black-point ditulis sebagai cacah persen, white-point-nya adalah 100% dikurangi persentase black-point. Jadi "-linear-stretch 1%" setara dengan "-linear-stretch 1x99%". Perbedaan kedua menyangkut dari mana pencacahan dimulai. Bayangkan histogram dengan 256 bin (sebagian 'bin' mungkin bercacah nol) yang membentang dari tingkat abu-abu 0 sampai tingkat abu-abu 255. Pada "-contrast-stretch", pencacahan dimulai dari nol pada bin terisi terendah (min) dan tertinggi (maks) dalam gambar (yang boleh jadi berada di bin 0 atau bin 255, boleh jadi tidak). Jadi black-point 10% akan mengumpulkan cacah dari semua bin sesudah bin min sampai mencapai 10%, lalu meregangkan sisi hitam dari tingkat abu-abu itu. Akibatnya jumlah yang terbakar di sisi hitam histogram menjadi 10% ditambah apa yang sudah ada di 'bin' yang lebih gelap sebelumnya. Begitu pula bila mencacah dari sisi terang histogram. Pada "-linear-stretch", pencacahan dimulai dari ujung-ujung histogram, yaitu di bin 0 dan bin 255. Jadi jumlah yang terbakar di sisi gelap selalu sebesar nilai black-point dan jumlah yang terbakar di sisi terang selalu sebesar nilai white-point. Sebagai contoh, mari kita ambil gradien 100 piksel dan lihat histogramnya. |

  magick -size 1x100 gradient: \
          -depth 8 -format "%c" histogram:info:

[IM Text]

Seperti diduga, tiap bin terisi merata oleh satu piksel, sehingga cacahnya 1. (Untuk melihat daftar lengkapnya klik gambar teks keluaran di atas). Sekarang mari lakukan hal yang sama setelah memakai "-contrast-stretch 10x10%"

  magick -size 1x100 gradient:   -contrast-stretch 10x10%  \
          -depth 8 -format "%c" histogram:info:

[IM Text]

Dan sekarang "-linear-stretch 10x10%".

  magick -size 1x100 gradient:   -linear-stretch 10x10%  \
          -depth 8 -format "%c" histogram:info:

[IM Text]

Jadi terbukti bahwa untuk "-contrast-stretch 10x10%" kita mendapat 11 piksel di tiap ujung. Yaitu, setara dengan cacah pada bin ujung ditambah 10% piksel gambar, yang sama dengan 10 piksel. Jadi 10+1=11 piksel terbakar. Sebaliknya pada "-linear-stretch", bin ujungnya berakhir hanya memuat 10 piksel atau 10% dari gambar. Salah satu akibat perbedaan tersebut adalah "-contrast-stretch 0x0" bisa mengubah gambar, kalau bin terisi terendah dan/atau tertinggi bukan bin ujung di 0 dan 255. Dalam hal itu gambar akan diregangkan di antara tingkat abu-abu yang bersesuaian dengan bin-bin tersebut. Sebaliknya "-linear-stretch 0x0" tidak akan pernah mengubah gambar. Sebagai contoh, mari kita ambil gradiennya lalu mampatkan tingkat abu-abunya sebesar 10% di tiap ujung. Artinya, kita menaikkan black-point 10% ke tingkat abu-abu 26 dan menurunkan white-point 10% ke tingkat abu-abu 230.

  magick -size 1x100 gradient:   +level 10x90%  \
          -depth 8 -format "%c" histogram:info:

[IM Text]

Sekarang mari terapkan "-contrast-stretch 0x0" pada gradien yang sudah dikurangi kontrasnya di atas

  magick -size 1x100 gradient: -level 10x90%  -contrast-stretch 0x0  \
          -depth 8 -format "%c" histogram:info:

[IM Text]

Dan sekarang "-linear-stretch 0x0"

  magick -size 1x100 gradient: -level 10x90%  -linear-stretch 10x10% \
          -depth 8 -format "%c" histogram:info:

[IM Text]

Jadi terlihat bahwa gambar aslinya punya histogram yang tidak membentang di seluruh rentang dinamis 0 sampai 255. Ia hanya membentang antara tingkat abu-abu 26 dan 230. Tetapi setelah "-contrast-stretch 0x0" diterapkan, histogramnya teregang ke rentang dinamis penuh. Sebaliknya "-linear-stretch 0x0" tidak mengubah histogram hasilnya sama sekali. Perbedaan ketiga adalah "-contrast-stretch" peka terhadap kanal, sedangkan "-linear-stretch" tidak. Artinya dengan "-contrast-stretch" satu kanal atau lebih dapat diubah tanpa memengaruhi kanal lain. Jadi kalau tidak ada kanal yang ditentukan, histogram keseluruhan dari semua kanal dipakai untuk memodifikasi semua kanal dengan cara yang sama sehingga tidak ada pergeseran warna. Namun kalau "-channel RGB" ditentukan, tiap kanal diregangkan sendiri-sendiri dan hasilnya bergantung pada bin ujung di masing-masing kanal. Kalau bin-bin itu berbeda, akan muncul pergeseran warna antarkanal pada gambar hasilnya. Dengan "-linear-stretch", semua kanal diproses dengan cara yang sama, sehingga dipastikan tidak ada pergeseran warna antarkanal. Nah, mari kita ambil identify verbose sekaligus histogram sebuah gambar nyata.

  magick port.png  -verbose -identify +verbose  histogram:port_hist.gif

[IM Text] | [IM Output]
[IM Output]

Terlihat bahwa tak satu pun kanal gambar di atas membentang di seluruh rentang dinamis. Perhatikan pula bahwa tiap kanal membentang pada rentang nilai yang berbeda-beda. Sekarang mari terapkan "-contrast-stretch 1x1%" tanpa pengaturan "-channel".

  magick port.png -contrast-stretch 1x1% \
          -write histogram:port_cs1_hist.gif   port_cs1.png

[IM Output] [IM Output]

Pada hasil di atas, gambar diregangkan secara konsisten di semua kanal. Jadi tidak ada pergeseran warna antarkanal. Sekarang mari lakukan hal yang sama tetapi dengan "-channel RGB".

  magick port.png  -channel RGB  -contrast-stretch 1x1% \
          -write histogram:port_cs1rgb_hist.gif    port_cs1rgb.png

[IM Output] [IM Output]

Pada hasil di atas, karena kita menyetel "-channel RGB" alih-alih memakai pengaturan kanal bawaan, gambar diregangkan berbeda-beda untuk tiap kanal. Ini menimbulkan pergeseran warna antarkanal. Sekarang mari terapkan "-linear-stretch" tanpa pengaturan "-channel".

  magick port.png   -linear-stretch 1x1% \
          -write histogram:port_ls1_hist.gif \
          port_ls1.png

[IM Output] [IM Output]

Pada hasil di atas, gambar diregangkan secara konsisten di semua kanal. Jadi tidak ada pergeseran warna antarkanal. Sekarang mari lakukan hal yang sama, tetapi dengan "-channel RGB".

  magick port.png  -channel RGB  -linear-stretch 1x1% \
          -write histogram:port_ls1rgb_hist.gif    port_ls1rgb.png

[IM Output] [IM Output]

Pada hasil di atas dengan "-linear-stretch", gambar diregangkan secara konsisten di semua kanal dan "-channel RGB" diabaikan. Jadi tidak ada pergeseran warna antarkanal dan hasilnya identik dengan yang di atas tanpa "-channel RGB".

Redistribusi histogram

Redistribusi histogram adalah teknik nonlinear yang menata ulang sebaran bin dalam sebuah histogram supaya bentuknya tertentu. Dua bentuk yang paling umum adalah seragam (datar) dan Gaussian (berbentuk lonceng), meski Hiperbolik dan Rayleigh merupakan jenis sebaran lain yang juga pernah dipakai.

Equalize - redistribusi histogram seragam

Untuk sebaran seragam, bin histogram digeser, diatur jaraknya, dan digabungkan sehingga rata-rata histogramnya berketinggian datar atau tetap di sepanjang rentang. Ini disebut ekualisasi histogram. Fungsi IM "-equalize" melakukannya. Sayangnya, fungsi ini bekerja pada tiap kanal secara terpisah, bukan menerapkan operasi yang sama pada semua kanal. Karena itu pergeseran warna mungkin terjadi bila diterapkan pada ruang warna RGB. Berikut contoh ekualisasi histogram memakai fungsi IM -equalize. Perhatikan pergeseran keseimbangan warna akibat ekualisasi pada tiap kanal secara mandiri.

  magick zelda.png  -write histogram:zelda_hist.gif \
          -equalize  -write histogram:zelda_equal_hist.gif \
          zelda_equal.png

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

Mungkin Anda perhatikan histogramnya tidak tampak begitu seragam. Tetapi kalau gambar hasilnya kita konversi ke grayscale lalu histogramnya ditampilkan, histogram itu tampak sedikit lebih seragam dibanding histogram grayscale gambar aslinya

  magick zelda.png  -colorspace gray   histogram:zelda_ghist.gif

  magick zelda_equal.png  -colorspace gray \
          histogram:zelda_equal_ghist.gif

[IM Output] [IM Output]

Cara lain untuk menata ulang sebaran bin adalah memakai lookup table transformasi yang dihasilkan dari histogram kumulatif tiap kanal secara terpisah dan kurva sebaran terintegrasi yang diinginkan. Kalau pergeseran warna antarkanal tidak dikehendaki, yang dipakai adalah histogram gabungan dari semua kanal gambar. Hampirannya cukup dengan memakai histogram gambar setelah dikonversi ke grayscale. Fred Weinhaus mengembangkan skrip bernama "redist" yang melakukan persis itu. Skrip ini menata ulang histogram sebuah gambar menjadi sebaran seragam, sambil menerapkan perubahan yang sama secara merata pada semua kanal warna.

  redist -s uniform zelda.png  zelda_uniform.png

  magick zelda_uniform.png   histogram:zelda_uniform_hist.gif

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

Perhatikan bagaimana hasilnya berbeda dari operator bawaan IM "-equalize". Tepatnya, semua warna terjaga, tanpa pergeseran warna yang tadi terlihat. Yang dilakukan skrip itu adalah bekerja pada histogram grayscale, lalu menerapkannya ke semua kanal warna, sehingga semua warna tetap bergerak bersama. Sebagai pembanding histogram "-equalize" IM, mari kita tampilkan juga hasil histogram grayscale-nya di sini. Perhatikan bahwa histogram yang sudah ditata ulang tampak sedikit lebih rata (datar, atau seragam) daripada histogram hasil equalize IM.

  magick zelda.png  -colorspace gray   histogram:zelda_ghist.gif

  magick zelda_uniform.png  -colorspace gray \
          histogram:zelda_uniform_ghist.gif

[IM Output] [IM Output]

FUTURE: Add examples of equalizing in other colorspaces! That is, the grayscale channel in HSL, HSB and CMYK colorspaces.

Redistribusi Gaussian

Mengekualisasi histogram bukan satu-satunya cara mengubah sebaran histogram sebuah gambar. Sebenarnya cara itu biasanya tidak begitu berguna, kecuali dalam aplikasi computer vision. Berikut gambar yang sama, tetapi ditransformasikan sehingga histogramnya bersebaran Gaussian (berbentuk lonceng). Nilai yang dipakai di sini adalah rerata abu-abu 60%, dengan peluruhan sigma 60 ke kedua sisi rerata itu.

  redist -s gaussian 60,60,60  zelda.png \
         zelda_gaussian.png

  magick zelda_gaussian.png -colorspace gray \
          histogram:zelda_gaussian_ghist.gif

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

Dari histogram grayscale hasilnya, terlihat bahwa gambar dimodifikasi sehingga warnanya mengikuti sebaran bertipe kurva lonceng Gaussian. Untuk foto, cara ini memberi hasil yang tampak lebih 'wajar'. Gambarnya bukan hanya dioptimalkan kontrasnya, melainkan juga disetel kecerlangannya sehingga sebagian besar piksel dalam gambar berkecerlangan grayscale sekitar 60%.

Metodologi redistribusi histogram

Jadi bagaimana penyesuaian histogram langsung semacam ini bekerja? Pada dasarnya ia menghitung histogram gambar yang ada sekarang dan histogram sebaran yang diinginkan. Lalu ia mencari tahu bagaimana nilai tingkat abu-abu tiap 'bin' perlu diubah supaya cacah dalam bin-bin itu sedekat mungkin mengikuti sebaran yang diinginkan. Sebagian bin mungkin digeser lebih gelap, sebagian lagi digeser lebih terang. Prosesnya sebenarnya cukup berbelit, jadi mari kita telusuri langkah demi langkah.
Pertama, kita perlu mendapatkan data histogram yang sesungguhnya dari ImageMagick, bukan gambar grafis histogramnya. Perhatikan bahwa datanya berasal dari semua nilai warna, digabungkan menjadi grayscale. Ini dilakukan supaya semua kanal tersebar bersama-sama, dan kecerlangan keseluruhan gambar disetel mengikuti kurva yang diinginkan.

  magick zelda.png -colorspace gray \
         -depth 8 -format "%c" histogram:info:- |\
    tr -cs '0-9\012' ' ' |\
      awk '# collect the histogram data.
           { bin[$2] += $1; }
           END { for ( i=0; i<256; i++ ) {
                   print bin[i]+0;
                 }
               } ' > zelda_hist_data.txt

  # get the maximum count for any one histogram 'bin'
  max_count=`sort -n zelda_hist_data.txt | tail -n 1`

  # magick histogram into a profile graph of the data
  echo "P2 256 1 $max_count" | cat - zelda_hist_data.txt |\
    im_profile -s - zelda_hist_graph.gif

[IM Output] [IM Output]

Untuk mengumpulkan datanya saya mengambil meta-data 'comment' dari gambar histogram, yang memang disertakan IM justru untuk keperluan ini. Data itu lalu dibersihkan sehingga tersisa angka mentahnya saja (memakai program bernama "tr", singkatan dari 'translate'). Data mentah tersebut kemudian diberikan ke program utilitas lain bernama "awk", yang dipakai untuk mengumpulkan cacah histogram sesungguhnya bagi tiap bin. Supaya hasilnya bisa kita lihat, cacah histogram itu juga saya olah menjadi gambar gradien (lewat format file gambar NetPBM, PGM teks grayscale, lalu ditampilkan sebagai grafik garis memakai skrip "im_profile". Pada dasarnya ini sekadar cara lain menghasilkan gambar histogram, hanya saja kali ini langsung dari file data numerik. Setelah data histogram ada dalam sebuah file teks, kita juga memerlukan histogram fungsi yang ingin dicocoki oleh data yang ditata ulang itu. Dalam hal ini sebuah sebaran Gaussian dengan nilai rerata 153 (abu-abu 60%) dan lebar sigma 60. Kedua nilai itu dinyatakan dalam rentang 256 'bin' histogram.

  awk '# AWK to generate gaussian distribution graph
        BEGIN { mean = 153;   sigma = 60;
                fact = 1/(2*(sigma/256)^2);
                expo = exp(1);
                for ( i=0; i<256; i++ ) {
                  print int(65535*expo^(-(((i-mean)/256)^2)*fact));
                }
              }' /dev/null  > gaussian_hist_data.txt

   # magick gaussian data into a profile graph
   echo "P2 256 1 65535" | cat - gaussian_hist_data.txt |\
     im_profile -s -b - gaussian_hist_graph.gif

[IM Output]

Histogram di atas menarik dan mencerminkan sebaran histogram asli gambar serta keadaan histogram yang diinginkan. Tetapi untuk keperluan konversi, bentuk histogram seperti ini, meski enak dipahami, tidak begitu berguna bagi tujuan kita. Sebenarnya yang benar-benar kita perlukan adalah histogram kumulatif. Histogram semacam ini sangat mirip histogram biasa, hanya saja tiap 'bin' berisi cacah 'bin'-nya sendiri ditambah semua 'bin' yang mendahuluinya, mulai dari 0. Artinya, tiap 'bin' merupakan 'akumulasi' atau cacah dari semua 'bin' yang lebih gelap. Histogram ini justru lebih mudah dihasilkan langsung dari gambar aslinya. Jadi mari kita ulangi prosesnya, tetapi dengan menghitung dan menyimpan cacah 'kumulatif'.

  magick zelda.png -colorspace gray \
         -depth 8 -format "%c" histogram:info:- |\
    tr -cs '0-9\012' ' ' |\
      awk '# Collect the cumulative histogram for an image
               { bin[$2] += $1; }
           END { for ( i=0; i<256; i++ ) {
                   cum += bin[i];
                   print cum;
                 }
               } ' > zelda_cumhist_data.txt

  total_count=`tail -n 1 zelda_cumhist_data.txt`
  echo "P2 256 1 $total_count" | cat - zelda_cumhist_data.txt |\
    im_profile -s - zelda_cumhist_graph.gif

  awk '# AWK to generate gaussian distribution cumulative graph
        BEGIN { mean = 153;   sigma = 60;
                fact = 1/(2*(sigma/256)^2);
                expo = exp(1);
                for ( i=0; i<256; i++ ) {
                  gas[i] = expo^(-(((i-mean)/256)^2)*fact);
                  total += gas[i]
                }
                for ( i=0; i<256; i++ ) {
                  cum += gas[i];
                  print int(65535*cum/total);
                }
              }' /dev/null  > gaussian_cumhist_data.txt

  total_count=`tail -n 1 gaussian_cumhist_data.txt`
  echo "P2 256 1 $total_count" | cat - gaussian_cumhist_data.txt |\
    im_profile -s -b - gaussian_cumhist_graph.gif

[IM Output]
Histogram kumulatif
gambar | [IM Output]
Histogram kumulatif
Gaussian

Sekarang yang perlu kita lakukan adalah me-magick histogram kumulatif gambar menjadi histogram kumulatif gaussian. Untuk itu, tiap nilai abu-abu pada gambar masukan dipakai untuk mencari nilai kumulatif 'ternormalisasi'-nya. Nilai itu lalu dipetakan ke nilai kumulatif yang sama pada sebaran gaussian, lalu nilai abu-abu yang bersesuaian dengannya ditemukan. Diagram berikut mestinya memperjelas proses pemetaan itu...

[diagram]

Perintah berikut melakukan pencarian untuk setiap nilai warna 8-bit yang mungkin, guna menghasilkan sebuah Color Look Up Table, atau CLUT. Gambar khusus ini kemudian dapat dipakai untuk memetakan nilai warna dalam gambar asli ke nilai baru yang diperlukan untuk menata ulang histogram gambar.

  # Generate a CLUT to Redistribute the Histogram
  paste  zelda_cumhist_data.txt   gaussian_cumhist_data.txt |\
    awk '# AWK to generate gaussian distribution graph
              { bin[NR] = $1;   gas[NR] = $2;  }
          END { k=0;  # number of pixels less than this value
                print "P2 256 1 65535";
                for ( j=0; j<256; j++ ) {
                  while ( k<255 &&
                            gas[k]/gas[255] <= bin[j]/bin[255] ) {
                    k++;
                  }
                  print 65535*k/255;
                }
              }' |\
      magick pgm:- gaussian_clut.png

  magick zelda.png   gaussian_clut.png -clut   zelda_redist.png

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

Seperti terlihat, mengonversi histogram sebuah gambar supaya mengikuti fungsi sebaran tertentu, misalnya kurva lonceng gaussian, adalah proses yang cukup berbelit dan sangat numeris. Berikut semuanya dalam satu perintah yang agak panjang dan rumit...

  magick zelda.png -colorspace gray \
         -depth 8 -format "%c" histogram:info:- |\
    tr -cs '0-9\012' ' ' |\
      awk '# AWK to generate gaussian distribution graph
            { # just read in image histogram into a 'bin' table
                  bin[$2] += $1;
                }
            END { # Generate Gaussian Histogram
                  mean = 153;   sigma = 60;
                  fact = 1/(2*(sigma/256)^2);
                  expo = exp(1);
                  for ( i=0; i<256; i++ ) {
                    gas[i] = expo^(-(((i-mean)/256)^2)*fact);
                  }
                  # Convert normal histograms to cumulative histograms
                  for ( i=0; i<256; i++ ) {
                    gas[i] += gas[i-1];
                    bin[i] += bin[i-1];
                  }
                 # Generate Redistributed Histogram
                 k=0;  # number of pixels less than this value
                 print "P2 256 1 65535";
                 for ( j=0; j<256; j++ ) {
                   while ( k<255 &&
                            gas[k]/gas[255] <= bin[j]/bin[255] ) {
                     k++;
                   }
                   print 65535*k/255;
                 }
                }' |\
        magick zelda.png   pgm:-  -clut   zelda_gaussian_redist.png

[IM Output] [IM Output]

Beberapa catatan penutup tentang teknik di atas.

  • Pemakaian "awk" untuk melakukan perhitungan demi mempercepat skrip "redist" milik Fred Weinhaus disarankan dan disumbangkan oleh Anthony Thyssen.
  • Untuk menerapkan teknik redistribusi di atas guna menghasilkan sebaran 'seragam' atau 'terekualisasi', histogram fungsinya cukup berupa konstanta. Ini pada gilirannya menghasilkan sebaran terintegrasi yang tak lain adalah rumus y = x, alias garis lurus diagonal saja. Menerapkan teknik konversi yang sama menghasilkan gambar CLUT yang ternyata identik dengan histogram kumulatif gambar masukan. Dengan kata lain, untuk ekualisasi histogram, histogram kumulatif gambar cukup di-magick menjadi CLUT lalu diterapkan langsung pada gambar.
  • Kebanyakan paket pemrosesan gambar, termasuk ImageMagick saat ini, menerapkan rumus transformasi langsung pada nilai di dalam gambar itu sendiri, bukan menghasilkan CLUT antara. Namun karena histogram, dan dengan begitu histogram kumulatif, berukuran terbatas (biasanya 256 'bin'), hal itu dapat menimbulkan error serius, sebab nilai warna gambar bisa terbulatkan selama prosesnya. Sebaliknya dengan ImageMagick, kita menghasilkan CLUT antara (yang memuat error pembulatan yang sama itu), lalu me-magick nilai gambar asli yang belum terbulatkan melalui CLUT yang sudah disiapkan tadi memakai interpolasi linear atas nilai-nilainya. Berkat interpolasi ini, nilai warna gambar baru lebih akurat, sebab tidak terbulatkan atau di-'bin' selama pemrosesan.

Semoga hal di atas kelak dipasang langsung ke dalam ImageMagick. Sementara itu, skrip "redist" milik Fred Weinhaus tersedia untuk mengerjakan tugas tersebut. Anda mungkin juga tertarik pada skrip "retinex" milik Fred, yang berupaya melakukan penguatan otomatis serupa pada gambar, tetapi di wilayah-wilayah lokal gambar, bukan secara global seperti teknik ini.


Penyesuaian level DIY

Penyesuaian histogram linear secara matematis

Berbagai bentuk dasar penyesuaian level yang ditunjukkan di atas menyesuaikan warna gambar secara linear. Perubahan semacam itu dapat pula diterapkan secara matematis. Misalnya, dengan mengalikan gambar dengan warna tertentu, kita menetapkan semua area putih murni menjadi warna tersebut. Jadi mari kita baca saja gambar kita, buat gambar yang berisi warna yang kita inginkan, lalu kalikan gambar aslinya dengan warna itu memakai "-fx" bentuk bebas milik IM atau operator DIY.

  magick test.png  -size 1x1 xc:Yellow \
          -fx 'u*v.p{0,0}'    fx_linear_white.png

[IM Output] [IM Output]

Dengan membuat "-fx" membaca warna dari gambar 'v' kedua, warnanya jadi mudah diganti tanpa perlu mengonversi warna ke nilai RGB untuk dipakai dalam perhitungan. Kalau Anda memakai paket pemrosesan gambar grafis yang mewah seperti "Gimp" dan "Photoshop", operasi di atas akan diterapkan ke gambar dengan menyetel 'kurva' grafik histogram warna gambar tersebut. [IM Output] Sebagai contoh, di sebelah kanan ada grafik hasil "gnuplot" (lihat skrip "**im_histogram**") dari rumus matematisnya, yang memperlihatkan apa yang terjadi pada salah satu saja dari tiga kanal RGB. Warna aslinya (garis hijau) dipetakan ulang ke warna yang lebih gelap (garis merah) secara linear. Mewarnai bagian hitam secara linear juga cukup mudah. Misalnya, memetakan 'black' secara linear ke warna serupa emas 'rgb(204,153,51)' (sementara 'white' dibiarkan tetap 'white') memerlukan rumus matematis seperti...

          result = 1-(1-color)*(1-intensity)

Rumus ini menegasikan warna, mengalikan gambar dengan negasi warna yang diinginkan, lalu menegasikan gambar itu kembali. Hasilnya adalah pewarnaan pada sisi hitam dari grayscale, sementara putih dibiarkan tidak berubah.

  magick test.png  -size 1x1 xc:'rgb(204,153,51)'  \
          -fx '1-(1-v.p{0,0})*(1-u)'   fx_linear_black.png

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

Grafik histogram "gnuplot" dari rumus pemetaan ulang itu juga ditampilkan di atas sebagai rujukan. Dengan rumus yang sedikit lebih rumit, ujung 'black' dan ujung 'white' dari grayscale dapat sekaligus diganti dengan warna tertentu.

  magick test.png  -size 1x2  gradient:gold-firebrick \
          -fx 'v.p{0,0}*u+v.p{0,1}*(1-u)'   fx_linear_color.png

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

Bagian "-size 1x2 gradient:color1-color2" di atas hanya dipakai untuk menghasilkan gambar dua piksel berwarna yang dirujuk oleh rumus "-fx". Warna pertama menggantikan putih, warna kedua menggantikan hitam, dan semua warna lain diinterpolasi di antara putih dan hitam. Seperti lazimnya operator grayscale, tiap kanal RGB diperlakukan sebagai kanal grayscale tersendiri, meski interpolasi linearnya berbeda untuk tiap kanal. Omong-omong, ini persis setara dengan operator penyesuaian level berdasarkan warna "+level-colors" Namun tidak seperti "+level-colors", warna yang dipakai tentu saja bisa berasal dari sumber gambar mana pun, bukan hanya dari nama warna yang diberikan sebagai argumen. Meski begitu, memakai nama warna secara langsung pun mungkin. |

  magick test.png   -fx "yellow*u+green*(1-u)"  fx_linear.png

[IM Output]

Penyesuaian histogram nonlinear secara matematis

Penyesuaian warna linear memang penting dan metode yang lebih cepat pun tersedia, tetapi ada banyak situasi ketika penyesuaian 'level' yang linear bukanlah yang diinginkan, dan di situlah "-fx", operator DIY, menjadi lebih berguna. Nah, rumus alternatif untuk penyesuaian linear adalah "-fx 'v.p{0,1}+(v.p{0,0}-v.p{0,1})*u'", yang punya keunggulan: 'u' dapat diganti dengan satu fungsi sembarang 'f(u)' sehingga menghasilkan perubahan warna nonlinear. Dengan begitu hal-hal yang lebih menarik bisa dikerjakan. Misalnya, bagaimana kalau pada contoh terakhir tadi semua warna ingin didorong ke sisi 'black' sehingga gambarnya menjadi lebih bernuansa 'firebrick'.

  magick test.png -size 1x2  gradient:gold-firebrick \
          -fx 'v.p{0,1}+(v.p{0,0}-v.p{0,1})*u^4'  fx_non-linear.png

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

Sebagai contoh yang lebih praktis, Adelmo Gomes memerlukan penyesuaian warna untuk skrip pewarnaan ulang peta cuaca otomatis yang sedang ia kembangkan. Dalam kasus ini ia ingin mewarnai bagian hitam murni pada gambar menjadi biru .25, tetapi membiarkan sisa grayscale-nya apa adanya, terutama bagian putih dan abu-abu nada tengah gambar itu. Hanya warna biru yang perlu disesuaikan seperti itu, dan selama ini ia mengerjakannya dengan tangan di editor gambar. Misalnya, rumus kuadrat seperti 'u^2' dapat dipakai untuk mewarnai ujung hitam histogram menjadi biru '.25'. Hanya kanal biru yang perlu diubah, jadi nilainya disisipkan langsung ke dalam rumus.

  magick test.png  -channel B  -fx '.25+(1-.25)*u^2'  fx_quadratic.png

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

Namun, meski hasilnya lumayan, cara ini sedikit menggelapkan abu-abu nada tengah sehingga muncul warna kekuningan yang tidak sedap dipandang. Untuk menghindarinya, fungsi 'eksponensial' dapat dipakai sebagai gantinya agar proses pewarnaan lebih terkendali.

  magick test.png  -channel B  -fx '.3*exp(-u*4.9)+u'  fx_expotential.png

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

Sekali lagi grafiknya memperlihatkan bagaimana kanal biru diubah sehingga hitam mendapat rona biru tua yang khas. Nilai kedua ('4.9') adalah laju peluruhan kembali ke grafik linear '+u'. Makin kecil nilai ini, makin lambat peluruhannya dan makin linear penyesuaiannya. Makin besar nilainya, makin dramatis 'peluruhan' itu. Nilai tersebut mungkin perlu disetel untuk nilai warna yang berbeda, jadi ini bukan rumus umum yang baik untuk mewarnai hitam secara umum, tetapi sempurna untuk mewarnai peta cuaca. Umumnya, kalau penyesuaian warna yang diinginkan bisa dinyatakan secara matematis, operator "-fx" dapat dipakai untuk mencapai hasil yang diinginkan.

Penyesuaian 'Curves'

[diagram] Biasanya di editor foto grafis akan tersaji bagan 'curves' histogram seperti yang saya tampilkan di sebelah kiri. Pengguna lalu dapat menyunting 'curve' itu dengan menggeser empat (atau lebih) titik kendali, dan fungsi penyesuaian histogram akan mengikuti titik-titik tersebut. Titik kendali umumnya menyatakan bahwa level grayscale pertama setelah penyesuaian menjadi level grayscale kedua. Jadi titik seperti 0.0,0.2 pada dasarnya berarti abu-abu 0% (hitam) setelah penyesuaian seharusnya menjadi level abu-abu 20%. Nah, IM tidak mengizinkan penentuan 'titik kendali' secara langsung untuk menghasilkan penyesuaian 'curve'; yang dibutuhkannya adalah rumus matematis dari 'curve' tersebut. Untungnya ada program yang bisa menghasilkan rumus kurva itu dari titik kendali, antara lain "gnuplot", "fudgit", "mathematica", dan "matlab", serta banyak paket perangkat lunak matematis lainnya. Berikut satu metode untuk menghasilkan rumusnya dari empat titik kendali memakai "gnuplot", paket tambahan standar yang dapat dipasang di sebagian besar distribusi Linux maupun Windows.

  ( echo "0.0 0.2";  echo "1.0 0.9"; \
    echo "0.2 0.8";  echo "0.7 0.5"; )   > fx_control.txt

  ( echo 'f(x) = a*x**3 + b*x**2 + c*x + d'; \
    echo 'fit f(x) "fx_control.txt" via a, b, c, d'; \
    echo 'print a,"*u^3 + ",b,"*u^2 + ",c,"*u + ",d'; \
  ) | gnuplot 2>&1 | tail -1             > fx_funct.txt

| [Data]

Titik kendali [Gnuplot]
[Gnuplot]
Fungsi FX hasil pencocokan Gnuplot

| _Perhatikan bahwa jumlah parameter ('a' sampai 'd' di atas) yang diperlukan untuk pencocokan kurva harus sama dengan jumlah titik kendali yang Anda berikan. Karena itu, kalau ingin memakai lima titik kendali, satu suku 'e' lagi perlu ditambahkan ke fungsinya.

Kalau kurva histogram Anda melewati titik kendali tetap 0,0 dan 1,1, sebenarnya hanya dua parameter yang diperlukan karena 'd' akan sama dengan '0' dan 'c' akan sama dengan '1-a-b'.

_
Panduan pemakaian yang lebih rinci untuk hal di atas, khusus bagi pengguna Windows tetapi berlaku juga bagi pengguna Linux, telah diposkan di StackOverflow: IM Curves using Gnuplot on Windows. Seperti terlihat pada gambar tambahan hasil "gnuplot" di atas, fungsi yang dihasilkan mencocoki titik kendali dengan sempurna. Selain itu, karena yang dihasilkan adalah rumus bergaya "-fx", rumus itu bisa dipakai apa adanya sebagai argumen IM. Sebagai contoh... |

  magick test.png    -fx "`cat fx_funct.txt`"     fx_funct_curve.png

[IM Output]
Agar pengguna lebih mudah mengonversi titik kendali menjadi fungsi penyesuaian histogram, saya membuat skrip shell bernama "**im_fx_curves**" yang memanggil "gnuplot" dan mengeluarkan persamaan polinomial yang lebih rapi dari titik kendali yang diberikan. Gabe Schaffer juga menyediakan versi perl (memakai modul pustaka "Math::Polynomial" yang diunduh) bernama "**im_fx_curves.pl**" untuk keperluan yang sama. Skrip mana pun bisa dipakai. Sebagai contoh, berikut kurva lain dengan 5 titik kendali...

    im_fx_curves  0,0.2  0.3,0.7  0.6,0.5  0.8,0.8  1,0.6  > fx_curve.txt

[Gnuplot] | | | [Gnuplot]

Namun fungsi FX sangat lambat. Sejak IM 6.4.8-9, koefisien hasil pencocokan ekspresi polinomial itu dapat langsung diumpankan ke metode fungsi polinomial. Daftar koefisien yang dipisahkan koma dapat dihasilkan dengan "**im_fx_curves**" memakai opsi khusus '-c'...

    im_fx_curves -c  0,0.2  0.3,0.7  0.6,0.5  0.8,0.8  1,0.6  > coefficients.txt

[Gnuplot] | | | [Gnuplot]

Sebagai contoh, mari kita terapkan curve tersebut ke gambar uji kita... |

  magick test.png  -function Polynomial `cat coefficients.txt`  test_curves.png

[IM Output]
Contoh yang lebih praktis dari metode ini diuraikan pada contoh tingkat lanjut efek "Aqua". Cara alternatif untuk menghasilkan 'curves' dibahas dalam diskusi Forum IM Arbitrary tonal reproduction curves.


Mewarnai gambar

Mewarnai gambar secara seragam

Biasanya pewarnaan gambar dilakukan dengan memadukan gambar dengan suatu warna sebanyak kadar tertentu. Ini bisa dikerjakan dengan teknik operator evaluate atau memadukan gambar, tetapi keduanya tidak sederhana untuk dipakai. Untungnya tersedia metode yang lebih sederhana untuk merembeskan warna seragam ke dalam gambar, yaitu operator gambar "-colorize". Operator ini memadukan warna "-fill" yang berlaku saat itu ke seluruh gambar dalam urutan gambar yang sedang diproses. Kanal alpha gambar aslinya dipertahankan, hanya kanal warnanya yang diubah. Misalnya, untuk mencerahkan sebuah gambar (grayscale maupun bukan), kita pakai "-colorize" guna memadukan sejumlah putih ke dalam gambar sehingga menjadi lebih cerah tanpa membuatnya tersaturasi penuh.

  magick test.png  -fill white -colorize 50%  colorize_lighten.png

[IM Output] [IM Output]

Dengan cara serupa kita bisa memakai warna fill 'black' untuk menggelapkan gambar.

  magick test.png  -fill black -colorize 50%  colorize_darken.png

[IM Output] [IM Output]

Untuk mengabukan kedua ujung gambar ke arah nada tengah, gunakan warna fill abu-abu tertentu. Warna 'gray50' adalah warna tepat di tengah spektrum warna RGB.

  magick test.png  -fill gray50 -colorize 40%  colorize_grayer.png

[IM Output] [IM Output]

Cara ini juga sering dipakai sebagai metode 'de-contrast' seperti yang disediakan operator penyesuaian level terbalik, meski dengan kendali yang lebih sedikit. Operator "-colorize" juga memungkinkan penentuan persentase pelarutan untuk masing-masing dari tiga kanal warna secara terpisah. Ini berguna untuk menggelapkan (atau mencerahkan) gambar secara linear dengan cara khusus. Sebelum IM v6.7.9 operator "-colorize" sama sekali tidak mengubah kanal alpha. Sejak versi itu, seperti terlihat di atas, kini semua piksel diwarnai secara seragam termasuk piksel yang sepenuhnya transparan.
Salah satu pemakaian umum operator "-colorize" adalah sekadar mengganti semua warna pada gambar yang ada (pewarnaan '100%') sambil mempertahankan bentuk transparansi (alpha) gambar itu, sehingga dihasilkan mask berwarna. Namun sejak IM v6.7.9 kanal alpha perlu dilindungi dari operator ini dengan mematikannya lalu menyalakannya kembali. (Lihat Alpha On untuk detailnya.) Sebagai contoh...
  magick test.png -alpha off \
          -fill blue -colorize 100% \
          -alpha on  colorize_shape.png

[IM Output]
Tanpa perlindungan ini, colorize akan mengosongkan kanvas sepenuhnya menjadi warna yang diberikan... |

  magick test.png -fill blue -colorize 100% colorize_blank.png

[IM Output]
Namun kalau ada kemungkinan memakai versi IM yang lebih lama dari IM v6.7.9, saya sarankan menyertakan operasi "-alpha opaque" atau "-alpha off" pada perintah di atas untuk memastikan gambar hasilnya benar-benar kosong sesuai harapan. Perhatikan bahwa kanvas dapat dikosongkan lebih cepat memakai operator penyesuaian level berdasarkan warna dengan satu warna saja, alih-alih rentang warna. Lihat juga kanvas kosong.

Pewarnaan nada tengah

Kalau operator colorize menerapkan warna "-fill" untuk mewarnai semua warna dalam gambar secara linear, operator "-tint" menerapkan warna "-fill" sedemikian rupa sehingga hanya warna nada tengah gambar yang diwarnai. Operator ini adalah operator grayscale, dan warnanya diredam atau diperkuat oleh persentase yang diberikan (0 sampai 200). Untuk membatasi efeknya, warna itu juga disesuaikan dengan sebuah rumus matematis agar tidak memengaruhi hitam dan putih, melainkan berefek paling besar pada warna nada tengah tiap kanal warna. "-tint 100" pada dasarnya akan mewarnai abu-abu sempurna sehingga menjadi separuh intensitas warna fill. Nilai yang lebih rendah akan mewarnainya menjadi warna yang lebih gelap, sedangkan nilai yang lebih tinggi akan mewarnainya mendekati kecocokan sempurna dengan warna itu.

  magick test.png  -fill red  -tint 40 tint_red.png

[IM Output] [IM Output]

Warna hijau pada gambar uji bukan hijau RGB sejati, melainkan 'green' versi Scalable Vector Graphics yang kecerlangannya hanya separuh dari hijau sejati. Karena itu warna tersebut juga tergolong nada tengah, sehingga terpengaruh operator "-tint" dan menjadi lebih gelap, tidak seperti bercak merah dan biru pada gambar uji. Komponen warna satu per satu juga dapat diwarnai dengan memberikan daftar persentase yang dipisahkan koma, misalnya "-tint 30,40,20,10". Namun cara ini bisa merepotkan dan mungkin perlu beberapa kali percobaan agar pas. Lebih baik tentukan saja warna yang diinginkan untuk abu-abu 50% yang sempurna. | _[IM Output] Operator "-tint" bekerja dengan mengambil warna dan persentase yang diberikan, lalu menyesuaikan tiap warna dalam gambar menurut intensitas warna "-fill", sesuai rumus berikut. (lihat grafik di kanan)

_ f(x)=(1-(4.0*((x-0.5)*(x-0.5)))) _Sebuah fungsi kuadrat yang hasilnya dipakai sebagai vektor bagi warna yang sudah ada dalam gambar. Seperti terlihat, fungsi ini menggantikan warna sepenuhnya untuk abu-abu tengah murni, tanpa penyesuaian untuk putih maupun hitam.

Atau, untuk operator tingkat lebih rendah yang bisa dipakai mengerjakan sendiri hal semacam ini, lihat operator FX serta operator evaluate dan function.

_
Operator tint sangat cocok untuk menyesuaikan hasil keluaran "-shade" (lihat gambar sorotan overlay shade), seperti contoh pada gambar bullet 3d. "-tint" juga dapat dipakai untuk mencerahkan atau menggelapkan warna nada tengah sebuah gambar. Ini semacam 'penyesuaian gamma' untuk gambar, meski tidak persis. Misalnya, memakai nilai tint di atas 100 dengan warna 'white' akan mencerahkan nada tengah.

  magick test.png  -fill white  -tint 130 tint_lighter.png

[IM Output] [IM Output]

Sedangkan nilai di bawah 100 akan menggelapkan warna.

  magick test.png  -fill white  -tint 70 tint_darker.png

[IM Output] [IM Output]

| _Untuk saat ini, warna abu-abu nada tengah murni tidak akan dipetakan ke warna "-fill".

Argumen persentasenya bukan 'persentase paduan', melainkan lebih tepat 'persentase kecerlangan'. Karena itu, misalnya, argumen ini sama sekali tidak bekerja untuk warna fill 'black'.

Saya tidak tahu mengapa rancangannya begini atau apa riwayat di baliknya. Yang jelas, rancangan ini membuat kendali yang tepat atas warna akhir saat mewarnai gambar grayscale menjadi sangat merepotkan.

Memakai pewarnaan dengan komposisi overlay di bawah akan memberi pewarnaan abu-abu nada tengah yang lebih tepat (meski sangat linear, bukan parabolik).

_

Pewarnaan sepia

Sebagai teknik pewarnaan ulang fotografis khusus, "-sepia-tone" pada dasarnya mengonversi gambar menjadi grayscale lalu mewarnai semua nada tengah dengan warna cokelat khusus. |

  magick rose:  -sepia-tone 65%     sepia-tone.jpg

[IM Output]
Argumen yang diberikan adalah 'titik tengah' grayscale yang akan menjadi paling dekat dengan warna sepia, yang mirip dengan warna 'Goldenrod'. Pemakaian paling umum adalah menghasilkan efek duotone untuk membuat foto yang tampak 'tua' (lihat wikipedia tentang Sepia Tone). Sebagai contoh, di sini saya warnai gambar rose grayscale yang kontrasnya sudah dipertegas dengan berbagai warna untuk mendapatkan efek mirip sepia. Warna mana yang sebaiknya dipakai bergantung pada efek persis yang Anda cari.

  magick rose: -colorspace gray -sigmoidal-contrast 10,40%  rose_grey.jpg
  for color in      goldenrod  gold  khaki  wheat
  do
    magick rose_grey.jpg  -fill $color   -tint 100    sepia_$color.jpg
  done

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

Saya sendiri merasa bahwa mencampur atau memadukan gambar sepia dengan aslinya untuk mengurangi efeknya juga bisa menghasilkan efek 'pudar' yang lebih bagus. |

  magick rose: \( +clone -sepia-tone 60% \) -evaluate-sequence mean  sepia-tone_blended.jpg

[IM Output]
Lihat juga tabel lookup warna Hald untuk metode menyimpan variasi perubahan warna yang jauh lebih rumit, seperti contoh terakhir di atas.

Efek duotone

'Duotone' adalah metode pencetakan yang mencampur grayscale sebuah gambar (tinta hitam) dengan warna lain untuk mendapatkan hasil yang lebih baik dengan anggaran atau peralatan cetak yang terbatas. Misalnya, alasan semua foto lama yang Anda lihat sekarang bernuansa sepia adalah karena tinta sepia bertahan, tidak rusak, dan tidak pudar dimakan waktu. Format gambar 'hitam putih' lainnya memudar sampai tak berguna. Lihat operator sepia tone di atas. Teknik duotone lain yang dikenal sebagai 'Cyanotype' (lebih umum disebut 'blue-print') dahulu banyak dipakai sebagai cara membuat salinan berukuran besar dari gambar arsitek hitam putih aslinya. Ingat, teknik ini dipakai jauh sebelum laser ditemukan dan sebelum ada fotokopi (serta Xerox). Untuk keterangan lebih lanjut, lihat entri Wikipedia untuk Duotone, juga Fake duotones vs Real duotones. Namun operator tint di atas menghasilkan tiruan efek duotone yang cukup baik, sama seperti untuk efek mirip sepia tadi.

  magick rose: -colorspace gray -sigmoidal-contrast 10,40%  rose_grey.jpg
  for color in      blue  darkcyan  goldenrod  firebrick
  do
    magick rose_grey.jpg   -fill $color   -tint 100    duotone_$color.jpg
  done

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

Perhatikan bahwa saya umumnya memilih versi yang lebih gelap dari warna 'duotone', tetapi hal ini juga bisa disetel lewat argumen operator tint. Kecerlangan dan kontrasnya juga dapat disetel lewat argumen operator sigmoidal contrast. Cara lain yang lebih cermat untuk menghasilkan duotone dari tiga warna (warna titik hitam, titik tengah, dan titik putih) adalah memakai tabel lookup warna (lihat di bawah). Berikut contoh singkat saja: saya membuat duotone yang sangat tidak biasa memakai warna 'Black', 'Chocolate', dan 'LemonChiffon'. Dan benar, warna titik hitam biasanya dibiarkan hitam, itulah sebabnya lazim disebut duo -tone.

  magick -size 1x1 xc:Black xc:Chocolate xc:LemonChiffon \
                                   +append     duotone_clut.gif
  magick -size 20x256 gradient: -rotate 90   duotone_clut.gif \
          -interpolate Bicubic -clut       duotone_gradient.gif
  magick rose_grey.jpg   duotone_clut.gif \
          -interpolate Bicubic -clut       rose_duotone.jpg

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

Keunggulan cara di atas adalah kendali yang tepat atas warna titik tengah (tidak seperti tint yang tidak tepat). Ketiga warna mana pun yang Anda suka juga bisa dipakai langsung, persis seperti contoh di atas, atau pakai gradien warna yang diperluas untuk kendali yang lebih halus atas warna di antara ketiga (atau lebih) titik kendali. Teknik ini sekaligus memberi cara yang sangat ringkas untuk menyimpan efek duotone tertentu agar bisa dipakai berulang di kemudian hari. Lihat juga tabel lookup warna Hald untuk metode penyimpanan perubahan warna yang lebih rumit, yang melampaui sekadar mewarnai gambar grayscale.

Pewarnaan, DIY

Salah satu masalah terbesar "-tint" adalah sifatnya sebagai operator grayscale (atau vektor). Artinya, kanal merah, hijau, dan biru ditangani sepenuhnya terpisah satu sama lain. Akibatnya, warna primer dan sekunder seperti 'blue' atau 'yellow' tidak terpengaruh "-tint", padahal semua tingkat abu-abu terpengaruh. Namun berkat berbagai transformasi matematis per kanal seperti operator FX dan operator evaluate dan function yang lebih cepat, overlay warna buatan sendiri dapat dibuat untuk mengubah gambar. Artinya, gambar bisa diwarnai dengan cara yang mirip dengan yang dilakukan operator colorize. Sebagai contoh, di sini saya mengonversi tingkat kecerlangan grayscale sebuah gambar menjadi overlay semitransparan dengan warna tertentu yang diinginkan. |

  magick test.png  \( +clone -colorspace gray \
               -function polynomial -4,4,0 -background Gold -alpha shape \) \
          -composite   tint_diy_compose.png

[IM Output]
Peringatan: cara ini tidak mempertahankan transparansi gambar dengan benar, tetapi bekerja baik untuk gambar yang sepenuhnya opak. Perhatikan bahwa tidak seperti tint, warna apa pun bisa dipakai, termasuk 'black', karena warnanya tidak diperlakukan sebagai penjumlahan vektor melainkan sebagai komposisi alpha. Hasilnya tidak persis sama dengan yang diperoleh dari tint biasa.

Pewarnaan dengan overlay

Metode komposisi alpha khusus 'Overlay' dan 'Hardlight' sebenarnya memang dirancang dengan pewarnaan warna (dan pola) sebagai tujuannya. Metode compose ini juga akan mengganti abu-abu nada tengah sambil membiarkan sorotan hitam dan putih pada gambar apa adanya. Sebagai contoh, di sini saya cepat-cepat membuat gambar overlay berwarna, lalu mengomposisikannya untuk mewarnai gambar aslinya. |

  magick test.png \( +clone -alpha off -fill gold -colorize 100% \) \
          -compose overlay -composite  tint_overlay.png

[IM Output]
Seperti terlihat, komposisi alpha tersebut tidak mempertahankan transparansi gambar asli sama sekali, sehingga diperlukan operasi komposisi alpha kedua untuk memperbaiki masalah ini. |

  magick test.png \
          \( +clone -alpha off -fill gold -colorize 100% \
             +clone +swap -compose overlay -composite \) \
          -compose SrcIn -composite  tint_overlay_fixed.png

[IM Output]
Memakai 'Overlay' menghasilkan pewarnaan yang jauh lebih linear daripada fungsi kuadrat di atas, dan seperti "-tint" diterapkan pada tiap kanal gambar secara terpisah sehingga warna primer dan sekunder pun dibiarkan tidak berubah. Metode komposisi alpha ini juga tidak menyediakan kendali penyesuaian, jadi kalau kadar pewarnaan ingin diatur, transparansi gambar overlay-nya harus disetel dulu sebelum tint diterapkan. Tentu saja, tidak seperti metode pewarnaan lain yang sudah saya tunjukkan sejauh ini, pewarnaan di sini tidak terbatas pada satu warna sederhana, melainkan bisa memakai gambar atau pola tile. |

  magick test.png \
          \( -size 150x100 tile:tile_disks.jpg \
             +clone +swap -compose overlay -composite \) \
          -compose SrcIn -composite  tint_overlay_pattern.png

[IM Output]
Namun ini sudah keluar dari cakupan penanganan warna dasar, jadi pembahasan pewarnaan gambar saya cukupkan sampai di sini. | _Metode komposisi alpha 'HardLight' menghasilkan hasil yang sama dengan 'Overlay', tetapi dengan gambar source dan destination yang ditukar.

Ini bisa dipakai sebagai ganti "+swap" pada beberapa contoh terakhir._


Pengubah warna global

Modulate kecerlangan, saturasi, dan rona

Operator "-modulate" istimewa karena mengubah gambar di dalam ruang warna HSL (hue-saturation-lightness) yang khusus. Operator ini mengonversi tiap piksel warna ke ruang warna tersebut, mengubahnya, lalu mengonversinya kembali ke ruang warna asalnya. Ia menerima tiga nilai (nilai berikutnya opsional) berupa persentase sehingga 100 tidak mengubah gambar sama sekali. Sebagai contoh.. |

  magick rose: -modulate 100,100,100  mod_noop.gif

[IM Output]
Nilai pertama, brightness, adalah pengali bagi kecerlangan keseluruhan gambar.

  magick rose:  -modulate 0     mod_bright_0.gif
  magick rose:  -modulate 50    mod_bright_50.gif
  magick rose:  -modulate 80    mod_bright_80.gif
  magick rose:  -modulate 100   mod_bright_100.gif
  magick rose:  -modulate 150   mod_bright_150.gif
  magick rose:  -modulate 200   mod_bright_200.gif

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

Perhatikan bahwa meskipun argumen brightness '0' menghasilkan gambar hitam murni, gambar putih murni tidak dapat dihasilkan dengan operator ini sendirian. Nilai kedua, saturation, juga berupa pengali yang menyetel jumlah keseluruhan warna yang ada dalam gambar.

  magick rose:  -modulate 100,0     mod_sat_0.gif
  magick rose:  -modulate 100,20    mod_sat_20.gif
  magick rose:  -modulate 100,70    mod_sat_70.gif
  magick rose:  -modulate 100,100   mod_sat_100.gif
  magick rose:  -modulate 100,150   mod_sat_150.gif
  magick rose:  -modulate 100,200   mod_sat_200.gif

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

Saturasi '0' menghasilkan gambar grayscale, seperti yang juga ditunjukkan pada mengonversi warna ke grayscale di atas. Namun abu-abu di sini mencampur ketiga kanal warna secara setara sesuai definisi ruang warna HSL, sehingga tidak menghasilkan grayscale 'intensitas' yang sejati. Pada dasarnya nilai kecil menghasilkan warna yang lebih 'pastel', sedangkan nilai di atas '100' menghasilkan gambar berwarna yang lebih mirip kartun. Perhatikan bahwa karena brightness dan saturation adalah pengali persentase, pengalinya harus sangat besar untuk mengubah hampir semua nilai warna gambar mendekati maksimum. Artinya, faktor brightness mendekati satu juta diperlukan agar semua warna kecuali hitam murni menjadi putih.

Modulasi rona

Nilai terakhir, Hue , justru jauh lebih berguna. Nilai ini memutar warna gambar secara siklis. Untuk itu nilai Hue yang diberikan menghasilkan 'penjumlahan modulus', bukan perkalian. Namun perlu diingat, rona diputar memakai persentase, bukan sudut. Ini mungkin terasa aneh, tetapi "-modulate" memang selalu begitu. Rumus konversi antara sudut dan argumen modulate adalah...

_hue_angle_ = ( _modulate_arg - 100_ ) * 180/100
_modulate_arg_ = ( _hue_angle * 100/180_ ) + 100

Artinya '100' (untuk ketiga argumen) tidak mengubah apa pun. Sedangkan nilai '0' atau '200' praktis menegasikan warna dalam gambar (tetapi tidak intensitasnya). Sebagai contoh...

  magick rose:  -modulate 100,100,0      mod_hue_0.gif
  magick rose:  -modulate 100,100,33.3   mod_hue_33.gif
  magick rose:  -modulate 100,100,66.6   mod_hue_66.gif
  magick rose:  -modulate 100,100,100    mod_hue_100.gif
  magick rose:  -modulate 100,100,133.3  mod_hue_133.gif
  magick rose:  -modulate 100,100,166.6  mod_hue_166.gif
  magick rose:  -modulate 100,100,200    mod_hue_200.gif

[IM Output]
0
(red <-> cyan) | [IM Output]
33.3
(red -> blue) | [IM Output]
66.6 | [IM Output]
100%
no-op | [IM Output]
133.3 | [IM Output]
166.6
(red -> green) | [IM Output]
200
(sama dengan 0)

Seperti terlihat, nilai '33.3' menghasilkan rotasi negatif, atau berlawanan arah jarum jam, atas semua warna sebesar kira-kira 60 derajat, yang efektif memetakan merah ke biru, biru ke hijau, dan hijau ke merah. Nilai '0' atau '200' menghasilkan negasi warna penuh sebesar 180 derajat tanpa menegasikan kecerlangan gambar. Perhatikan bahwa rona bersifat siklis, jadi nilai '300' menghasilkan rotasi warna 360 derajat dan gambarnya tidak berubah sama sekali. Untuk contoh pemakaian 'modulasi rona' guna mengubah warna dalam gambar, lihat masking chroma key dan pin pada peta.
Jenis operasi semacam ini dan lainnya dapat pula diterapkan dengan teknik ruang warna tingkat lanjut, misalnya lewat operator matriks warna (di bawah), tetapi untuk 'modulasi' dasar sebuah gambar, operator ini sangat menyederhanakan urusan. Untuk menukar warna primer, operator matriks warna atau penukaran kanal (lihat operator separate/combine) mungkin merupakan teknik yang lebih akurat, meski jauh kurang serbaguna. Lihat juga tabel lookup warna Hald untuk metode menyimpan variasi perubahan warna, terutama perubahan rona, agar bisa dipakai lagi nanti.

Modulate DIY

Anda bisa mengerjakannya sendiri kalau memang mau. Pada dasarnya gambar di-magick ke ruang warna yang sesuai, nilainya diubah, lalu di-magick balik. Ingat bahwa dalam ruang warna HSL, kanal Green menyimpan nilai Saturation dan kanal Blue menyimpan nilai Luminance. Sebagai contoh, berikut padanan dari "-modulate 80,120" (sedikit menggelapkan, menaikkan saturasi warna) memakai ruang warna HSL bawaan...

  magick rose: -colorspace HSL \
          -channel B -evaluate multiply 0.80 \
          -channel G -evaluate multiply 1.20 \
          +channel -colorspace sRGB   modulate_channel.png

[IM Output] [IM Output]

Tentu saja kalau Hue (kanal merah) diubah dengan metode ini, nilai akhirnya harus dipastikan 'melingkar' (modulus), bukan sekadar dipotong pada nilai maksimum atau minimum (keduanya sama-sama rona 'merah'). Karena itu, untuk mengubah Hue mungkin lebih mudah langsung memakai operator modulate.

Modulate di ruang warna lain

Masalah terbesar "-modulate" muncul saat menangani gambar yang banyak mengandung warna 'nyaris putih'. Karena bekerja di ruang warna HSL, warna yang agak putih menjadi lebih 'tersaturasi' ketika kecerlangannya diturunkan. Hal ini terlihat pada daun putih gambar rose di atas, yang memperlihatkan banyak artefak warna pada penggelapan 50%. Masalah ini terutama muncul pada format gambar JPEG, yang cenderung menghasilkan warna agak putih (sebenarnya di JPEG semua warna umumnya sedikit melenceng) akibat algoritma kompresinya yang lossy. Sebagai contoh...

  magick wedding_party_sm.jpg  -modulate 85  modulate_off-white.png

[IM Output] [IM Output]

Masalahnya, dalam HSL semua warna yang agak putih terjejal ke area 'titik putih' yang sempit pada ruang warna yang dipakai (kerucut ganda). Ketika kecerlangan diturunkan, warna-warna agak putih itu memuai seiring memuainya kerucut warna, sehingga menghasilkan sekumpulan warna agak putih yang lebih berwarna (tersaturasi). Artinya, variasi warna yang kecil jadi dilebih-lebihkan. Solusinya adalah menjalankan "-modulate" di ruang warna HSB, bukan di ruang warna HSL. | _Huruf 'B' pada HSB berarti Brightness, tetapi ruang warna ini juga umum dikenal sebagai HSV, dengan 'V' yang berarti Value. Keduanya ruang warna yang sama, tetapi 'V' adalah istilah yang membingungkan karena value biasanya berarti 'angka yang tersimpan'.

Ada juga ruang warna HSI (dengan 'I' dari Intensity), tetapi jarang dipakai dan tidak diperlukan berkat hadirnya ruang warna siklis HCL (dengan 'L' yang berarti Luminance) (lihat di bawah).

_
Dalam ruang warna HSB, 'putih' bukanlah satu titik melainkan sebuah 'cakram' besar, sehingga warna-warna agak putih tidak saling 'berdekatan'. Karena itu, ketika kecerlangan diturunkan, warna agak putih menyusut secara merata sehingga variasi warna yang tipis justru berkurang, bukan membesar. Alhasil putihnya sekadar menjadi abu-abu, bukan makin berwarna. Untuk memodulasi gambar di ruang warna HSB, Anda bisa memakai teknik DIY (lihat di atas) pada ruang warna tersebut. Atau, dengan IM v6.5.3-7 ke atas, tetapkan kendali operasional 'modulate:colorspace' dengan salah satu ruang warna 'Hue'. |

  magick wedding_party_sm.jpg \
          -define modulate:colorspace=HSB -modulate 85 \
          modulate_HSB.png

[IM Output]
Ruang warna 'Hue' lainnya adalah HWB dan HCL (lihat bagian berikutnya). Tentu saja, kalau gambarnya Anda perkecil sampai seukuran ini, solusi yang lebih baik lagi adalah JANGAN menyimpan gambar ke JPEG, karena itulah penyebab nilai warna agak putih tadi. Lebih baik lagi, jangan simpan gambarnya sama sekali sampai pekerjaan selesai, supaya semua nilai warna tetap berada pada pengaturan quality terbaik di memori. Alasan ruang warna HSB tidak dipakai sebagai bawaan untuk modulate adalah karena mencerahkan gambar di ruang warna ini membuat warnanya makin tersaturasi dan makin tebal, alih-alih membuat gambarnya makin cemerlang dan makin putih. Berikut, sebagai contoh, pencerahan 150% pada gambar 'rose' di HSL bawaan dan di ruang warna HSB yang ditentukan, sebagai perbandingan.

  magick rose:         -modulate 150        mod_bright_HSL.gif
  magick rose: -define modulate:colorspace=HSB \
                         -modulate 150        mod_bright_HSB.gif

[IM Output]
HSL | [IM Output]
HSB

| _Sebelum IM v6.4.0-10 operator "-modulate" sebenarnya memakai ruang warna HSB, bukan HSL. Ini diubah karena ada laporan bug dari seorang pengguna mengenai situasi di atas.

Intinya, untuk sebagian gambar Anda serba salah kalau memakai HSL, dan untuk gambar lain serba salah kalau memakai ruang warna HSB. Semuanya bergantung pada apa yang sedang Anda coba lakukan!

_

Modulate di LCHab dan ruang warna lainnya

Modulasi rona (di ruang warna HSL atau HSB) sebenarnya dianggap agak kasar. Ruang warna tersebut tidak memperhitungkan intensitas warna yang lebih realistis. Akibatnya, memutar rona antara 'blue' dan 'yellow' juga menimbulkan pergeseran kecerlangan yang sangat besar. Lihat Wikipedia: Disadvantages to HSL Colorspace. Salah satu alternatifnya adalah melakukan rotasi yang mempertahankan Luminance seperti diuraikan di Grafica Obscura dalam makalah "Matrix Operations". Cara ini rumit karena perubahan warnanya dikerjakan sebagai bagian dari operasinya sendiri, berupa satu operasi matriks terhitung yang berbeda-beda tergantung seberapa besar rotasi yang diperlukan. Sejak IM v6.8.4-7 operator modulate juga dapat menangani ruang warna khusus 'LCHab ' dan 'LCHuv ', yaitu bentuk silindris (Hue-Chroma) dari ruang warna 'Luv ' dan 'Lab '. Lihat Wikipedia, Cylindrical LUV, or LCHuv colorspace dan The HCL Colorspace untuk keterangan lebih lanjut. Kanal yang setara pada ruang warna 'LCHab ' dan 'LCHuv ' berkebalikan dengan kanal pada ruang warna 'HCL ' dan 'HCB '. Artinya, padanan intensitas 'grayscale' berada di kanal pertama ('merah') dan Hue berada di kanal ketiga ('Biru') gambar.
Sebagai contoh, mari kita lakukan beberapa rotasi rona untuk rose merah memakai ruang warna 'LCHab '. Bandingkan hasilnya dengan rangkaian sebelumnya untuk ruang warna 'HSL ' di atas.
  for i in   0 25 50 75 100 125 150 175;  do
    magick rose: -define modulate:colorspace=LCHab \
                            -modulate 100,100,$i     mod_lch_$i.gif
  done

[IM Output]
0% & 200% | [IM Output]
25%
(red->blue) | [IM Output]
50% | [IM Output]
75% | [IM Output]
100%
no-op | [IM Output]
125% | [IM Output]
150% | [IM Output]
175%

Perhatikan bahwa rona tersebar dengan cara yang berbeda dibandingkan ruang warna Hue yang lebih tradisional. Namun yang lebih penting, intensitas gambar aslinya dipertahankan. Karena itu Anda tidak akan pernah berpindah dari satu warna primer/sekunder murni ke warna primer/sekunder murni lainnya, sebab tidak ada dua di antaranya yang intensitasnya sama. Meski begitu, peralihan warna sepanjang rona mengalir lebih mulus dengan 'puncak' yang tidak setajam pada warna primer dan sekunder. Berikut perbandingan rotasi rona sederhana dari merah ke biru untuk 'LCHab' melawan ruang warna 'HSL' biasa (memakai persentase rotasi yang sesuai).

[IM Output]
Asli | | [IM Output]
LCHab
25% | [IM Output]
HSL/HSB
33.3%

Perhatikan betapa birunya sama sekali tidak segelap tadi, melainkan corak yang lebih cocok dengan corak gambar aslinya. Untuk keterangan lebih lanjut mengenai rona ruang warna HCL, lihat contoh pada roda warna LCH. | _Sebelum IM v6.8.4-7 yang dipakai adalah ruang warna 'HCL ' (diperkenalkan pada IM v6.7.9-1). Ruang warna ini persis sama dengan 'LCHuv ', hanya urutan kanalnya terbalik (Hue disimpan di kanal Red gambar; begitulah ruang warna itu didefinisikan). Akibatnya berbagai kanal harus ditukar-tukar dulu agar operator modulate bekerja dengan benar.

Ruang warna 'LCHab ' dan 'LCHuv ' menyusun kanal dengan cara yang sama seperti 'HSL ', sehingga modulate dapat bekerja sebagaimana mestinya, langsung pada ruang warna itu tanpa perlu menyusun ulang kanal.

_
| _Perhatikan bahwa untuk warna yang sangat gelap, 'LCHuv ' dapat menghasilkan nilai warna yang tidak kontinu. Namun hal ini seharusnya tidak terjadi pada gambar nyata, hanya pada gambar yang dihasilkan langsung di ruang silindris.

_

Operator matriks warna

Operator "-color-matrix" mewarnai ulang gambar dengan teknik matriks. Artinya, operator ini diberi matriks nilai yang menyatakan cara mencampur berbagai nilai kanal warna sebuah gambar secara linear untuk menghasilkan nilai warna baru. Pemakaian yang lazim adalah memberi operator ini 9 nilai, yang membentuk tiga fungsi (baris) atau tiga pengali (kolom). Jadi tiga angka pertama adalah rumus warna untuk kanal 'red', tiga berikutnya untuk 'green', dan seterusnya. Sebagai contoh... |

  magick rose: -color-matrix ' 1 0 0
                                0 1 0
                                0 0 1 '   matrix_noop.png

[IM Output]
Setara dengan menerapkan persamaan...

red' = 1 * red + 0 * green + 0 * blue
green' = 0 * red + 1 * green + 0 * blue
blue' = 0 * red + 0 * green + 1 * blue

Dalam kasus ini gambar tidak berubah sama sekali. Matriksnya membentuk larik khusus yang dikenal sebagai 'matriks identitas'. Dengan mengacak susunan barisnya, berbagai kanal dapat ditukar-tukar. Sebagai contoh, di sini saya menukar nilai kanal merah dan biru. |

  magick rose: -color-matrix ' 0 0 1
                                0 1 0
                                1 0 0 '  matrix_red_blue_swap.png

[IM Output]
Atau cukup salin kanal merah ke dua kanal lainnya untuk mengekstrak atau memisahkan 'kanal merah' (lihat juga memisahkan gambar kanal)... |

  magick rose: -color-matrix ' 1 0 0
                                1 0 0
                                1 0 0 '  matrix_red_channel.png

[IM Output]
atau konversi gambar menjadi gambar grayscale memakai rasio grayscale 2/5/3 (lihat mengonversi warna ke grayscale)... |

  magick rose: -color-matrix ' .2 .5 .3
                                .2 .5 .3
                                .2 .5 .3 '  matrix_grayscale.png

[IM Output]

Matriks yang lebih besar sampai 6 baris dan 6 kolom juga bisa dipakai. Baris dan kolom itu bersesuaian dengan kanal: 'Red', 'Green', 'Blue', 'Black' (bila disetel), 'Alpha' (bila disetel), dan sebuah konstanta. Perhatikan kanal 'Black' dan 'Alpha': keduanya tetap harus diberikan bila matriksnya sebesar itu, meski nilainya sendiri mungkin tidak ada atau tidak dipakai. Kolom konstanta terakhir hanyalah penjumlahan sederhana (atau pengurangan bila negatif) pada rumusnya. Baris ke-6 (bila diberikan) diabaikan begitu saja dan tidak dipakai. Secara bawaan, definisi 'matriks' mengikuti struktur yang sama dengan kernel morfologi/konvolusi yang didefinisikan pengguna dan diperlakukan sebagai kernel 'persegi' bila geometry ukurannya tidak ditentukan. Offset kernel saat ini tidak dipakai. 'Larik nilai' yang diberikan lalu ditumpangkan pada 'matriks identitas 6x6' yang lebih besar (diagonal berisi angka 1) sebelum diterapkan ke gambar. Penanganan internal ini berarti nilai matriksnya bisa disederhanakan menjadi beberapa baris angka saja, bukan seluruhnya. Ini terutama berguna ketika 'konstanta' perlu disertakan dalam perhitungan warna, atau ketika hanya satu kanal yang ingin diubah. Misalnya, membalik (menegasikan) gambar. |

  magick rose: -color-matrix '6x3: -1  0  0 0 0 1
                                     0 -1  0 0 0 1
                                     0  0 -1 0 0 1'  matrix_negate.png

[IM Output]
Setel semua nilai kanal merah ke maksimum (memakai 'konstanta')... |

  magick rose: -color-matrix '6x1: 0,0,0,0,0,1'  matrix_red_max.png

[IM Output]
Karena ditumpangkan pada matriks identitas, nilai kanal lainnya tidak terpengaruh, walaupun tetap dihitung ulang secara internal. | Sebelum IM v6.6.1-0, "-color-matrix" bernama "-recolor.

Contoh matriks warna

Warna sepia , atau setidaknya bentuk linear dari operasi itu |

  magick rose: -color-matrix ' 0.393 0.769 0.189
                                0.349 0.686 0.168
                                0.272 0.534 0.131  ' matrix_sepia.png

[IM Output]
Warna mencolok , dalam teknik yang disebut Digital Velvia... |

  magick rose: -color-matrix '  1.2 -0.1 -0.1
                                -0.1  1.2 -0.1
                                -0.1 -0.1  1.2 ' matrix_vivid.png

[IM Output]
Matriks ini mencerahkan tiap kanal warna sekaligus mengurangi warna dari kanal lainnya, sehingga warna pada gambar RGB tampak lebih mencolok. Ini tidak persis sama dengan memakai modulate untuk menaikkan saturasi warna gambar sebesar 20%, tetapi mirip. Warna Polaroid... |

  magick rose: -color-matrix \
            '6x3:  1.438 -0.122 -0.016  0 0 -0.03
                  -0.062  1.378 -0.016  0 0  0.05
                  -0.062 -0.122 1.483   0 0 -0.02 ' matrix_polaroid.png

[IM Output]
Future: Hue rotations using a color matrix...
Such as described on the Grafica Obscura web page.
Untuk keterangan lebih lanjut tentang pemakaian matriks warna, lihat...

Namun perlu diingat, sebagian besar implementasi tersebut memakai bentuk matriks yang ditransposkan secara diagonal, yang persamaannya dibentuk oleh kolom, bukan baris. Atau melibatkan lebih sedikit kanal (jumlah baris/kolom yang lebih kecil).

Pewarnaan solarize

Menerapkan "-solarize" pada sebuah gambar pada dasarnya berarti 'membakar' warna paling terang menjadi hitam. Makin terang warnanya, makin gelap warna hasil solarize-nya. Hal ini terjadi dalam fotografi ketika film kimia terlalu banyak terpapar cahaya. |

  magick rose:  -solarize 90%     solarize.jpg

[IM Output]
Pada dasarnya apa pun yang berada di atas level grayscale yang diberikan akan dinegasikan. Jadi kalau argumennya '0%', yang Anda dapat pada dasarnya adalah operator negate versi murahan. Sebagai contoh, berikut "-solarize" tiruan memakai rumus matematis "-fx". |

  magick rose:  -fx  '.9>u ? u : 1-u'     solarize_fx.jpg

[IM Output]
Operator ini sangat cocok untuk mengekstrak warna abu-abu nada tengah dari gambar. Sebagai contoh, di sini saya memakai operasi sigmoidal contrast yang sangat kuat untuk menghasilkan semacam ambang batas (threshold) yang 'kabur' pada abu-abu 70%. Hasilnya lalu saya solarize untuk menghasilkan lonjakan kabur, bukan ambang batas kabur. Penyesuaian level terakhir kemudian menaikkan lonjakan itu ke kecerlangan maksimum sehingga muncul efek 'filamen'.

  magick -size 10x300 gradient: -rotate 90 \
                         -sigmoidal-contrast 50x70%   fuzzy_thres.png
  magick fuzzy_thres.png  -solarize 50%   fuzzy_spike.png
  magick fuzzy_spike.png  -level 0,50%    filament.png

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

CATATAN SAMPINGAN: Gambar-gambar di atas yang memperlihatkan grafik 'profil' dari gradien dihasilkan memakai "im_profile" di direktori Scripts IM Examples. Perhatikan bagaimana segala yang putih menjadi hitam, sementara abu-abu nada tengah di sekitar lonjakan pusat dipertahankan. Kekaburan dan letak lonjakannya ditentukan oleh operator "-sigmoidal-contrast". Saya menyebutnya 'filamen' karena hasilnya biasanya sangat mirip filamen listrik yang berpijar atau lecutan petir. Lihat fluks acak untuk contoh lain efek ini. Ekstraksi abu-abu nada tengah ini juga dimanfaatkan dengan baik dalam teknik menghasilkan garis tepi dari bentuk bitmap dan untuk perkalian dua gradien berbias. Pemakaian lain yang tidak biasa dari operasi ini adalah menentukan apakah sebuah gambar pada dasarnya sketsa atau gambar hitam putih murni (misalnya dari buku), bukan gambar grayscale bergradasi atau gambar berwarna. Lihat menentukan apakah sebuah gambar hitam putih murni atau grayscale


Mewarnai ulang gambar dengan tabel lookup

Meskipun gambar dapat diwarnai ulang lewat berbagai penyesuaian warna histogram seperti yang ditunjukkan di atas, ada teknik lain untuk mewarnai ulang gambar, yaitu sekadar 'mencari' nilai yang sudah diubah dari gradien warna yang disiapkan sebelumnya, atau "Color Look Up Table" (Color LUT, atau CLUT). Ada dua jenis Color LUT: LUT satu dimensi atau 'per kanal' yang sederhana, dan LUT warna 3d. LUT kanal memiliki tiga tabel lookup yang saling bebas: masing-masing satu untuk kanal R, G, dan B. Tiap entri dalam LUT kanal memetakan sebuah nilai kanal masukan ke sebuah nilai kanal keluaran. Kanal merah gambar keluaran hanya dipengaruhi oleh nilai merah asli gambar masukan. Sebaliknya, LUT warna 3D memungkinkan seluruh warna diganti sebagai fungsi dari keseluruhan warna masukan. Artinya, nilai keluaran kanal merah dapat bergantung pada salah satu atau semua nilai merah, hijau, dan biru masukan. Hal ini kadang disebut channel cross-talk.

Tabel lookup warna (kanal)

Kebutuhan yang lazim pada perkakas pemrosesan gambar adalah kemampuan mengganti seluruh rentang warna dari tabel warna yang sudah disiapkan. Dengan begitu gambar dengan satu set warna (umumnya grayscale) dapat dikonversi menjadi set warna yang sama sekali berbeda, cukup dengan mencari warna penggantinya dari sebuah gambar khusus. Tentu saja diperlukan gambar 'Look Up Table' sebagai tempat membaca warna pengganti itu. Untuk beberapa contoh pertama ini, saya memilih memakai gradien warna vertikal sebagai LUT supaya generator "gradient:" milik IM dapat dipakai untuk menyederhanakan pembuatan 'tabel lookup warna'. Nah, cukup sekian teorinya. Mari kita coba dengan mewarnai ulang gambar plasma grayscale sederhana, mengganti grayscale-nya dengan gradien warna dari biru tua ke putih pudar.

  magick -size 100x100 plasma:fractal -virtual-pixel edge -blur 0x5 \
          -shade 140x45  -normalize \
          -size 1x100 xc:black -size 9x100 gradient: \
          +append  gray_image.jpg
  magick -size 10x100  gradient:navy-snow       gradient_ice-sea.png
  magick gray_image.jpg  gradient_ice-sea.png -clut  gray_recolored.jpg

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

Operator "-clut" menerima dua gambar. Yang pertama adalah gambar yang nilai warnanya akan diganti, yang kedua adalah gambar gradien berupa satu baris atau satu kolom saja. Operator "-clut" ditambahkan pada IM v6.3.5-8.
Kalau IM Anda terlalu tua untuk mengenali operator "-clut", atau Anda ingin melakukan sesuatu yang di luar kebiasaan seperti tabel lookup warna dua dimensi, buatlah sendiri memakai operator DIY umum, FX. Sebagai contoh, berikut perintah yang lambat tetapi setara dengan perintah di atas.
  magick gray_image.jpg  gradient_ice-sea.png \
          -fx 'v.p{0,u*v.h}'  gray_recolored_fx.jpg

[IM Output]
Masalahnya, bahkan untuk proses sesederhana di atas pun operator "-fx" sangat lambat, dan harus dirancang khusus untuk LUT baris atau LUT kolom. Tetapi cara itu berhasil. LUT-nya tidak harus besar. Sebagai contoh, di sini kita pakai LUT yang sangat kecil dengan jumlah warna yang sangat terbatas.

  magick -size 1x6 gradient:navy-snow  gradient_levels.png
  magick gray_image.jpg  gradient_levels.png  -clut  gray_levels.jpg

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

Gambar gradiennya saya perbesar untuk tampilan halaman web di atas, sebab kalau tidak akan terlalu kecil untuk dilihat dengan jelas. Ukuran LUT itu sebenarnya hanya 6 piksel. Namun kalau Anda perhatikan hasilnya, operator lookup warna menghaluskan keenam warna itu menjadi gradien yang mulus. Yang terjadi adalah IM melakukan lookup terinterpolasi atas gambar LUT. Artinya, alih-alih sekadar mengambil warna yang ditemukan, IM menghitung rata-rata berbobot dari semua warna di dekatnya agar LUT terwakili lebih baik. Dalam kasus ini dipakai pengaturan bawaan 'Bilinear', yang sekadar menghubungkan tiap piksel berwarna dengan penggal garis linear. Pengaturan "-interpolate" yang berbeda menghasilkan tingkat penghalusan warna yang berbeda pula saat memakai LUT warna yang sangat kecil. Berikut, misalnya, saya tunjukkan berbagai jenis penghalusan terinterpolasi atas warna LUT.

  magick gray_image.jpg  gradient_levels.png \
          -interpolate Integer         -clut  gray_levels_integer.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate NearestNeighbor -clut  gray_levels_nearest.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate Average         -clut  gray_levels_average.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate Blend           -clut  gray_levels_blend.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate BiLinear        -clut  gray_levels_bilinear.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate Catrom          -clut  gray_levels_catrom.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate Spline          -clut  gray_levels_spline.jpg

[IM Output]
Integer | [IM Output]
Nearest | [IM Output]
Average | [IM Output]
Blend | [IM Output]
BiLinear | [IM Output]
Catrom | [IM Output]
Spline

Pengaturan 'Integer' dan 'Nearest' istimewa karena sama sekali tidak menghaluskan warna. Artinya, tidak ada 'warna campuran' baru yang ditambahkan; hanya nilai warna persis yang ada yang dipakai untuk mewarnai gambar grayscale. Namun perhatikan bagaimana pencarian warnanya berbeda di antara keduanya. Perbedaannya halus, tetapi bisa sangat penting. Sebaliknya, pengaturan 'Average' juga menghasilkan pita warna, tetapi hanya memakai campuran warna, sehingga jumlah warnanya satu lebih sedikit daripada ukuran gambar tabel lookup warna. Sementara itu 'Blend' mencampur 'Average' dan 'Nearest' untuk menambah piksel. Pita warna semacam ini (atau artefak Blocking) sebenarnya cukup lazim pada peta geografis dan grafik suhu, sebab bentuk peta jadi terwakili lebih tepat. Tepi batas yang tajam itu dikenal sebagai iso-line. Menambahkan sedikit blur satu piksel pada gambar akhir dapat memperbaiki tampilan tepi tersebut sehingga terlihat sedikit lebih mulus tanpa merusak pita warnanya. Pengaturan 'BiLinear' juga menghasilkan pita, tetapi hanya berupa perubahan gradien yang tajam ketika warnanya berubah mendadak (tidak terjadi pada contoh ini). Sedangkan 'Catrom' akan memuluskan perubahan warna. Terakhir, 'Spline' akan mengaburkan warna dan bisa jadi tidak menghasilkan satu pun warna yang ada dalam CLUT yang diberikan. Untuk menghindari masalah interpolasi, atau agar gradien warnanya terdefinisi lebih baik, sebaiknya pakai LUT yang jauh lebih panjang. Idealnya LUT itu mencakup seluruh rentang nilai intensitas yang mungkin. Untuk ImageMagick Q16 (dikompilasi dengan kualitas 16 bit) berarti LUT-nya harus setinggi 65536 piksel. Namun interpolasi piksel memungkinkan pemakaian gambar gradien LUT yang lebih masuk akal, yaitu 500 piksel, dan itu memadai untuk sebagian besar tugas pewarnaan ulang gambar. Perhatikan bahwa LUT gradien vertikal yang dipakai pada contoh di atas tampak terbalik di mata kita, sebab indeks hitam atau '0' berada di bagian atas gambar. Biasanya kita manusia lebih suka melihat gradien dengan level hitam di bagian bawah (berkat masa lalu evolusioner kita). Kalau Anda lebih suka menyimpan gambar gradiennya dengan 'arah yang benar', gambar itu bisa di-"-flip" saat dibaca masuk. Sebagai contoh, mari kita coba LUT yang lebih rumit, dengan membalik gradien vertikalnya sebelum dipakai pada gambar.

  magick -size 1x33 gradient:wheat-brown gradient:Brown-LawnGreen \
          gradient:DodgerBlue-Navy   -append  gradient_planet.png
  magick gray_image.jpg \
          \( gradient_planet.png -flip \) -clut   gray_planet.jpg

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

Seperti terlihat, untuk gradien vertikal, membaliknya sebelum dipakai memang sangat masuk akal. Untuk contoh lain pembuatan gradien, lihat gradien warna. Anda mungkin juga tertarik pada cara menyusun gambar grayscale sebagai tile memakai satu gambar untuk tiap tingkat abu-abu, yang bisa menghasilkan gambar mirip 'peta' yang lebih bagus lagi. Lihat dithering dengan pola.

Konversi fungsi menjadi LUT warna

Gambar "Lookup Table" (atau LUT) yang sudah disiapkan ini juga dapat dipakai untuk mempercepat secara besar-besaran operasi "-fx" yang sangat rumit sehingga lambat: alih-alih IM menafsirkan string fungsinya 3 atau 4 kali per piksel, IM cukup melakukan lookup warna pengganti yang jauh lebih cepat. Prosedurnya cukup lugas: terapkan fungsinya pada gradien linear yang belum diubah, atau ganti 'u' dalam fungsinya dengan nilai '(i/w)' atau '(j/h)' untuk menghitung nilai pengganti berdasarkan posisinya. Misalnya, pada contoh tingkat lanjut efek 'Aqua', saya memakai fungsi "-fx" yang rumit untuk menyesuaikan keluaran grayscale dari operator shade". Selain itu, karena penyesuaian grayscale tersebut juga ditumpangkan pada bentuk berwarna 'DodgerBlue', tidak ada alasan hasil kedua operator itu tidak bisa digabung menjadi satu tabel lookup gradien. Artinya, kita menghasilkan LUT dari rumus "-fx" sekaligus overlay warnanya. Untuk contoh-contoh ini saya juga memutuskan menghasilkan satu baris piksel, bukan satu kolom seperti sebelumnya.

  magick -size 1x512 gradient: -rotate 90 -alpha off \
          -fx '3.5u^3 - 5.05u^2 + 2.05u + 0.3' \
          -size 512x1 xc:DodgerBlue -compose Overlay -composite \
          aqua_gradient.png

[IM Output]

| Polinomial "-fx" di atas kini dapat dihasilkan secara lebih langsung dan lebih cepat memakai fungsi polinomial. Sebagai contoh

_"[-function](https://imagemagick.org/command-line-options/#function) Polynomial 3.5,-5.05,2.05,0.3"_

LUT yang sudah dibuat lebih dulu ini kini dapat diterapkan pada bentuk hasil shade tadi jauh lebih cepat, dengan biaya minimal berupa penyimpanan satu gambar yang sangat kecil.

  magick -font Candice -pointsize 72 -background None label:A \
          -trim +repage  aqua_mask.png
  magick aqua_mask.png -alpha Extract -blur 0x6 -shade 120x21 \
          -alpha On -normalize  aqua_shade.png
  magick aqua_shade.png  aqua_gradient.png -clut aqua_font.png

[IM Output] [IM Output] [IM Output]
PERINGATAN: contoh di atas belum lengkap (tepinya belum digelapkan)

Seperti terlihat, hasilnya sangat efektif, dan begitu gradien LUT yang sesuai dihasilkan, gradien yang sama dapat dipakai ulang berkali-kali sesuka Anda.

CLUT dan penanganan transparansi

Operator "-clut" dikendalikan oleh pengaturan "-channel", tetapi kenyataannya operator ini hanya mengganti nilai tiap kanal di dalam gambar. Artinya, biasanya tiap kanal gambar sumber dipakai untuk 'mencari' nilai pengganti bagi kanal itu saja dari tabel lookup warna. Termasuk kanal alpha, yang biasanya sangat merepotkan dan sulit diterapkan. Umumnya operator "-clut" dipakai untuk mewarnai gambar sumber grayscale (lihat contoh sebelumnya), ATAU untuk melakukan penyesuaian histogram pada gambar berwarna memakai CLUT (Color Lookup Table) grayscale. Dengan kata lain, biasanya salah satu gambarnya grayscale. Sejak IM v6.4.9-8, kalau pengaturan "-channel" menyatakan bahwa kanal alpha sebuah gambar hendak diganti atau disesuaikan (ada 'A' di dalamnya), dan salah satu dari gambar 'sumber' atau gambar 'CLUT' tidak punya kanal alpha yang terdefinisi, maka IM akan menganggap gambar itu grayscale dan bertindak sesuai anggapan tersebut. Sebagai contoh, di sini saya membuat segitiga sederhana yang di-blur sebagai gambar grayscale. Segitiga itu lalu bisa saya warnai memakai tabel lookup warna yang menyertakan transparansi. Kali ini gambar CLUT-nya tidak saya balik, jadi pengganti untuk hitam berada di atas dan pengganti untuk putih di bawah.

  magick -size 100x100 xc:  -draw 'polygon 50,10 10,80 90,80' \
          -blur 0x10  blurred_shape.jpg
  magick -size 1x5 xc:none \
          -draw 'fill red    point 0,2' \
          -draw 'fill yellow rectangle 0,0 0,1'   gradient_border.png
  magick blurred_shape.jpg -alpha off    gradient_border.png \
          -channel RGBA  -interpolate integer -clut  clut_shape.png

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

Ingat, cara di atas hanya bekerja sesuai harapan kalau gambar grayscale-nya tidak punya kanal alpha (dimatikan dengan "-alpha off" atau "-alpha off"), dan Anda menyatakan bahwa nilai kanal alpha juga ingin dicari (memakai "-channel RGBA"). Dan berikut kasus khusus lainnya: kita punya gambar bertransparansi (dan berkanal alpha) yang perlu disesuaikan memakai gradien penyesuaian histogram grayscale (tanpa kanal alpha aktif).

  magick -size 100x100 xc:none -draw 'polygon 50,10 10,80 90,80' \
          tile_disks.jpg -compose In -composite shape_triangle.gif
  magick shape_triangle.gif -channel A -blur 0x10 +channel shape_blurred.png
  magick -size 1x50 gradient: xc:black -append -flip \
          -sigmoidal-contrast 6x0%  feather_histogram.jpg
  magick shape_blurred.png \( feather_histogram.jpg -alpha off \) \
          -channel A    -clut    shape_feathered.png

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

Contoh di atas adalah persoalan feathering gambar yang khas. 'Halo' hitam pada gambar antaranya disebabkan oleh operasi "-blur" yang membuat area yang sepenuhnya transparan di sekeliling segitiga menjadi terlihat. Karena area yang sepenuhnya transparan warnanya tidak terdefinisi, IM memakai hitam sebagai bawaan. Gambar CLUT-nya sendiri dirancang untuk memastikan bahwa setiap piksel yang transparansinya kurang dari 50% dijadikan sepenuhnya transparan, sehingga bagian gambar yang tadinya sepenuhnya transparan kembali transparan. Untuk contoh ini 'blur' awalnya saya lebih-lebihkan, lalu penyesuaian kanal alpha-nya saya koreksi berlebihan pula. Hasilnya, sudut-sudut segitiganya jadi sangat membulat. Untuk feathering gambar yang normal, nilai "-blur" dan penyesuaian alpha "-sigmoidal-contrast" biasanya jauh lebih kecil. Fred Weinhaus telah mengimplementasikan teknik feathering dengan blur dalam skripnya, "feather", supaya lebih mudah dipakai.

Tabel lookup warna 3D Hald

Sejak IM v6.5.3-4 tabel lookup warna 3D penuh juga dapat dipakai untuk langsung mengganti semua warna dari banyak gambar sekaligus. Artinya, alih-alih hanya mencari nilai tiap kanal warna sebagai entitas terpisah (seperti pada CLUT di atas), keseluruhan warnanya yang dipakai untuk mencari warna baru. Namun tabel warna 3D biasanya memerlukan format file khusus untuk menyimpan larik nilai warna 3D itu dengan benar. Dengan susunan nilai warna yang khusus, tabel 3D tersebut dapat disimpan ke dalam gambar 2D yang dikenal sebagai Hald Color LUT. Ini gambar biasa saja, sehingga format file gambar apa pun yang baik dapat dipakai untuk menyimpan Hald 3D Color LUT. Untuk detail dan contoh gambar HALD, lihat situs resminya, Hald Images, Clut Technology. Untuk menghasilkan tabel warna 3D Hald, gunakan generator gambar 'HALD:{_level_}'. Sebagai contoh, berikut satu tabel kecil yang saya perbesar supaya pikselnya terlihat satu per satu...

  magick  hald:3    hald_3.png

[IM Output]

Tabel itu memuat kubus warna dengan sisi sepanjang '{_level_}2' warna, atau 9 warna. Kubus warna penuhnya berisi '9 × 9 × 9' warna, total 729 warna, yang disimpan dalam gambar sebesar akar kuadrat angka itu, yaitu 27x27 piksel. Warnanya disimpan sedemikian rupa sehingga 9 warna pertama (di sudut kiri atas) membentuk gradien dari 'hitam murni' ke 'merah murni'. Setiap warna ke-9 lalu membentuk gradien 'hijau', dan setiap warna ke-81 membentuk gradien 'biru'. Warna terakhir di sudut kanan bawah adalah 'putih murni'. Kalau memudahkan membayangkannya, anggap saja gambar itu sebagai larik piksel 1D yang lebih sederhana lagi, yang dirujuk sebagai kubus warna 3D. Nah, ini baru gambar HALD CLUT yang kecil. Yang lebih lazim dipakai adalah Hald level 8 ke atas (bawaannya), yang memuat kubus warna dengan 64 warna per sisi, atau 64^3 = 262144 warna, dan menghasilkan gambar berukuran 512x512 piksel yang tersimpan sebagai gambar PNG sekitar 10 Kbyte. Ini belum mencakup seluruh warna 8 bit, tetapi sudah cukup baik. Untuk gambar HALD yang memuat setiap warna 8 bit, diperlukan versi level 16 yang menghasilkan gambar 4096x4096. Hal itu sekaligus membuktikan bahwa bahkan gambar kamera digital biasa pun umumnya tidak dapat memuat setiap warna 8 bit yang mungkin. Meski begitu, gambar Hald yang lebih kecil tetap bisa dipakai, karena IM akan menginterpolasi 8 warna tetangga dari Hald itu untuk menentukan warna akhir penggantinya. Hanya saja hasilnya tidak sebaik versi yang lebih besar. Gambar Hald di atas level 8 tidak dianjurkan, karena akan memerlukan gambar yang sangat besar dengan kedalaman sedikitnya 16 bit per nilai. Nah, gambar hald yang dihasilkan tadi adalah gambar CLUT 'identitas' atau 'no-op'. Artinya, isinya nilai warna normal yang membentuk kubus warna 3D, sehingga tidak mengubah gambar sama sekali. Sebagai contoh, mari kita terapkan gambar Hald 'no-op' memakai operator "-hald-clut"...

  magick rose:  hald_3.png -hald-clut   rose_hald_noop.png

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

Gambar ini persis sama dengan aslinya, sebab gambar Hald-nya tidak memuat perubahan apa pun. Namun dengan mengubah gambar Hald itu, entah dengan tangan atau lewat suatu modifikasi warna, warna asli dapat digantikan dengan warna yang sudah diubah. Sebagai contoh, di sini saya membuat skema warna sepia yang dipadukan...

  magick hald_3.png \( +clone -sepia-tone 60% \) -evaluate-sequence mean hald_sepia.png
  magick rose.png   hald_sepia.png -hald-clut   rose_hald_sepia.png

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

Tentu saja, kalau suatu modifikasi warna bisa diterapkan pada gambar Hald, modifikasi itu juga bisa diterapkan langsung pada gambar aslinya. Bedanya, kini modifikasi warna Anda dapat disimpan untuk dipakai ulang, dan bisa diterapkan sebanyak yang Anda mau. Artinya, curahkan saja usaha Anda pada hald-nya, lalu simpan untuk kemudian hari. Gambar Hald CLUT juga bisa Anda kirimkan atau unduh untuk orang lain, bahkan untuk aplikasi lain. Warna di dalam sebuah Hald bahkan dapat disunting langsung dengan editor gambar seperti "Gimp" atau "Photoshop", atau kalau disimpan sebagai gambar teks piksel terenumerasi, dengan editor teks biasa! Semua itu terutama berlaku untuk modifikasi warna yang sangat rumit. Kirimkanlah kepada saya gambar Hald CLUT apa pun yang menurut Anda menarik atau berguna, dan akan saya jadikan contoh di sini. Anda pun akan disebutkan namanya di sini!

Keterbatasan Hald CLUT

Tidak seperti pencarian gradien 1 dimensi yang lebih sederhana memakai Operator CLUT, Hald CLUT dapat dipakai untuk memutar warna. Misalnya menukar warna merah dan biru. Metode CLUT ini jauh lebih serbaguna. Namun ia tidak sebaik itu untuk hal-hal yang lebih sederhana seperti mewarnai gambar grayscale, atau melakukan penyesuaian histogram terhadap nilai warna. Warna juga dapat diganti dengan nilai transparan atau semitransparan, dengan menyimpan warna pengganti semacam itu di dalam gambar Hald CLUT. Namun pencarian pengganti ini hanya berdasarkan warna. Cara ini tidak dapat dipakai untuk mengganti warna transparan dengan cara-cara tertentu. Bagaimanapun juga ini bukan hiperkubus pencarian warna 4D!

Penggantian warna memakai Hald CLUT

Nah, karena nilai warna secara utuh dipakai untuk mencari warna penggantinya, cara ini juga bisa dipakai sebagai metode untuk langsung mengganti semua warna dalam sebuah gambar dengan warna lain. Namun karena IM saat ini melakukan pencarian Hald dengan interpolasi linear, warna pengganti perlu diatur pada kedelapan sel warna tetangga di dalam kubus warna 3D.

Sedang dikerjakan

Bagian ini masih perlu dikerjakan, dan mungkin memerlukan pengaturan (setting) pencarian Hald 'nearest-neighbour' (misalnya memakai -interpolate), alih-alih pencarian dengan interpolasi linear 3D, agar bekerja lebih baik untuk penggantian warna tertentu. Selain itu, cara mudah untuk menemukan warna tertentu di dalam sebuah Hald (nearest-neighbour, atau ke-8 tetangganya) akan membuat hal ini jauh lebih mudah. Jika Anda punya gagasan, saran, atau lebih baik lagi contoh-contoh kecil, silakan berkontribusi dengan mengirimkannya lewat email kepada saya, atau ke IM Discussion Forums Gagasan lain adalah, jika ada dua gambar, yang asli dan yang sudah dikonversi, maka semestinya gambar Hald CLUT dapat diisi dari perbandingan kedua gambar itu. Setelah warna-warna yang langsung terlihat terisi, sisa kubus warna semestinya setidaknya bisa diturunkan secara kasar dengan pencocokan kurva terhadap warna-warna yang ada. Artinya, buat sebuah permukaan warna 4-D dari perubahan warna yang ditemukan. Setelah selesai, Hald CLUT itu dapat diterapkan ke gambar mana pun untuk melakukan transformasi warna yang sama (ke arah mana pun) pada gambar lain.

Penggantian penuh color map

FUTURE: Replace all the colors in one color map with colors in another color map. Suggestions as to how to best do this is welcome, or programmers to implement some image color map function. One method may be to use ideas presented in Dithering with Symbols. The best known solution (but hardly ideal) is currently provided by Fred Weinhaus in is "mapcolors" script. This script essentially maps each color one at a time, masking the pixels involved from one image into a new initially blank image. Another idea is to somehow map a 3 dimentional color replacement into a HALD Color Table. This will not just map the specified colors, but also re-map the colors between the specified colors in a logical way. HALD generator wanted.


Sedang dikerjakan

Opsi warna lain yang belum ditelaah secara rinci...

  -contrast
  -brightness-contrast

Siklus warna?
    -cycle     menggeser colormap (untuk animasi fraktal???)

Titik warna kromatisitas???
   –white-point x,y
   –red-primary x,y
   –green-primary x,y
   –blue-primary x,y


Ambang batas  (setelah negasi)
  Khususnya  -white-threshold dan -black-threshold