Jika Anda dapat memproses file RAW, Anda akan memiliki array pixel bayer yang terdiri dari baris RGRGRG dan GBGBGB (atau mungkin baris RGBGRGBG.) Anda bisa mengabaikan semua piksel R dan B, menjumlahkan piksel G, mengambil akar kuadrat ( karena ada dua kali lebih banyak piksel hijau daripada merah atau biru), dan bagi dengan setengah jumlah piksel G. Itu akan memberi Anda rata-rata tertimbang yang tepat untuk "hijau" di foto Anda. Anda kemudian dapat mengambil rata-rata merah dan biru, dan menghitung persentase hijau Anda dari ketiga rata-rata.
Agar lebih akurat, Anda mungkin ingin mempertimbangkan bobot yang tepat untuk piksel sensor merah, hijau, dan biru, karena sensor CMOS memiliki sensitivitas yang berbeda untuk setiap panjang gelombang cahaya. Bobot akan tergantung pada sensor, umumnya. Itu akan menjadi pendekatan sederhana.
Untuk memperhitungkan warna yang disebabkan oleh waktu, berbagai jenis pencahayaan buatan, dll. Maka mungkin lebih tepat untuk memproses ulang setiap foto dalam alat seperti Lightroom untuk mengoreksi white balance terlebih dahulu, kemudian lakukan perhitungan Anda pada gambar piksel RGB standar. Tidak seperti memproses data sensor RAW, Anda ingin mempertimbangkan perhitungan Anda berdasarkan pixel "green purity", daripada rata-rata komponen hijau secara keseluruhan. Semakin murni piksel hijau, semakin tinggi bobotnya vs piksel yang lebih merah atau biru. Menormalkan white balance sebelum pemrosesan harus menghilangkan kebutuhan untuk mempersulit perhitungan yang sebaliknya cukup sederhana dengan garis singgung yang dirancang untuk memperhitungkan beberapa faktor seperti tutupan awan, waktu siang hari, musim, dll.
Anda mungkin masih ingin memperhitungkan area besar piksel non-insiden, seperti langit. Saya benar-benar tidak bisa banyak membantu Anda di bidang itu tanpa mengetahui lebih banyak tentang apa yang sebenarnya ingin Anda capai. Hijau dari "foto" secara keseluruhan mungkin paling baik dilayani dengan menghitung rasio hijau ke merah dan biru, yang akan mencakup piksel "langit".
Adapun prosedur Anda, itu harus pergi tanpa mengatakan bahwa jika Anda mengambil gambar dengan pengaturan kamera yang sama, di bawah penerangan yang sama (intensitas dan suhu warna yang sama), meteran terhadap garis dasar umum seperti kartu abu-abu 18%, jelas akan pergi jauh menuju normalisasi hasil Anda. Dengan digital, perbedaan apa pun dapat diperbaiki dengan perangkat lunak pemrosesan RAW dan alat pemilih white balance dasar, jadi pastikan untuk memotret dalam RAW.
Untuk memberikan wawasan lebih dalam menghitung "kehijauan" foto Anda. Jelas ada cara sederhana, seperti menghitung berat piksel bayer hijau vs biru dan merah, atau menghitung kemurnian hijau dalam kaitannya dengan kemurnian merah / biru piksel RGB. Anda mungkin lebih beruntung jika Anda mengonversi ke ruang warna yang lebih tepat, seperti HSV ( Hue / Saturation / Value , kadang-kadang disebut HSB, mengganti Value dengan Brightness), dan menghitung jumlah hijau Anda menggunakan kurva di ruang HUE. (CATATAN: HSL adalah jenis ruang warna yang berbeda, dan mungkin tidak ideal untuk menghitung berapa "hijau" dalam foto, jadi saya akan menggunakan HSV. Anda dapat mempelajari lebih lanjut tentang ruang warna ini di sini.) Hijau murni (terlepas dari saturasi atau nilai) jatuh pada sudut rona 120 °, dan jatuh dari sana saat Anda bergerak ke arah merah (pada 0 °) atau ke biru (pada 240 °). Antara 240 ° dan 360 °, akan ada nol jumlah hijau dalam suatu piksel, terlepas dari saturasi atau nilainya.
Gambar 1. Hue Plot - Green Purity dalam Hue Degrees
Anda dapat menyesuaikan kurva bobot aktual untuk memenuhi kebutuhan spesifik Anda, namun kurva sederhana bisa serupa dengan yang berikut:
range = 240
period = range * 2 = 240 * 2 = 480
scale = 360/period = 0.75
pureGreen = sin(scale * 120)
Nilai untuk pureGreen
harus 1,0 . Rumus untuk komputasi greenness
kemudian dapat dilakukan sebagai berikut:
sin(scale * hue) } 0 > hue > 240
greenness =
0 } 240 <= hue <= 360 || hue == 0
Ini hue
adalah tingkat warna dari nilai warna HSV Anda. Ini radius
adalah setengah dari period
di mana hijau hadir sampai taraf tertentu. The scale
menyesuaikan kurva dosa periode kami, sehingga sin(scale * hue)
puncak (return 1,0) persis di mana Anda akan memiliki hijau murni (mengabaikan bahwa intensitas hijau). Karena jumlah greenness
hanya valid di paruh pertama periode kami, perhitungan kehijauan hanya berlaku ketika rona lebih besar dari 0 ° dan kurang dari 240 °, dan nol untuk rona lainnya.
Anda dapat menyesuaikan bobot dengan menyesuaikan periode, kisaran di mana Anda menentukan green
mungkin ada (yaitu daripada dari 0 hingga 240, Anda mungkin menetapkan batasan seperti 40 > hue > 200
), dan menentukan apa pun di luar rentang itu untuk memiliki warna hijau dari 0 Perlu dicatat bahwa ini akan akurat secara matematis, namun mungkin tidak sepenuhnya akurat secara persepsi. Anda tentu saja dapat mengubah rumus untuk menyesuaikan titik pure green
lebih ke arah kuning (yang mungkin menghasilkan hasil yang lebih akurat secara perseptual), meningkatkan amplitudo kurva ke dataran tinggi dan memperluas pita hijau murni ke rentang warna, daripada satu nilai rona, dll. Untuk akurasi total persepsi manusia, algoritma yang lebih kompleks diproses dalam CIE XYZ dan CIE L a b *ruang mungkin diperlukan. (CATATAN: Kompleksitas bekerja di ruang XYZ dan Lab meningkat secara dramatis melampaui apa yang saya jelaskan di sini.)
Untuk menghitung kehijauan foto, Anda bisa menghitung kehijauan setiap piksel, lalu menghasilkan rata-rata. Anda kemudian dapat mengambil algoritme dari sana, dan menyesuaikannya untuk kebutuhan spesifik Anda.
Anda dapat menemukan algoritma untuk konversi warna di EasyRGB , seperti yang untuk RGB ke HSV:
var_R = ( R / 255 ) // Red percentage
var_G = ( G / 255 ) // Green percentage
var_B = ( B / 255 ) // Blue percentage
var_Min = min( var_R, var_G, var_B ) //Min. value of RGB
var_Max = max( var_R, var_G, var_B ) //Max. value of RGB
del_Max = var_Max - var_Min //Delta RGB value
V = var_Max //Value (or Brightness)
if ( del_Max == 0 ) //This is a gray, no chroma...
{
H = 0 //Hue (0 - 1.0 means 0° - 360°)
S = 0 //Saturation
}
else //Chromatic data...
{
S = del_Max / var_Max
del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max
del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max
del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max
if ( var_R == var_Max ) H = del_B - del_G
else if ( var_G == var_Max ) H = ( 1 / 3 ) + del_R - del_B
else if ( var_B == var_Max ) H = ( 2 / 3 ) + del_G - del_R
if ( H < 0 ) H += 1
if ( H > 1 ) H -= 1
}