Bagaimana cara menggunakan SLR saya untuk mengukur 'kehijauan' foto?

13

Latar Belakang

Gambar digital saya dapat dibaca dalam program komputer seperti Matlab atau R sebagai matriks amxnx 3 di mana mxn adalah jumlah piksel yang diamati oleh masing-masing dari tiga (merah, hijau, dan biru) sensor sensor, dan setiap sel dalam matriks memiliki nomor dari 1-255 yang mencerminkan kecerahan yang diamati oleh sensor.

Saya ingin menggunakan informasi ini untuk memperoleh ukuran obyektif dari kehijauan dalam sebuah foto, karena saya ingin mencoba untuk menghubungkan warna hijau dengan pertumbuhan tanaman (bayangkan satu gambar per hari di ladang jagung).

Pekerjaan sebelumnya dalam arah ini telah berhasil dengan menghitung indeks hijau baik sebagai

  • hijau% = hijau / (biru + merah) atau
  • hijau divergensi = 2 * hijau - merah - biru

dari gambar webcam untuk masing-masing piksel mxn, tetapi tidak ada kontrol atas aperture atau radiasi insiden (sudut matahari).

perhatikan bahwa saya tidak mencari ukuran 'absolut' warna hijau, skala dan distribusi jumlah tidak masalah - hanya harus memberikan ukuran relatif konsisten warna hijau.

Pertanyaan

Dapatkah saya menggunakan SLR saya untuk mendapatkan ukuran kehijauan yang kuat yang tidak berubah dengan salah satu atau semua hal berikut ini:

  • tutupan awan?
  • waktu hari?
  • hari tahun? (ini adalah satu-satunya persyaratan)
  • proporsi langit / tanah di latar belakang?

Status terkini

Saya telah datang dengan ide-ide berikut, tetapi saya tidak yakin mana yang akan diperlukan, atau mana yang tidak akan berpengaruh pada rasio hijau / (merah + biru)

  1. ambil gambar plastik putih, dan gunakan gambar ini untuk menormalkan nilai-nilai lainnya
  2. Perbaiki aperture
  3. Perbaiki kecepatan rana
  4. atur white balance menggunakan selembar kertas putih
  5. Ambil semua foto dari sudut yang sama
  6. Ambil semua foto di siang hari
David LeBauer
sumber
1
Anda mungkin mempertimbangkan pencahayaan buatan, itu akan membuat prosedur lebih sederhana. Sebuah flash harus dilakukan dengan benar, hanya pastikan itu berada di lokasi yang sama, dan daya.
PearsonArtPhoto
@ Pearsonarphoto - ide yang menarik, saya berpikir untuk mengambil foto di siang hari, tapi mungkin lebih masuk akal untuk melakukannya di malam hari tanpa bulan.
David LeBauer
1
Jika Anda mengikuti saran Pearsonartphoto, Anda ingin mengatur rana, apertur, dan ISO secara manual - atur rana Anda ke kecepatan sinkronisasi flash Anda (umumnya 1/200 hingga 1/320), dan atur apertur dan ISO Anda menjadi rendah karena mereka dapat pergi tanpa kehabisan daya flash. Ini akan membuat ambient Anda menjadi gelap mungkin - bulan purnama seharusnya tidak ada masalah (matahari tengah hari, di sisi lain ...) Untuk situasi ini, flash on-axis akan menjadi yang terbaik, karena akan memberikan bayangan paling sedikit .
Evan Krall
2
@ Evan, saya tidak setuju tentang on-axis flash. Alasannya adalah ini: photo.stackexchange.com/questions/9531/… —Cara refleksi yang terlalu langsung. Kecuali ketika menggunakan polarizer, seperti yang saya jelaskan di sana - tetapi kemudian orang perlu memastikan bahwa gigi tetap sama dan white balance dilakukan dengan benar. Polarizer mengubah white balance.
Simon A. Eugster
2
Klorofil paling terang di inframerah dekat: yale.edu/ceo/Documentation/rsvegfaq.html Ada langkah-langkah standar "kehijauan" tanaman berdasarkan ini, seperti NDVI. Dengan demikian, jika memungkinkan, dapatkan kamera yang dapat merekam band NIR.
whuber

Jawaban:

12

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.

Hue Plot - Green Purity dalam Hue Degrees
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 pureGreenharus 1,0 . Rumus untuk komputasi greennesskemudian dapat dilakukan sebagai berikut:

             sin(scale * hue)   } 0 > hue > 240
greenness = 
             0                  } 240 <= hue <= 360 || hue == 0

Ini hueadalah tingkat warna dari nilai warna HSV Anda. Ini radiusadalah setengah dari perioddi mana hijau hadir sampai taraf tertentu. The scalemenyesuaikan 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 greennesshanya 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 greenmungkin 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 greenlebih 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
}
jrista
sumber
1
+1 untuk teknik pemrosesan mentah. Sumber dcraw akan menjadi titik awal yang baik cybercom.net/~dcoffin/dcraw/dcraw.c
Silakan Baca Profil
1
Pemrosesan mentah akan membuat penghitungan tingkat hijau lebih mudah, namun itu akan membuat berurusan dengan pemain warna jauh lebih kompleks.
jrista
3

