Mengonversi RGB ke grayscale / intensitas

129

Saat mengonversi dari RGB ke skala abu-abu, dikatakan bahwa bobot spesifik ke saluran R, G, dan B harus diterapkan. Bobot tersebut adalah: 0.2989, 0.5870, 0.1140.

Konon penyebabnya adalah perbedaan persepsi / sensibilitas manusia terhadap ketiga warna tersebut. Kadang-kadang juga dikatakan bahwa ini adalah nilai yang digunakan untuk menghitung sinyal NTSC.

Namun, saya tidak menemukan referensi yang bagus untuk ini di web. Apa sumber dari nilai-nilai ini?

Lihat juga pertanyaan-pertanyaan sebelumnya ini: di sini dan di sini .

ypnos
sumber
26
Ya, itu benar. Saya melakukan pemrograman pada nilai RGB sepanjang waktu. Menerapkan nilai "dunia nyata" ke penghitungan ini sangat penting jika Anda ingin aplikasi Anda bermanfaat.
Neil N
1
Banyak programmer mungkin tidak peduli dan menghitung gambar grayscale yang "salah", tapi saya lakukan.
ypnos
6
Saya setuju itu terkait dengan pengkodean - jelas merupakan masalah yang menarik dan relevan jika Anda mengkodekan grafik. +1 karena saya ingin tahu jawabannya sendiri
Cruachan
6
RGB adalah pemrograman terkait. Ini sebagai pemrograman yang terkait dengan parsing string tanggal. Seperti mengonversi teks "true" menjadi nilai boolean.
Neil N

Jawaban:

87

Nomor spesifik dalam pertanyaan berasal dari CCIR 601 (lihat tautan Wikipedia di bawah).

Jika Anda mengonversi RGB -> skala abu-abu dengan angka yang sedikit berbeda / metode berbeda, Anda tidak akan melihat banyak perbedaan sama sekali pada layar komputer normal dalam kondisi pencahayaan normal - cobalah.

Berikut beberapa tautan lain tentang warna secara umum:

Wikipedia Luma

Situs web Bruce Lindbloom yang luar biasa

bab 4 tentang Warna dalam buku Colin Ware, "Visualisasi Informasi", isbn 1-55860-819-2; tautan panjang ke Ware di books.google.com ini mungkin berfungsi atau tidak

cambridgeincolor : "tutorial yang sangat bagus dan ditulis dengan baik tentang cara memperoleh, menafsirkan, dan memproses foto digital menggunakan pendekatan berorientasi visual yang menekankan konsep daripada prosedur"

Jika Anda mengalami RGB "linier" vs "nonlinier", inilah bagian dari catatan lama saya tentang hal ini. Ulangi, dalam praktiknya Anda tidak akan melihat banyak perbedaan.


RGB -> ^ gamma -> Y -> L *

Dalam ilmu warna, nilai RGB umum, seperti dalam html rgb (10%, 20%, 30%), disebut "nonlinear" atau Gamma dikoreksi . Nilai "linier" didefinisikan sebagai

Rlin = R^gamma,  Glin = G^gamma,  Blin = B^gamma

di mana gamma adalah 2.2 untuk banyak PC. RGB biasa kadang-kadang ditulis sebagai R 'G' B '(R' = Rlin ^ (1 / gamma)) (purists tongue-click) tapi di sini saya akan menjatuhkan '.

Kecerahan pada layar CRT sebanding dengan RGBlin = RGB ^ gamma, jadi 50% abu-abu pada CRT cukup gelap: .5 ^ 2.2 = 22% dari kecerahan maksimum. (Layar LCD lebih kompleks; selanjutnya, beberapa kartu grafis mengimbangi gamma.)

Untuk mendapatkan ukuran kecerahan yang dipanggil L*dari RGB, pertama bagi RGB dengan 255, dan hitung

Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma

Ini ada Ydi ruang warna XYZ; itu adalah ukuran "luminansi" warna. (Rumus sebenarnya tidak persis x ^ gamma, tapi dekat; tetap dengan x ^ gamma untuk umpan pertama.)

Akhirnya,

L* = 116 * Y ^ 1/3 - 16

"... bercita-cita untuk keseragaman persepsi [dan] sangat cocok dengan persepsi manusia tentang ringan." - Ruang warna Lab Wikipedia

denis
sumber
8
Y = 0,2126 * R + 0,7152 * G + 0,0722 * B - Wikipedia ( en.wikipedia.org/wiki/Grayscale )
iamantony
14

Saya menemukan bahwa publikasi ini direferensikan dalam jawaban atas pertanyaan serupa sebelumnya. Ini sangat membantu:

http://cadik.posvete.cz/color_to_gray_evaluation/

Ini menunjukkan 'banyak' metode berbeda untuk menghasilkan gambar skala abu-abu dengan hasil berbeda!

ypnos
sumber
9

Berikut beberapa kode di c untuk mengubah rgb menjadi grayscale. Pembobotan nyata yang digunakan untuk konversi rgb ke grayscale adalah 0,3R + 0,6G + 0,11B. anak timbangan ini tidak terlalu penting sehingga Anda dapat bermain dengannya. Saya telah membuatnya menjadi 0.25R + 0.5G + 0.25B. Ini menghasilkan gambar yang sedikit lebih gelap.

CATATAN: Kode berikut mengasumsikan format piksel xRGB 32bit

