Apa cara paling akurat untuk menentukan warna objek?

33

Saya telah menulis program komputer yang dapat mendeteksi koin dalam gambar statis (.jpeg, .png, dll.) Menggunakan beberapa teknik standar untuk penglihatan komputer (Gaussian Blur, thresholding, Hough-Transform dll.). Dengan menggunakan rasio koin yang diambil dari gambar yang diberikan, saya dapat menetapkan dengan pasti koin mana yang mana. Namun, saya ingin menambah tingkat kepercayaan saya dan juga menentukan apakah koin yang saya simpulkan memiliki tipe-A (dari rasio radius) juga dari colo [u] r yang benar. Masalahnya adalah bahwa untuk koin Inggris et al. (tembaga, perak, emas), warna masing-masing (khususnya tembaga ke emas) sangat mirip.

Saya memiliki rutinitas yang mengekstraksi warna rata-rata dari koin yang diberikan dalam istilah 'ruang warna' RedGreenBlue (RGB) dan rutin untuk mengubah warna ini menjadi 'ruang-warna HueSaturationBrightness (HSB atau HSV)'.

RGB tidak terlalu bagus untuk digunakan dalam upaya membedakan antara tiga warna koin (lihat gambar [dasar] yang terlampir sebagai contoh). Saya memiliki rentang dan nilai tipikal berikut untuk warna dari berbagai jenis koin:

Catatan: nilai khas di sini adalah nilai yang dipilih menggunakan rata-rata 'piksel-bijaksana' dari gambar nyata.

**Copper RGB/HSB:** typicalRGB = (153, 117, 89)/(26, 0.42, 0.60).

**Silver RGB/HSB:** typicalRGB = (174, 176, 180)/(220, 0.03, 0.71).

**Gold RGB/HSB:** typicalRGB = (220, 205, 160)/(45, 0.27, 0.86) 

Saya pertama kali mencoba menggunakan 'jarak Euclidian' antara warna koin rata-rata yang diberikan (menggunakan RGB) dan nilai-nilai khas untuk setiap jenis koin yang diberikan di atas yang memperlakukan nilai RGB sebagai vektor; untuk tembaga kita akan memiliki:

Dcopper=((RtypeRcopper)2+(GtypeGcopper)2+(BtypeBcopper)2)

di mana nilai terkecil dari selisih ( D ) akan memberi tahu kami jenis koin mana yang paling mungkin. Metode ini menunjukkan dirinya sangat tidak akurat.

Saya juga mencoba membandingkan rona koin dengan nilai tipikal dari tipe yang disediakan di atas. Meskipun secara teoritis ini memberikan 'ruang warna' yang jauh lebih baik untuk menangani berbagai tingkat kecerahan dan saturasi gambar, juga tidak cukup akurat.

Pertanyaan: Apa metode terbaik untuk menentukan jenis koin berdasarkan warna (dari gambar statis)?

Terima kasih banyak atas waktu Anda.

Warna Koin Khas

Edit 1

Catatan: Saya telah mencoba semua ide yang dibahas di bawah dan hampir tidak berhasil. Perbedaan dalam kondisi pencahayaan (bahkan di dalam gambar yang sama) membuat masalah ini sangat sulit dan harus dipertimbangkan.

Edit 2 (Ringkasan Hasil)

Terima kasih atas jawaban anda Penelitian lebih lanjut saya sendiri (termasuk jawaban dan komentar Anda) telah menyoroti betapa sulitnya masalah ini untuk ditangani dalam kasus generik pencahayaan sewenang-wenang, kamera sewenang-wenang (perangkat seluler), fluktuasi warna koin (bahkan untuk spesies / jenis yang sama) dll. Saya pertama kali melihat pengenalan warna kulit (bidang penelitian yang sangat aktif) sebagai titik awal dan masih ada banyak masalah bahkan dengan pengenalan warna kulit untuk orang Kaukasia saja (lihat makalah ini untuk tinjauan teknik saat ini), dan fakta bahwa masalah ini mengandung tiga objek warna berbeda yang kesemuanya dapat memiliki chromacities kontinu dan bervariasi membuat topik visi komputer ini menjadi sangat sulit untuk diklasifikasi dan ditangani secara sesuai (sebenarnya Anda dapat melakukan Ph.D. !).