Proyek GLOBE ?

Jangan gunakan selembar kertas putih. Ini mengandung brighteners optik yang mengubah beberapa UV menjadi cahaya biru, menyebabkan paparan yang salah. Inilah sebabnya mengapa kartu abu-abu komersial (seperti yang disarankan oleh jrista) ada.

Mengambil semua foto dari tempat yang persis sama tentu saja merupakan pendekatan yang benar. Mengenai kecepatan rana dan apertur, ini tidak masalah. Kecepatan rana tidak berubah warna sama sekali, apertur mengaburkan gambar, tapi saya rasa efek ini menghilang saat Anda meringkas semua nilai piksel. Saya lebih suka mencoba mendapatkan eksposur yang konstan.

Mengenai perbedaan antara clouded dan tidak clouded, Anda mungkin hanya ingin menjalankan beberapa tes. Jika jumlah sebenarnya dari hijau tidak berubah dengan cepat (yaitu mulai hari ini hingga besok), maka itu tidak boleh dilakukan saat memeriksa gambar. Mungkin pendekatan empiris mungkin membantu di sana (mis. Jika Anda menemukan bahwa kehijauan selalu 10% lebih tinggi ketika mendung, Anda bisa mengimbanginya).

Simon A. Eugster
sumber
ini bukan proyek GLOBE, tetapi bisa diubah menjadi proyek; terima kasih telah menunjukkan situs itu.
David LeBauer
Mungkin menarik bagi Anda juga: Saat ini saya sedang menulis sebuah program untuk menganalisis video, misalnya dari webcam, dan statistik keluaran (berbagi hijau dll.). Harus selesai dalam beberapa minggu mendatang. phenocam.granjow.net
Simon A. Eugster
kedengarannya bermanfaat. Pernahkah Anda berkolaborasi dengan ilmuwan?
David LeBauer
Belum terlalu banyak karena metode evaluasi akan menjadi bagian terakhir (dan juga dapat diubah / ditambahkan dengan mudah). Tetapi ini adalah proyek dari ETH Zürich dan juga akan digunakan di sana. (Tepatnya, awalnya ini akan digunakan oleh siswa sekolah menengah untuk proyek Globe mereka.)
Simon A. Eugster
1
  1. Saya menyarankan untuk memotret 'RAW', dan mengonversi ke TIFF 16-bit menggunakan auto white balance kamera tetapi tidak ada koreksi gamma (yaitu warna seimbang tetapi keluaran linier). 16-bit akan memungkinkan perhitungan rasio dan indeks yang lebih baik dalam bayangan dan sorotan yang dalam (yaitu tidak ada kliping). DCRAW dapat melakukan ini tetapi kamera Anda akan datang dengan perangkat lunaknya sendiri yang mungkin lebih mudah digunakan.

  2. Jika Anda ingin indeks maka RGB adalah satu-satunya ruang warna yang berguna. Anda telah menyebutkan indeks 'divergensi hijau' (juga disebut Indeks Kelebihan Hijau) - ini dan Green Leaf Algorithm yang berhubungan erat bekerja dengan sangat baik. Jika Anda ingin melakukan klasifikasi piksel berbasis warna (yaitu veg versus non-veg) maka saya akan melihat lebih dekat pada ruang warna L a * daripada HSV / HSI. Sebenarnya ada demo yang cukup bagus di situs web Mathworks yang menggambarkan L ab * analisis. Klasifikasi dapat digabungkan dengan analisis spektral untuk menjawab pertanyaan a) berapa banyak piksel hijau yang ada dan b) seberapa hijau mereka? Ini mungkin lebih berguna daripada hanya indeks greeness, yang juga akan dipengaruhi oleh kualitas spektral latar belakang (tanah, serasah, dll.), Yang juga dapat berubah seiring waktu. Anda menyebutkan tanaman jagung jadi saya berasumsi bahwa Anda mengarahkan kamera ke bawah, bukan ke atas?

  3. Jika Anda memiliki dua kamera maka Anda dapat menggabungkan gambar yang tampak ke bawah (mengukur greeness) dengan gambar ke atas yang mengukur tutupan vegetasi. Gambar ke atas tidak akan cocok untuk analisis spektral dan klasifikasi piksel akan didasarkan pada kontras antara langit / bukan langit, mungkin hanya menggunakan saluran biru gambar RGB.

  4. Jika Anda mengumpulkan rentang waktu (harian?) Maka Anda dapat membagi gambar ke bawah menjadi gambar 'hari berawan' dan gambar 'hari cerah' dan memeriksa bias. Anda bisa bermain dengan keseimbangan warna selama pemrosesan mentah untuk mengoreksi bias, jika ada, atau hanya mengubah skala satu seri untuk mencocokkan yang lain (tetap sederhana) dengan asumsi bahwa hari-hari cerah dan berawan diselingi.

Selamat bersenang-senang.

mata ikan
sumber
Ubin warna dengan ubin merah, hijau dan biru mungkin bahkan lebih baik daripada kartu abu-abu jika Anda pergi jalur itu.
fisheye