Saya ingin merancang sebuah program yang dapat membantu saya menilai antara 5 warna yang telah ditentukan yang mana yang lebih mirip dengan warna variabel, dan dengan persentase berapa. Masalahnya adalah saya tidak tahu bagaimana melakukannya secara manual langkah demi langkah. Jadi lebih sulit untuk memikirkan suatu program.
Lebih detail: Warnanya dari foto tabung dengan gel yang warnanya berbeda. Saya memiliki 5 tabung dengan warna berbeda yang masing-masing mewakili 1 dari 5 level. Saya ingin mengambil foto dari sampel lain dan di komputer menilai ke tingkat mana sampel itu dimiliki dengan membandingkan warna, dan saya ingin tahu itu dengan persentase perkiraan juga. Saya ingin program yang melakukan sesuatu seperti ini: http://www.colortools.net/color_matcher.html
Jika Anda dapat memberi tahu saya langkah apa yang harus diambil, bahkan jika itu adalah hal yang harus saya pikirkan dan lakukan secara manual. Itu akan sangat membantu.
Jawaban:
Lihat artikel Wikipedia tentang Perbedaan Warna untuk arahan yang tepat. Pada dasarnya, Anda ingin menghitung metrik jarak dalam beberapa ruang warna multidimensi. Tetapi RGB tidak "seragam secara perseptual", jadi metrik jarak Euclidean RGB Anda yang disarankan oleh Vadim tidak akan cocok dengan jarak yang dirasakan manusia antara warna. Sebagai permulaan, L a b * dimaksudkan untuk menjadi ruang warna yang secara seragam seragam, dan metrik deltaE biasanya digunakan. Tetapi ada lebih banyak ruang warna yang lebih halus dan formula delta yang lebih halus yang lebih dekat dengan pencocokan persepsi manusia.
Anda harus mempelajari lebih lanjut tentang ruang warna dan iluminan untuk melakukan konversi. Tetapi untuk rumus cepat yang lebih baik daripada metrik Euclidean RGB, lakukan saja ini: asumsikan bahwa nilai RGB Anda berada di ruang warna sRGB, temukan rumus konversi sRGB ke L a b *, ubah warna sRGB Anda menjadi L a b *, dan hitung deltaE antara dua nilai L a b * Anda. Ini tidak mahal secara komputasi, itu hanya beberapa rumus nonlinier dan beberapa mengalikan dan menambahkan.
sumber
color
permata yang mengimplementasikan deltaE di antara operasi warna lainnya.Hanya sebuah ide yang pertama kali terlintas di pikiran saya (maaf jika bodoh). Tiga komponen warna dapat diasumsikan koordinat 3D titik dan kemudian Anda dapat menghitung jarak antar titik.
FE
Jarak antar warna adalah
Persentase adalah
sumber
sebenarnya saya berjalan di jalan yang sama beberapa bulan yang lalu. tidak ada jawaban sempurna untuk pertanyaan (yang ditanyakan di sini beberapa kali) tetapi ada satu yang lebih canggih daripada jawaban sqrt (rr) dll dan lebih mudah untuk diterapkan secara langsung dengan RGB tanpa berpindah ke semua jenis ruang warna alternatif. Saya menemukan rumus ini di sini yang merupakan perkiraan biaya rendah dari rumus nyata yang cukup rumit (oleh CIE yang merupakan W3C warna, karena ini adalah pencarian yang belum selesai, Anda dapat menemukan persamaan perbedaan warna yang lebih tua dan lebih sederhana di sana). semoga berhasil
Sunting: Untuk anak cucu, inilah kode C yang relevan:
sumber
Nilai warna memiliki lebih dari satu dimensi, jadi tidak ada cara intrinsik untuk membandingkan dua warna. Anda harus menentukan untuk kasus penggunaan Anda arti warna dan dengan demikian cara terbaik untuk membandingkannya.
Kemungkinan besar Anda ingin membandingkan rona, saturasi, dan / atau sifat warna yang terang yang berlawanan dengan komponen merah / hijau / biru. Jika Anda mengalami kesulitan mencari tahu bagaimana Anda ingin membandingkannya, ambil beberapa pasang warna sampel dan bandingkan secara mental, maka cobalah untuk membenarkan / menjelaskan kepada diri sendiri mengapa mereka mirip / berbeda.
Setelah Anda mengetahui properti / komponen warna yang ingin Anda bandingkan, maka Anda perlu mencari cara untuk mengekstrak informasi itu dari suatu warna.
Kemungkinan besar Anda hanya perlu mengubah warna dari representasi RedGreenBlue yang umum menjadi HueSaturationLightness, dan kemudian menghitung sesuatu seperti
Contoh ini akan memberi Anda nilai skalar sederhana yang menunjukkan seberapa jauh gradien / rona warna satu sama lain.
Lihat HSL dan HSV di Wikipedia .
sumber
Jika Anda memiliki dua
Color
objekc1
danc2
, Anda dapat membandingkan setiap nilai RGB daric1
denganc2
.Nilai-nilai yang bisa Anda bagi dengan jumlah perbedaan saturasi (255), dan Anda akan mendapatkan perbedaan di antara keduanya.
Setelah itu Anda bisa menemukan perbedaan warna rata-rata dalam persentase.
Yang akan memberi Anda perbedaan persentase antara
c1
danc2
.sumber
pctDiffRed = diffRed / 255;
akan memberi Anda 0 kecuali jika Anda melakukan float di suatu tempat. <b> 2 </b> Anda harus mengalikan 100 di suatu tempat untuk mendapatkan persentase.Salah satu metode terbaik untuk membandingkan dua warna dengan persepsi manusia adalah CIE76. Perbedaannya disebut Delta-E. Ketika kurang dari 1, mata manusia tidak bisa mengenali perbedaannya.
Ada kelas utilitas warna yang luar biasa, ColorUtils (kode di bawah), yang mencakup metode perbandingan CIE76. Ini ditulis oleh Daniel Strebel, University of Zurich.
Dari ColorUtils.class saya menggunakan metode ini:
r1, g1, b1 - Nilai RGB dari warna pertama
r2, g2, b2 - nilai RGB dari warna kedua yang ingin Anda bandingkan
Jika Anda bekerja dengan Android, Anda bisa mendapatkan nilai-nilai ini seperti ini:
r1 = Color.red(pixel);
g1 = Color.green(pixel);
b1 = Color.blue(pixel);
Kelas ColorUtils.class oleh Daniel Strebel, Universitas Zurich:
sumber
Hanya jawaban lain, meskipun mirip dengan yang Supr - hanya ruang warna yang berbeda.
Masalahnya adalah: Manusia merasakan perbedaan warna tidak seragam dan ruang warna RGB mengabaikan hal ini. Akibatnya jika Anda menggunakan ruang warna RGB dan hanya menghitung jarak euclidean antara 2 warna, Anda mungkin mendapatkan perbedaan yang secara matematis benar, tetapi tidak akan sesuai dengan apa yang manusia katakan kepada Anda.
Ini mungkin bukan masalah - perbedaannya tidak terlalu besar saya pikir, tetapi jika Anda ingin menyelesaikan ini "lebih baik" Anda harus mengubah warna RGB Anda menjadi ruang warna yang dirancang khusus untuk menghindari masalah di atas. Ada beberapa yang, perbaikan dari model sebelumnya (karena ini didasarkan pada persepsi manusia kita perlu mengukur nilai "benar" berdasarkan data eksperimen). Ada ruang warna Lab yang saya pikir akan menjadi yang terbaik meskipun agak rumit untuk mengubahnya. Simpler akan menjadi CIE XYZ .
Berikut adalah situs yang mencantumkan rumus untuk mengkonversi antara ruang warna yang berbeda sehingga Anda dapat sedikit bereksperimen.
sumber
Semua metode di bawah ini menghasilkan skala 0-100.
sumber
Cara terbaik adalah deltaE. DeltaE adalah angka yang menunjukkan perbedaan warna. Jika delta <1 maka perbedaannya tidak dapat dikenali oleh mata manusia. Saya menulis kode di kanvas dan js untuk mengubah rgb ke lab dan kemudian menghitung delta e. Pada contoh ini kode ini mengenali piksel yang memiliki warna berbeda dengan warna dasar yang saya simpan sebagai LAB1. dan jika berbeda maka piksel tersebut menjadi merah. Anda dapat menambah atau mengurangi sensitivitas perbedaan warna dengan menambah atau mengurangi kisaran delta yang dapat diterima. Dalam contoh ini saya menetapkan 10 untuk deltaE di baris yang saya tulis (deltae <= 10):
}
// ------------------------------------------------ -------------------------------------------------- ---
sumber
1/3
dan16/116
keduanya mengevaluasi0
, yang hampir pasti bukan yang Anda inginkan. Mungkin algoritme Anda benar, tetapi kode Anda tentu saja tidak.Metode sederhana yang hanya menggunakan RGB adalah
Saya telah menggunakan ini untuk sementara waktu sekarang, dan itu berfungsi cukup baik untuk sebagian besar tujuan.
sumber
1/3
Saya menggunakan ini di android saya dan tampaknya memuaskan meskipun ruang RGB tidak disarankan:
Lalu saya menggunakan yang berikut ini untuk mendapatkan persen kesamaan:
Ini bekerja dengan cukup baik.
sumber
Saya telah mencoba berbagai metode seperti ruang warna LAB, perbandingan HSV dan saya telah menemukan bahwa luminositas bekerja cukup baik untuk tujuan ini.
Ini adalah versi Python
Akan memberimu
sumber
ImageColor
? sunting Saya menemukan, itufrom PIL import ImageColor
Saya berharap Anda ingin menganalisis seluruh gambar pada akhirnya, bukan? Jadi Anda bisa memeriksa perbedaan terkecil / tertinggi dengan matriks warna identitas.
Sebagian besar operasi matematika untuk memproses grafik menggunakan matriks, karena algoritma yang mungkin menggunakannya seringkali lebih cepat daripada jarak titik demi titik klasik dan perhitungan perbandingan. (mis. untuk operasi menggunakan DirectX, OpenGL, ...)
Jadi saya pikir Anda harus mulai dari sini:
http://en.wikipedia.org/wiki/Identity_matrix
http://en.wikipedia.org/wiki/Matrix_difference_equation
... dan seperti yang sudah dikomentari Beska di atas:
Yang juga berarti bahwa algoritme Anda bergantung pada definisi "mirip dengan" Anda jika Anda memproses gambar.
sumber
Versi Kotlin dengan berapa persen yang ingin Anda cocokkan.
Panggilan metode dengan argumen opsional opsional
Metode tubuh
sumber
Anda harus mengubah warna RGB menjadi ruang warna Lab untuk dapat membandingkannya dengan cara yang dilihat manusia. Kalau tidak, Anda akan mendapatkan warna RGB yang 'cocok' dengan beberapa cara yang sangat aneh.
Tautan wikipedia pada Perbedaan Warna memberi Anda intro ke berbagai algoritma perbedaan ruang warna Lab yang telah ditentukan selama bertahun-tahun. Yang paling sederhana yang hanya memeriksa jarak Euclidian dari dua warna lab, bekerja tetapi memiliki beberapa kekurangan.
Mudahnya ada implementasi Java dari algoritma CIEDE2000 yang lebih canggih dalam proyek OpenIMAJ . Berikan dua set warna Lab Anda dan itu akan memberi Anda nilai jarak tunggal.
sumber
Satu-satunya cara yang "tepat" untuk membandingkan warna adalah melakukannya dengan deltaE di CIELab atau CIELuv.
Tetapi untuk banyak aplikasi saya pikir ini perkiraan yang cukup baik:
distance = 3 * |dR| + 4 * |dG| + 3 * |dB|
Saya pikir jarak manhattan tertimbang jauh lebih masuk akal ketika membandingkan warna. Ingatlah bahwa pemilihan warna hanya ada di kepala kita. Mereka tidak memiliki signifikansi fisik apa pun. CIELab dan CIELuv dimodelkan secara statistik dari persepsi kami tentang warna.
sumber
Agar cepat dan kotor, Anda bisa melakukannya
memanfaatkan pembagian integer untuk mengukur warna.
sumber
Swift 5 Answer
Saya menemukan utas ini karena saya memerlukan versi Swift dari pertanyaan ini. Karena tidak ada yang menjawab dengan solusinya, inilah milik saya:
Pemakaian:
Saya menetapkan kurang dari 10% perbedaan untuk mengembalikan warna yang serupa, tetapi Anda dapat menyesuaikan sendiri.
sumber
Android untuk ColorUtils API RGBToHSL: Saya punya dua warna argb int (color1, color2) dan saya ingin mendapatkan jarak / perbedaan di antara dua warna. Inilah yang saya lakukan;
Kemudian saya menggunakan kode di bawah ini untuk menemukan jarak antara dua warna.
sumber