Saya melihat ke Metode Kendala Gamut dari posting yang sangat membantu oleh DW di bawah ini. Ini pada pandangan pertama sangat menjanjikan sebagai langkah pra-pemrosesan untuk mengubah gambar dan objek koin terpisah menjadi warna yang tidak tergantung pada kondisi pencahayaan. Namun, bahkan teknik ini tidak bekerja dengan sempurna (dan melibatkan perpustakaan gambar / histogram untuk pemetaan - yang saya tidak ingin masuki) dan juga tidak metodologi metodologi Neural Network Architecture yang jauh lebih kompleks. Bahkan makalah ini menyatakan secara abstrak bahwa:

"current machine colour constancy algorithms are not good enough for colour-based 
 object recognition.".

Itu bukan untuk mengatakan bahwa tidak ada lebih banyak makalah terkini tentang hal ini di luar sana, tetapi saya tidak dapat menemukan mereka dan tampaknya tidak menjadi area penelitian yang sangat aktif saat ini.

The jawabannya oleh AVB juga membantu dan saya telah melihat ke L A B * sebentar.

"The nonlinear relations for L*, a*, and b* are intended to mimic the nonlinear
response of the eye. Furthermore, uniform changes of components in the L*a*b* colour
space aim to correspond to uniform changes in perceived colour, so the relative 
perceptual differences between any two colours in L*a*b* can be approximated by 
treating each colour as a point in a three dimensional space."

Dari apa yang telah saya baca, transformasi ke ruang warna ini untuk gambar yang tergantung pada perangkat saya akan menjadi rumit - tetapi saya akan membahasnya secara terperinci (dengan maksud untuk semacam implementasi) ketika saya memiliki sedikit waktu lebih banyak.

Saya tidak menahan napas untuk solusi konkret untuk masalah ini dan setelah upaya dengan L A B * saya akan mengabaikan warna koin dan mencari untuk memastikan algoritma deteksi geometrik saya saat ini (Elliptic Hough Transform akurat dll.).

Terima kasih semuanya. Dan sebagai catatan akhir untuk pertanyaan ini, berikut adalah gambar yang sama dengan algoritma pendeteksian geometrik baru, yang tidak memiliki pengenalan warna:

masukkan deskripsi gambar di sini

Ksatria bulan
sumber
1
Apakah gambar akan selalu memiliki latar belakang warna yang sama? Atau bisakah Anda memasukkan beberapa objek 'warna standar' lainnya ke dalam gambar? Jika demikian, Anda memiliki cara menyesuaikan untuk berbagai pencahayaan. Jika tidak, bisa jadi sulit ..
onestop
2
Ini bukan hanya berwarna terang. Saya cukup yakin bahwa sinar matahari, cahaya neon, dan cahaya pijar memiliki warna yang cukup berbeda untuk mengacaukan pencocokan warna HSB, meskipun mata kita entah bagaimana menyesuaikan diri sehingga kita tidak melihat hal-hal berubah warna.
Peter Shor
2
(+1) Pertanyaannya menarik dan menantang. Saya merasa perlu perbaikan untuk mendapat peluang bagus di jawaban yang bagus. Seperti yang dinyatakan saat ini berbatasan dengan posisi yang salah. Untuk solusi praktis, Anda perlu memberikan beberapa rincian lebih lanjut tentang berbagai lingkungan di mana Anda ingin dapat melakukan klasifikasi ini. Latar belakang warna apa yang mungkin? Selalu jumlah koin yang sama? Apakah Anda akan selalu memiliki gambar berwarna? Pencahayaan ambient yang bagus? Mengetahui karakteristik semacam ini dapat memberikan panduan menuju solusi.
kardinal
2
Saya pikir masalah yang Anda hadapi adalah "keteguhan warna", istilah pencarian lainnya adalah "mendiskon penerang" atau "mendiskontokan latar". Ini adalah masalah yang belum terpecahkan dalam ilmu visi.
caracal
1
Seandainya saya bisa memberi +1 lagi untuk tindak lanjut yang bagus! Hal yang sangat menarik.
Matt Parker

Jawaban:

6

Dua hal, sebagai permulaan.

Satu, pasti tidak bekerja di RGB. Default Anda adalah ruang warna Lab (alias CIE L * a * b *). Buang L. Dari gambar Anda sepertinya akoordinat memberi Anda informasi paling banyak, tetapi Anda mungkin harus melakukan analisis komponen utamaa dan bdan bekerja di sepanjang komponen pertama (paling penting), hanya untuk menjaga hal-hal sederhana. Jika ini tidak berhasil, Anda dapat mencoba beralih ke model 2D.