unsigned int *pntrBWImage=(unsigned int*)..data pointer..;  //assumes 4*width*height bytes with 32 bits i.e. 4 bytes per pixel
unsigned int fourBytes;
        unsigned char r,g,b;
        for (int index=0;index<width*height;index++)
        {
            fourBytes=pntrBWImage[index];//caches 4 bytes at a time
            r=(fourBytes>>16);
            g=(fourBytes>>8);
            b=fourBytes;

            I_Out[index] = (r >>2)+ (g>>1) + (b>>2); //This runs in 0.00065s on my pc and produces slightly darker results
            //I_Out[index]=((unsigned int)(r+g+b))/3;     //This runs in 0.0011s on my pc and produces a pure average
        }
twerdster
sumber
2
0,3 0,6 0,11 jangan tambahkan ke 1. Wikipedia tampaknya menyarankan 0,30 0,59 0,11.
damix911
Benar, tetapi satu-satunya hasil dari mereka yang tidak menambah 1 adalah perubahan intensitas yang sangat kecil. Metode yang diusulkan 0.25,0.5,0.25 memang menambah 1 tetapi tidak masalah jika tidak. Ini adalah pengoptimalan sehingga memberikan sedikit akurasi adalah pengorbanan yang masuk akal.
twerdster
2
@twerdster Tidak satu pun kumpulan koefisien yang benar. .3, .6, .11 adalah standar NTSC lama, bukan sRGB / Rec709 (yang digunakan web dan sebagian besar komputer). Dan 0,25,0.5,0.25 Anda bukanlah pengorbanan yang masuk akal - B hanya 7% dari luminansi, Anda salah sebesar 347%. Koefisien untuk sRGB / r709 (setelah linierisasi): Rlin * 0,2126 + Glin * 0,7152 + Blin * 0,0722 = Y Pembobotan spektral ini diturunkan dari persepsi spektral manusia. Anda tidak bisa hanya memasukkan angka apa pun yang Anda inginkan untuk kenyamanan dan berharap akurat. Anda perlu meluruskan sRGB dan kemudian menerapkan koefisien yang benar.
Myndex
Jika Anda berada dalam situasi di mana kesenjangan terlalu mahal, perkiraan yang menggunakan multiply tunggal dengan pergeseran dan menambahkan adalah: 0.11111111 * ((G + (G<<1) + R) <<1) + B). Ini sama dengan (2*R+6*G+B) / 9)atau 0.222 R + 0.666 G + 0.111 B. Sebelum pergi ke produksi, bandingkan dengan formula yang akurat untuk berbagai kasus uji.
ToolmakerSteve
6

Lihat FAQ Warna untuk informasi tentang ini. Nilai-nilai ini berasal dari standarisasi nilai RGB yang kami gunakan dalam tampilan kami. Sebenarnya, menurut Color FAQ, nilai yang Anda gunakan sudah usang, karena nilai tersebut digunakan untuk standar NTSC asli dan bukan monitor modern.

Brian Campbell
sumber
3

Apa sumber dari nilai-nilai ini?

"Sumber" dari koefisien yang diposting adalah spesifikasi NTSC yang dapat dilihat di Rec601 dan Karakteristik Televisi .

"Sumber utama" adalah CIE sekitar percobaan tahun 1931 tentang persepsi warna manusia. Respon spektral dari penglihatan manusia tidak seragam. Eksperimen mengarah pada pembobotan nilai tristimulus berdasarkan persepsi. Kerucut L, M, dan S 1 kami peka terhadap panjang gelombang cahaya yang kami identifikasi sebagai "Merah", "Hijau", dan "Biru" (masing-masing), yang merupakan tempat asal warna utama tristimulus. 2

Bobot spektral 3 cahaya linier untuk sRGB (dan Rec709) adalah:

R lin * 0,2126 + G lin * 0,7152 + B lin * 0,0722 = Y

Ini khusus untuk ruang warna sRGB dan Rec709, yang dimaksudkan untuk mewakili monitor komputer (sRGB) atau monitor HDTV (Rec709), dan dirinci dalam dokumen ITU untuk Rec709 dan juga BT.2380-2 (10/2018)

CATATAN KAKI (1) Kerucut adalah sel-sel pendeteksi warna pada retina mata.
(2) Namun, panjang gelombang tristimulus yang dipilih BUKAN pada "puncak" dari setiap jenis kerucut - sebaliknya nilai tristimulus dipilih sedemikian rupa sehingga mereka menstimulasi jenis kerucut tertentu secara substansial lebih dari yang lain, yaitu pemisahan stimulus.
(3) Anda perlu meluruskan nilai sRGB Anda sebelum menerapkan koefisien. Saya membahas ini dalam jawaban lain di sini.

Myndex
sumber
-2

Nilai-nilai ini berbeda dari orang ke orang, terutama bagi orang yang buta warna.

Bob Pickle
sumber
-4

apakah semua ini benar-benar diperlukan, persepsi manusia dan CRT vs LCD akan bervariasi, tetapi intensitas RGB tidak, Mengapa tidak L = (R + G + B)/3dan mengatur RGB baru ke L, L, L?

pengguna1668969
sumber
3
Merata-rata ketiga pendahuluan R, G, B memperlakukan mereka secara persepsi setara, yang tidak terjadi pada sistem penglihatan manusia.
Bill Feth