Saya mencari beberapa jenis rumus atau algoritma untuk menentukan kecerahan warna yang diberikan nilai RGB. Saya tahu ini tidak sesederhana menambahkan nilai-nilai RGB bersama-sama dan memiliki jumlah yang lebih tinggi menjadi lebih cerah, tapi saya agak bingung harus mulai dari mana.
387
Jawaban:
Apakah maksud Anda kecerahan? Kecerahan yang dirasakan? Luminance?
(0.2126*R + 0.7152*G + 0.0722*B)
[1](0.299*R + 0.587*G + 0.114*B)
[2]→sqrt( 0.241*R^2 + 0.691*G^2 + 0.068*B^2 )
sqrt( 0.299*R^2 + 0.587*G^2 + 0.114*B^2 )
(terima kasih kepada @MatthewHerbst ) [3]sumber
0.299*(R^2)
(karena eksponensial berjalan sebelum multiplikasi)Saya pikir yang Anda cari adalah formula konversi RGB -> Luma .
Fotometrik / digital ITU BT.709 :
Digital ITU BT.601 (memberi bobot lebih besar pada komponen R dan B):
Jika Anda ingin memperdagangkan akurasi untuk kinerja, ada dua rumus perkiraan untuk yang satu ini:
Ini dapat dihitung dengan cepat sebagai
sumber
Blue
+ 3 * Hijau) / 6, yang kedua adalah (3 * Merah +Blue
+ 4 * Hijau) >> 3. Memang, dalam kedua pendekatan cepat, Biru memiliki bobot terendah, tetapi masih ada di sana.Y = (R<<1+R+G<<2+B)>>3
(itu hanya 3-4 siklus CPU pada ARM) tapi saya kira kompiler yang baik akan melakukan optimasi untuk Anda.Saya telah membuat perbandingan ketiga algoritma dalam jawaban yang diterima. Saya menghasilkan warna dalam siklus di mana hanya sekitar setiap warna ke-400 digunakan. Setiap warna diwakili oleh 2x2 piksel, warna diurutkan dari yang paling gelap ke paling terang (kiri ke kanan, atas ke bawah).
Gambar 1 - Luminance (relatif)
Gambar 2 - http://www.w3.org/TR/AERT#color-contrast
Gambar 3 - Model Warna HSP
Gambar ke 4 - WCAG 2.0 SC 1.4.3 rumus luminans dan rasio perbandingan relatif (lihat jawaban @ Synchro di sini )
Pola kadang-kadang dapat terlihat pada gambar 1 dan 2 tergantung pada jumlah warna dalam satu baris. Saya tidak pernah melihat pola pada gambar dari algoritma ke-3 atau ke-4.
Jika saya harus memilih saya akan pergi dengan algoritma nomor 3 karena jauh lebih mudah diimplementasikan dan sekitar 33% lebih cepat daripada yang ke-4.
sumber
^2
dan yangsqrt
termasuk dalam formula ketiga adalah cara yang lebih cepat untuk mendekati RGB linier dari bukan-linear RGB daripada^2.2
dan^(1/2.2)
itu akan lebih benar. Sayangnya, menggunakan input nonlinier dan bukannya linear.Di bawah ini adalah satu-satunya algoritma CORRECT untuk mengonversi gambar sRGB, seperti yang digunakan dalam peramban dll., Ke skala abu-abu.
Penting untuk menerapkan kebalikan dari fungsi gamma untuk ruang warna sebelum menghitung produk dalam. Kemudian Anda menerapkan fungsi gamma ke nilai yang dikurangi. Kegagalan untuk menggabungkan fungsi gamma dapat menyebabkan kesalahan hingga 20%.
Untuk barang-barang komputer biasa, ruang warnanya adalah sRGB. Angka yang tepat untuk sRGB adalah sekitar. 0,21, 0,72, 0,07. Gamma untuk sRGB adalah fungsi gabungan yang mendekati eksponensial dengan 1 / (2.2). Inilah semuanya dalam C ++.
sumber
Jawaban "Diterima" Tidak Benar dan Tidak Lengkap
Satu-satunya jawaban yang akurat adalah jawaban @ jive-dadson dan @EddingtonsMonkey , dan dalam dukungan @ nils-pipenbrinck . Jawaban lain (termasuk yang diterima) adalah menautkan atau mengutip sumber yang salah, tidak relevan, usang, atau rusak.
Secara singkat:
Berikut ini adalah jawaban yang benar dan lengkap:
Karena utas ini sangat muncul di mesin pencari, saya menambahkan jawaban ini untuk mengklarifikasi berbagai kesalahpahaman pada subjek.
Kecerahan adalah atribut persepsi, tidak memiliki ukuran langsung.
Perceived lightness diukur oleh beberapa model penglihatan seperti CIELAB, di sini L * (Lstar) adalah ukuran dari lightness perseptual , dan non-linear untuk memperkirakan kurva respon non-linear penglihatan manusia.
Luminance adalah ukuran cahaya linier, berbobot spektral untuk penglihatan normal tetapi tidak disesuaikan untuk persepsi non-linear terhadap cahaya.
Luma ( Y´ prime) adalah sinyal yang dikodekan gamma, tertimbang yang digunakan dalam beberapa pengkodean video. Tidak perlu bingung dengan pencahayaan linier.
Gamma atau transfer curve (TRC) adalah kurva yang sering serupa dengan kurva persepsi, dan biasanya diterapkan pada data gambar untuk penyimpanan atau siaran untuk mengurangi noise yang dirasakan dan / atau meningkatkan pemanfaatan data (dan alasan terkait).
Untuk menentukan penerangan yang dirasakan , pertama-tama konversikan gamma yang dikodekan nilai-nilai gambar R´G´B menjadi luminance linier (
L
atauY
) dan kemudian ke penerangan yang dirasakan non-linear (L*
)UNTUK MENCARI LUMINANCE:
... Karena ternyata itu hilang di suatu tempat ...
Langkah pertama:
Konversikan semua nilai integer sRGB 8 bit ke desimal 0,0-1.0
Langkah Dua:
Konversi gamma yang dikodekan RGB ke nilai linier. sRGB (standar komputer) misalnya membutuhkan kurva daya sekitar V ^ 2.2, meskipun transformasi "akurat" adalah:
Di mana V´ adalah saluran R, G, atau B yang disandikan gamma dari sRGB.
Kodesemu:
Langkah ketiga:
Untuk menemukan Luminance (Y) terapkan koefisien standar untuk sRGB:
Kodesemu menggunakan fungsi di atas:
UNTUK MENCARI LIGHTNESS YANG DAPAT DIBERI:
Langkah Empat:
Ambil luminance Y dari atas, dan ubah ke L *
Kodesemu:
L * adalah nilai dari 0 (hitam) hingga 100 (putih) di mana 50 adalah "abu-abu tengah" perseptual. L * = 50 adalah setara dengan Y = 18,4, atau dengan kata lain kartu abu-abu 18%, mewakili bagian tengah dari eksposur fotografi (Ansel Adams zona V).
Referensi:
IEC 61966-2-1:1999 Standard
Wikipedia sRGB
Wikipedia CIELAB
Wikipedia CIEXYZ
FAQ Gamma Charles Poynton
sumber
Luma=rgb2gray(RGB);LAB=rgb2lab(RGB);LAB(:,:,2:3)=0;PerceptualGray=lab2rgb(LAB);
L*a*b*
tidak memperhitungkan sejumlah atribut psikofisik. Efek Helmholtz-Kohlrausch adalah satu, tetapi ada banyak lainnya. CIELAB bukanlah model penilaian gambar "penuh" dengan cara apa pun. Dalam posting saya, saya mencoba untuk menutupi konsep dasar selengkap mungkin tanpa menjelajah ke dalam hal-hal kecil yang sangat dalam. Model Hunt, model Fairchild, dan lainnya melakukan pekerjaan yang lebih lengkap, tetapi juga jauh lebih kompleks.Saya menemukan kode ini (ditulis dalam C #) yang melakukan pekerjaan yang sangat baik dalam menghitung "kecerahan" warna. Dalam skenario ini, kode mencoba menentukan apakah akan menempatkan teks putih atau hitam di atas warna.
sumber
Menariknya, formulasi ini untuk RGB => HSV hanya menggunakan v = MAX3 (r, g, b). Dengan kata lain, Anda dapat menggunakan maksimum (r, g, b) sebagai V di HSV.
Saya memeriksa dan pada halaman 575 Hearn & Baker inilah cara mereka menghitung "Nilai" juga.
sumber
Daripada tersesat di antara pemilihan formula acak yang disebutkan di sini, saya sarankan Anda menggunakan formula yang direkomendasikan oleh standar W3C.
Berikut ini adalah implementasi PHP yang sederhana namun tepat untuk rumus relatif dan rasio kontras WCAG 2.0 SC 1.4.3 . Ini menghasilkan nilai-nilai yang sesuai untuk mengevaluasi rasio yang diperlukan untuk kepatuhan WCAG, seperti pada halaman ini , dan karena itu cocok dan sesuai untuk aplikasi web apa pun. Ini sepele untuk port ke bahasa lain.
sumber
Untuk menambahkan apa yang dikatakan semua orang:
Semua persamaan ini bekerja cukup baik dalam praktiknya, tetapi jika Anda harus sangat tepat, Anda harus terlebih dahulu mengonversi warna ke ruang warna linier (menerapkan invers gambar-gamma), lakukan rata-rata bobot warna primer dan - jika Anda ingin tampilkan warnanya - bawa luminance kembali ke gamma monitor.
Perbedaan luminance antara gamma ingnoring dan melakukan gamma yang tepat hingga 20% dalam abu-abu gelap.
sumber
Saya sedang menyelesaikan tugas yang sama hari ini di javascript. Saya telah menetapkan
getPerceivedLightness(rgb)
fungsi ini untuk warna HEX RGB. Ini berkaitan dengan efek Helmholtz-Kohlrausch melalui rumus Fairchild dan Perrotta untuk koreksi pencahayaan.sumber
Ruang warna HSV harus melakukan triknya, lihat artikel wikipedia tergantung pada bahasa tempat Anda bekerja, Anda mungkin mendapatkan konversi perpustakaan.
H adalah rona yang merupakan nilai numerik untuk warna (yaitu merah, hijau ...)
S adalah saturasi warna, yaitu seberapa 'intens' warna itu
V adalah 'kecerahan' warna.
sumber
Nilai Luminance RGB = 0,3 R + 0,59 G + 0,11 B
http://www.scantips.com/lumin.html
Saya pikir ruang warna RGB jelas tidak seragam sehubungan dengan jarak euclidian L2. Ruang seragam termasuk CIE LAB dan LUV.
sumber
Rumus invers-gamma oleh Jive Dadson harus memiliki setengah penyesuaian dihapus ketika diimplementasikan dalam Javascript, yaitu kembali dari fungsi gam_sRGB perlu kembali int (v * 255); tidak mengembalikan int (v * 255 + .5); Setengah-penyesuaian dibulatkan ke atas, dan ini dapat menyebabkan nilai terlalu tinggi pada R = G = B yaitu triad warna abu-abu. Konversi skala abu-abu pada triad R = G = B harus menghasilkan nilai yang sama dengan R; itu salah satu bukti bahwa formula itu valid. Lihat Nine Shades of Greyscale untuk formula yang sedang beraksi (tanpa setengah menyesuaikan).
sumber
Saya bertanya-tanya bagaimana koefisien rgb ditentukan. Saya melakukan percobaan sendiri dan berakhir dengan yang berikut:
Tutup tetapi jelas berbeda dari koefisien ITU yang telah lama terbentuk. Saya bertanya-tanya apakah koefisien-koefisien itu bisa berbeda untuk masing-masing dan setiap pengamat, karena kita semua mungkin memiliki jumlah kerucut dan batang yang berbeda pada retina di mata kita, dan terutama perbandingan antara berbagai jenis kerucut yang mungkin berbeda.
Sebagai referensi:
ITU BT.709:
ITU BT.601:
Saya melakukan tes dengan cepat memindahkan bilah abu-abu kecil pada latar belakang merah, hijau terang dan biru terang, dan menyesuaikan abu-abu sampai tercampur sebanyak mungkin. Saya juga mengulangi tes itu dengan nuansa lain. Saya mengulangi tes pada layar yang berbeda, bahkan satu dengan faktor gamma tetap 3.0, tetapi semuanya terlihat sama bagi saya. Terlebih lagi, koefisien ITU benar-benar salah untuk mata saya.
Dan ya, saya mungkin memiliki penglihatan warna normal.
sumber
Berikut adalah sedikit kode C yang seharusnya menghitung luminance yang dirasakan dengan benar.
sumber
Silakan tentukan kecerahan. Jika Anda mencari seberapa dekat dengan putih warnanya, Anda dapat menggunakan Euclidean Distance from (255, 255, 255)
sumber
'V' HSV mungkin adalah yang Anda cari. MATLAB memiliki fungsi rgb2hsv dan artikel wikipedia yang sebelumnya dikutip penuh dengan pseudocode. Jika konversi RGB2HSV tidak layak, model yang kurang akurat adalah versi skala abu-abu dari gambar.
sumber
Tautan ini menjelaskan semuanya secara mendalam, termasuk mengapa konstanta pengali itu ada sebelum nilai R, G, dan B.
Sunting: Ini memiliki penjelasan untuk salah satu jawaban di sini juga (0,299 * R + 0,587 * G + 0,114 * B)
sumber
Untuk menentukan kecerahan warna dengan R, saya mengonversi warna sistem RGB ke warna sistem HSV.
Dalam skrip saya, saya menggunakan kode sistem HEX sebelumnya karena alasan lain, tetapi Anda dapat mulai juga dengan kode sistem RGB
rgb2hsv {grDevices}
. Dokumentasinya ada di sini .Ini bagian dari kode saya:
sumber
Untuk kejelasan, rumus yang menggunakan akar kuadrat perlu
sqrt(coefficient * (colour_value^2))
tidak
sqrt((coefficient * colour_value))^2
Buktinya terletak pada konversi triad R = G = B menjadi skala abu-abu R. Itu hanya akan benar jika Anda menyamakan nilai warna, bukan koefisien nilai nilai kali. Lihat Sembilan Nuansa Skala Abu-Abu
sumber