Hanya untuk mendapatkan perasaan untuk itu, masuk a tiga koin kekuningan memiliki STD di bawah 6, dan sarana 137 ("emas"), 154, dan 162 - harus dibedakan.

Kedua, masalah pencahayaan. Di sini Anda harus hati-hati mendefinisikan masalah Anda. Jika Anda ingin membedakan warna dekat di bawah pencahayaan apa pun dan dalam konteks apa pun - Anda tidak bisa, tidak seperti ini. Jika Anda hanya khawatir dengan variasi kecerahan lokal, Lab sebagian besar akan menangani ini. Jika Anda ingin dapat bekerja di bawah cahaya siang dan lampu pijar, dapatkah Anda memastikan latar belakang putih yang seragam, seperti pada contoh gambar Anda? Secara umum, bagaimana kondisi pencahayaan Anda?

Selain itu, gambar Anda diambil dengan kamera yang cukup murah. Ini mungkin memiliki semacam fitur white balance otomatis, yang mengacaukan warna yang sangat buruk - matikan jika Anda bisa. Ini juga terlihat seperti gambar dikodekan dalam YCbCr di beberapa titik (sering terjadi jika itu adalah kamera video) atau dalam varian JPG yang serupa; informasi warna sangat tidak tersampel. Dalam kasus Anda itu mungkin benar-benar baik - itu berarti kamera telah melakukan denoising untuk Anda di saluran warna. Di sisi lain, itu mungkin berarti bahwa di beberapa titik informasi warna juga dikuantifikasi lebih kuat dari kecerahan - itu tidak begitu baik. Hal utama di sini adalah - masalah kamera, dan apa yang Anda lakukan harus bergantung pada kamera yang akan Anda gunakan.

Jika ada yang tidak masuk akal di sini - tinggalkan komentar.

AVB
sumber
Terima kasih atas jawaban anda. Saya tidak dapat memastikan hal di atas. Ini untuk aplikasi seluler yang menghitung koin (jumlah koin sewenang-wenang) hanya dengan mengklik tombol (dan sangat cepat!). Jadi, pencahayaan bisa sangat bervariasi dan tidak ada latar belakang yang konsisten juga. Saya percaya bahwa mengklasifikasikan jenis koin melalui warna dengan cara ini (seperti yang Anda tunjukkan) tidak dimungkinkan. Namun, saya suka Anda menjawab menggunakan L A B * dan percaya itu jawaban terbaik yang ditawarkan. Sehubungan dengan ini, Anda memiliki jawaban dan karunia. Terima kasih lagi.
MoonKnight
6

Dengan semangat bertukar pikiran, saya akan membagikan beberapa ide yang dapat Anda coba:

  1. Coba Hue lebih banyak? Sepertinya Hue memberi Anda pembeda yang cukup baik antara perak dan tembaga / emas, meskipun tidak antara tembaga dan emas, setidaknya dalam satu contoh yang Anda tunjukkan di sini. Sudahkah Anda memeriksa menggunakan Hue secara lebih rinci, untuk melihat apakah mungkin fitur yang layak untuk membedakan perak dari tembaga / emas?

    Saya mungkin mulai dengan mengumpulkan banyak contoh gambar, yang telah Anda beri label secara manual, dan menghitung Hue masing-masing koin di setiap gambar. Maka Anda mungkin mencoba histogram mereka, untuk melihat apakah Hue terlihat seperti cara yang masuk akal untuk melakukan diskriminasi. Saya mungkin juga mencoba melihat Hue rata-rata setiap koin, untuk beberapa contoh seperti yang Anda sajikan di sini. Anda juga dapat mencoba Saturation, karena sepertinya itu juga bisa membantu.

    Jika ini gagal, Anda mungkin ingin mengedit pertanyaan Anda untuk menunjukkan apa yang telah Anda coba dan memberikan beberapa contoh untuk menggambarkan secara singkat mengapa ini sulit atau di mana ia gagal.

  2. Ruang warna lain? Demikian pula, Anda dapat mencoba mengubah ke rg chromacity dan kemudian bereksperimen untuk melihat apakah hasilnya membantu membedakan perak dari tembaga / emas. Ada kemungkinan bahwa hal ini dapat membantu menyesuaikan variasi iluminasi, sehingga dapat dicoba.

  3. nnn

    npnnonp,oToT(p)oiT(pi)TT(x)=x+c(mod360)c

  4. CRRC

    CθRθRθC(x,y)D(x,y)=Rθ(x,y)C(x,y)RθCL2(x,y)D(x,y)2θ0.25θ

    L2L2RC

    Untuk ketahanan, Anda mungkin memiliki beberapa gambar referensi berbeda untuk setiap koin (pada kenyataannya, setiap sisi dari setiap koin), dan coba semua gambar referensi untuk menemukan yang paling cocok.

    CR

  5. ff(r)rfCCfRR

    fg(r)=f(r)μμgCgR

    f

    fC

    CCf

  6. Lihatlah algoritma penglihatan untuk keteguhan warna. Komunitas penglihatan komputer telah mempelajari kekonstanan warna , masalah mengoreksi sumber penerangan yang tidak diketahui; lihat, misalnya, ikhtisar ini . Anda dapat menjelajahi beberapa algoritme yang diturunkan untuk masalah ini; mereka mencoba untuk menyimpulkan sumber iluminasi dan kemudian memperbaikinya, untuk mendapatkan gambar yang akan Anda peroleh seandainya gambar diambil dengan sumber iluminasi referensi.

  7. CRC

