
Jika Anda tidak tahu suhu warna apa,
mulailah dari sini .
Saat bekerja pada alat Suhu Warna untuk
PhotoDemon , saya menghabiskan sepanjang malam mencoba menentukan algoritma yang sederhana dan jelas untuk mengkonversi antara nilai suhu (dalam Kelvin) dan RGB. Saya pikir algoritma seperti itu akan mudah ditemukan, karena banyak editor foto memiliki alat untuk mengoreksi suhu warna, dan di setiap kamera modern, termasuk smartphone, ada penyesuaian keseimbangan putih berdasarkan kondisi pencahayaan.
Contoh layar kamera dengan pengaturan white balance. SumberTernyata menemukan formula yang dapat diandalkan untuk mengubah suhu menjadi RGB hampir mustahil. Tentu saja, ada beberapa algoritma, tetapi kebanyakan dari mereka bekerja dengan mengubah suhu menjadi ruang warna XYZ, yang kemudian Anda dapat menambahkan transformasi RGB. Algoritma seperti itu tampaknya didasarkan pada metode Robertson, salah satu implementasinya ada di
sini , dan yang lain ada di
sini .
Sayangnya, pendekatan ini tidak memberikan rumus matematika murni - itu hanya interpolasi sesuai dengan tabel konversi. Ini mungkin masuk akal dalam keadaan tertentu, tetapi jika Anda memperhitungkan konversi tambahan XYZ β RGB, ternyata terlalu lambat untuk penyesuaian sederhana suhu warna secara real time.
Jadi saya menulis algoritma saya sendiri, dan itu bekerja dengan sangat baik. Ini adalah bagaimana saya mendapatkannya.
Peringatan tentang algoritma ini
Peringatan 1 : algoritme saya menyediakan perkiraan berkualitas tinggi, tetapi tidak cukup akurat untuk penggunaan ilmiah yang serius. Ini dimaksudkan terutama untuk memanipulasi foto - jadi jangan mencoba menggunakannya untuk astronomi atau dalam pengobatan.
Peringatan 2 : karena kesederhanaannya yang relatif, algoritma ini cukup cepat untuk bekerja secara real time pada gambar dengan ukuran yang wajar (saya mengujinya pada gambar 12-megapiksel), tetapi untuk hasil terbaik, gunakan optimisasi matematis khusus untuk bahasa pemrograman Anda. Saya menunjukkan algoritma tanpa optimasi matematis agar tidak menyulitkannya.
Peringatan 3 : algoritme hanya untuk digunakan dalam kisaran dari 1000 K hingga 40.000 K, yang merupakan kisaran yang baik untuk fotografi. (Bahkan, itu jauh lebih besar daripada yang mungkin diperlukan dalam kebanyakan situasi). Meskipun bekerja untuk suhu di luar kisaran ini, kualitasnya akan menurun.
Terima kasih khusus kepada Mitchell Charity
Pertama, saya harus membayar banyak hutang dan berterima kasih kepada Mitchell Charity untuk data awal yang saya gunakan untuk membuat algoritma ini:
file black body yang belum diproses . Charity menyediakan dua set data, dan algoritma saya menggunakan
fungsi pencocokan warna 10 derajat CIE 1964 . Pembahasan fungsi 2 derajat CIE 1931 dengan koreksi Judd Wos dibandingkan dengan set 10 derajat berada di luar cakupan artikel ini, tetapi jika Anda tertarik, Anda dapat memulai analisis komprehensif dari
halaman ini .
Algoritma: contoh keluaran
Berikut ini adalah output dari algoritma dalam kisaran dari 1000 K hingga 40.000 K:
Output dari algoritma saya adalah dari 1000 K hingga 40.000 K. Titik putih adalah pada 6500-6600 K, yang ideal untuk memproses foto pada monitor LCD modernBerikut adalah cuplikan algoritma yang lebih terperinci dalam kisaran yang menarik untuk fotografi dari 1500 K hingga 15000 K:
Algoritma yang sama, tetapi dari 1500 K hingga 15000 KSeperti yang Anda lihat, penandaan minimal, yang merupakan peningkatan besar atas tabel yang cocok di atas. Algoritma ini juga melakukan pekerjaan yang baik untuk mempertahankan rona kuning muda di dekat titik putih, yang penting untuk mensimulasikan cahaya siang di foto pasca pemrosesan.
Bagaimana saya sampai pada algoritma ini
Langkah pertama untuk memperoleh formula yang andal adalah memplot nilai
asli tubuh hitam dari Charity . Anda dapat mengunduh
seluruh spreadsheet dalam format LibreOffice / OpenOffice .ods (430 KB) .
Berikut adalah data setelah merencanakan:
Data suhu asli (K) dalam RGB (sRGB), grafik LibreOffice Calc. Sekali lagi, konversi didasarkan pada fungsi CMF 10 derajat CIE 1964. Titik putih, seperti yang diperlukan, terletak di antara 6500 K dan 6600 K (puncak di sisi kiri grafik). SumberSangat mudah untuk memperhatikan bahwa ada beberapa bagian yang menyederhanakan algoritma kami. Khususnya:
- Nilai merah di bawah 6600 K selalu 255
- Nilai biru di bawah 2000 K selalu 0
- Nilai biru di atas 6500 K selalu 255
Penting juga untuk dicatat bahwa untuk menyesuaikan kurva dengan data, hijau paling baik dilihat sebagai dua kurva terpisah - satu untuk suhu di bawah 6600 K, dan yang lainnya untuk suhu di atas titik ini.
Mulai saat ini, saya membagi data (tanpa segmen "selalu 0" dan "selalu 255") menjadi komponen warna yang terpisah. Dalam dunia yang ideal, kurva dapat disesuaikan dengan setiap set poin, tetapi, sayangnya, pada kenyataannya itu tidak begitu sederhana. Karena ada perbedaan yang kuat antara nilai X dan Y pada grafik - semua nilai x lebih besar dari 1000 dan ditampilkan dalam segmen 100 titik, sedangkan nilai y adalah antara 255 dan 0 - Saya harus mengubah data x untuk mendapatkan yang terbaik. Untuk tujuan optimasi, saya pertama membagi nilai x (suhu) dengan 100 untuk setiap warna, dan kemudian mengurangi berapa banyak yang saya butuhkan jika itu banyak membantu dalam pemasangan pada grafik. Berikut adalah diagram yang dihasilkan untuk setiap kurva, serta kurva yang paling cocok dan nilai yang sesuai dari koefisien determinasi (R-squared):