Saya tidak tahu apakah semua ini memiliki peluang untuk bekerja, tetapi mereka adalah beberapa ide yang dapat Anda coba.

DW
sumber
3

Masalah menarik dan kerja bagus.

Coba gunakan nilai warna median daripada rata-rata. Ini akan lebih kuat terhadap nilai outlier karena kecerahan dan saturasi. Coba gunakan hanya satu dari komponen RGB, bukan ketiganya. Pilih komponen yang paling membedakan warna. Anda dapat mencoba memplot histogram dari nilai-nilai piksel (misalnya salah satu komponen RGB) untuk memberi Anda gambaran tentang sifat-sifat distribusi piksel. Ini mungkin menyarankan solusi yang tidak segera jelas. Cobalah memplot komponen RGB dalam ruang 3D untuk melihat apakah mereka mengikuti pola apa pun, misalnya mereka mungkin terletak dekat dengan garis yang menunjukkan bahwa kombinasi linear dari komponen RGB mungkin merupakan pengklasifikasi yang lebih baik daripada yang individual.

martino
sumber
Teriakan yang bagus dengan median, sebenarnya saya juga mengkodekan ini dan ini juga buruk dalam hal membangun warna yang benar. Dengan pendekatan histogram, saya sadar akan biaya komputasi; segera setelah saya memulai perulangan piksel dalam 2D, saya akan dikenai biaya! Bagaimanapun, mungkin ada baiknya saya memasukkan sesuatu seperti ini (seperti yang Anda tunjukkan) untuk membangun korelasi. Saya menghasilkan semua jenis plot untuk komponen RGB dan karena kondisi pencahayaan yang berbeda-beda (akibat mengambil gambar di lokasi yang berbeda) nilai-nilai RGB dapat tumpang tindih berat untuk ketiga jenis koin.
MoonKnight
Saya juga telah melihat pas model untuk memperkirakan probabilitas posterior dari titik ruang warna milik jenis koin tertentu. Saya juga telah melihat pemodelan campuran Gaussian, tetapi saya belum terlalu jauh dengan ini. Saya juga telah diberitahu tentang pendekatan lain (agak sewenang-wenang, tetapi lebih sederhana), dan itu adalah menggunakan sesuatu seperti interpolasi tetangga-tetangga terdekat. Terima kasih atas waktunya.
MoonKnight
1
Pada jalur yang sama sekali berbeda, perbedaan lain antara koin adalah desain di bagian depan / belakang (meskipun beberapa mungkin memiliki desain yang sama di satu sisi) Bagaimana dengan korelasi silang set pola desain dengan piksel koin (atau menggunakan informasi timbal balik) untuk membantu menentukan koin yang Anda lihat. Dengan kombinasi rasio, warna piksel, dan kecocokan desain ini, Anda mungkin dapat mengurangi tingkat penemuan yang salah.
martino
Saya telah memikirkan hal ini - tetapi ini meminta terlalu banyak perangkat lunak pengenalan saat ini dan akan menjadi pekerjaan besar untuk menulis dari awal (OCR ??). Juga ada variasi besar dalam grafik pada koin-koin tersebut yang membuat implementasi seperti itu menjadi mimpi buruk yang berkelanjutan. Saya akan bermain nanti - saya akan melaporkan apa yang saya temukan. Terima kasih lagi.
MoonKnight
Mengapa downvote? Jika ada masalah dengan jawabannya, akan sangat membantu untuk menunjukkannya - saya tidak bisa melihatnya
martino