Saya minta maaf untuk kerning font yang buruk dan mengisyaratkan pada grafik. LibreOffice memiliki banyak keuntungan, tetapi ketidakmampuan untuk memuluskan font pada grafik benar-benar memalukan. Saya juga tidak suka mengekstrak diagram dari tangkapan layar karena mereka tidak memiliki opsi ekspor, tetapi lebih baik meninggalkannya untuk nanti.
Seperti yang Anda lihat, semua kurva cukup selaras, dengan nilai koefisien determinasi di atas 0,987. Saya bisa menghabiskan lebih banyak waktu menyesuaikan kurva, tetapi itu cukup untuk memproses foto. Tidak seorang pun penghuni akan mengatakan bahwa kurva tidak persis sesuai dengan pengamatan awal tubuh hitam yang ideal, bukan?
Algoritma
Berikut adalah algoritme dengan segala kemuliaan.
Pertama, kode semu:
- 1000 40000. ( , 40000 K). , . Set Temperature = Temperature \ 100 : If Temperature <= 66 Then Red = 255 Else Red = Temperature - 60 Red = 329.698727446 * (Red ^ -0.1332047592) If Red < 0 Then Red = 0 If Red > 255 Then Red = 255 End If : If Temperature <= 66 Then Green = Temperature Green = 99.4708025861 * Ln(Green) - 161.1195681661 If Green < 0 Then Green = 0 If Green > 255 Then Green = 255 Else Green = Temperature - 60 Green = 288.1221695283 * (Green ^ -0.0755148492) If Green < 0 Then Green = 0 If Green > 255 Then Green = 255 End If : If Temperature >= 66 Then Blue = 255 Else If Temperature <= 19 Then Blue = 0 Else Blue = Temperature - 10 Blue = 138.5177312231 * Ln(Blue) - 305.0447927307 If Blue < 0 Then Blue = 0 If Blue > 255 Then Blue = 255 End If End If
Perhatikan bahwa dalam pseudo-code di atas,
Ln () berarti logaritma natural . Perhatikan juga bahwa Anda dapat menghilangkan tanda centang jika warnanya kurang dari 0, jika suhunya selalu dalam kisaran yang disarankan. (Namun, Anda masih perlu meninggalkan cek βjika warnanya lebih besar dari 255β).
Mengenai kode aktual, berikut adalah fungsi Visual Basic yang saya gunakan di
PhotoDemon . Itu belum dioptimalkan (misalnya, logaritma akan jauh lebih cepat dengan tabel korespondensi), tetapi setidaknya kode ini ringkas dan dapat dibaca:
Fungsi ini digunakan untuk menghasilkan output sampel di awal artikel ini, jadi saya bisa menjamin itu berfungsi.
Gambar Contoh
Berikut adalah contoh yang bagus tentang apa yang dapat dilakukan penyesuaian suhu warna. Gambar di bawah ini, poster iklan untuk HBO's True Blood, menunjukkan secara spektakuler potensi untuk menyesuaikan suhu warna. Di sebelah kiri adalah bingkai asli; di sebelah kanan - sesuaikan suhu warna menggunakan kode di atas. Dengan satu klik, pemandangan malam dapat dibuat lagi untuk siang hari.
Penyesuaian suhu warna dalam aksiAlat suhu warna sebenarnya dalam program PhotoDemon saya adalah sebagai berikut:
Alat Suhu Warna PhotoDemonUnduh programnya dan tontonlah dalam aksi.
Perbarui Oktober 2014
Renault Bedar membuat
demo online yang hebat untuk algoritma ini. Terima kasih Renault!
Perbarui April 2015
Terima kasih kepada semua orang yang menyarankan peningkatan pada algoritma asli. Saya tahu bahwa artikel tersebut memiliki banyak komentar, tetapi mereka layak dibaca jika Anda berencana untuk mengimplementasikan versi Anda sendiri.
Saya ingin menyoroti dua peningkatan spesifik. Pertama, Neil B dengan ramah menyediakan versi terbaik untuk fungsi pemasangan kurva asli, yang sedikit mengubah koefisien suhu. Perubahan dijelaskan secara rinci dalam
artikelnya yang sangat bagus .
Kemudian Francis Loch menambahkan beberapa komentar dan contoh gambar, yang sangat berguna jika Anda ingin menerapkan transformasi ini pada foto. Modifikasinya menghasilkan gambar yang jauh lebih rinci,
seperti terlihat pada contoh .