deteksi kulit hsb dasar, iluminasi neon


14

Saya harap ini adalah tempat yang tepat untuk bertanya. selain itu maaf atas kesalahan saya dan mohon saran saya situs yang lebih baik.

Saya mencoba menerapkan detektor kulit super sederhana menggunakan beberapa rentang gambar hsb. Saya menggunakan pendekatan yang dijelaskan di sini dan di sini .

saya mencoba menggunakan sumber video dari webcam saya. jika saya menggunakan penerangan matahari bekerja dengan baik (tidak begitu bagus tapi cukup bagus), tetapi dengan cahaya neon .. itu berantakan. banyak wilayah putih terdeteksi dan banyak kebisingan di mana-mana.

Mengapa?

Saya menggunakan algoritma yang dijelaskan dalam sumber kedua :

  1. konversi gambar dan ruang warna HSV
  2. menempatkan putih pada kisaran 0 <H <38
  3. filter dilatasi
  4. filter mengikis
  5. filter blur

masukkan deskripsi gambar di sini

Jawaban:


10

Ini sebenarnya mungkin bekerja lebih baik menggunakan model generatif sederhana di RGB daripada HSV.

  1. Dapatkan gambar latihan atau beberapa gambar latihan dengan beberapa skin.
  2. Pilih piksel kulit secara manual (mis. Dengan membuat topeng biner)
  3. Hitung rerata dan kovarians dari warna kulit dalam RGB (masing-masing harus berupa vektor 3-elemen)
  4. Untuk piksel yang tidak diketahui, hitung jarak Mahalanobisnya dari rata-rata, menggunakan kovarians.
  5. Klasifikasi sebagai kulit jika jaraknya kurang dari ambang batas.
  6. Sesuaikan ambang batas untuk kinerja terbaik.

nnPmmmPQQC=QQC adalah 3 x 3.

Sunting2: Nilai yang Anda peroleh tampaknya terlalu besar. Untuk mendapatkan kovarians maksimum, buat matriks berikut:

255 255 255
 0   0   0

dan menghitung kovarians dari itu. Anda harus mendapatkan matriks di mana setiap nilai sekitar 32513. Jadi pastikan bahwa nilai piksel Anda berkisar dari 0 hingga 255, dan pastikan Anda menyalinnya ke float atau menggandakan dengan benar. Jarak Mahalanobis adalah dalam unit varians, jadi untuk itu jumlahnya harus kecil. Ambang Anda untuk klasifikasi kulit mungkin harus kurang dari 4.


saya punya masalah dalam memahami bagaimana mendapatkan matriks kovarians 3x3 dengan opencv dari sebuah gambar .. bisakah Anda memberi saya beberapa referensi?
nkint

@ nkint, silakan lihat jawaban yang diedit.
Dima

OK bagus. dalam 5 baris Anda membuat saya mengerti apa itu kovarians. Terima kasih. berhasil. tetapi saya memiliki masalah dalam menyimpan hasil. jika saya memiliki piksel dari 0-255 angka seperti apa yang harus saya harapkan dari jarak Mahalanobis? jika saya menyimpannya dalam 8-uint hanya membutuhkan sedikit bagian kulit, jika saya menyimpannya dalam float 32 saya mendapat derau putih
nkint

ya saya pikir saya melakukan sesuatu yang salah karena matriks kovarians saya adalah: [10913058.00000000, 7046611.50000000, 3290781.50000000; 7046611.50000000, 4811646.00000000, 2225078.00000000; 3290781.50000000, 2225078.00000000, 1387631.87500000]
nkint

1
Anda dapat menganggap kovarians sebagai pendefinisian ellipsoid dalam 3D. Anda mungkin dapat memvisualisasikannya di Matlab, tetapi itu mungkin banyak pekerjaan. Sebagai alternatif, Anda dapat mencoba melihat proyeksi 2D ellipsoid, tetapi itu juga akan membutuhkan beberapa pekerjaan.
Dima

4

Mempertimbangkan nilai-nilai berbeda yang diperoleh dalam warna HSV ketika lampu neon diterapkan: contoh deviasinya ada di sini . Coba adaptasikan algoritme Anda agar dapat beradaptasi dengan nilai-nilai ini.

Di sini ada algoritma lain untuk mendeteksi kulit, dan untuk mendeteksi kondisi cahaya Anda bisa menggunakan yang ini .

Algoritma lain, terkait dengan deteksi kulit, tetapi tidak terlalu banyak terkait dengan efek cahaya neon, adalah yang ini .


2

Jawaban yang Anda dapatkan sejauh ini mengarah ke metode alternatif yang baik, tetapi jika Anda tertarik untuk menggunakan sesuatu seperti algoritma awal Anda, itu mungkin tidak sulit untuk diperbaiki. Anda hanya perlu menyesuaikan kekhasan HSV OpenCV. Mengingat hasil yang aneh, saya berasumsi Anda mungkin menggunakan salah satu representasi numerik yang lebih umum dari HSV dalam memilih ambang dan / atau dalam mengkonversi piksel?

OpenCV mewakili HSV secara berbeda dari kebanyakan sumber lain yang mungkin Anda temukan:

  • Perbedaan terbesar untuk Anda adalah w / r / t hue: OpenCV mewakili rona mulai dari 0 hingga 179, ketika hampir semua hal lain memanfaatkan bit gantung untuk menyimpan lebih banyak informasi, w / 0-255.
  • Perbedaan lainnya: pengukuran saturasi terbalik dibandingkan dengan norma. Jadi 255 saturation berarti cerah dalam opencv, bukan putih (perhatikan, kita kembali ke 255 - hanya rona 0-180, mungkin karena representasi 'roda'?)

Mungkin sudah terlambat untuk membantu Anda, tetapi itu adalah pertanyaan yang menarik, dan orang lain mungkin mengalami masalah yang sama.


-1
import sys
import numpy
import cv2

cap = cv2.VideoCapture(0)
while(1):
    _, im = cap.read()

    im_ycrcb = cv2.cvtColor(im, cv2.COLOR_BGR2YCR_CB)

    skin_ycrcb_mint = numpy.array((0, 133, 77))
    skin_ycrcb_maxt = numpy.array((255, 173, 127))
    skin_ycrcb = cv2.inRange(im_ycrcb, skin_ycrcb_mint, skin_ycrcb_maxt)

    cv2.imshow("Second Image", skin_ycrcb) # Second image
    contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, 
        cv2.CHAIN_APPROX_SIMPLE)
    for i, c in enumerate(contours):
        area = cv2.contourArea(c)
            if area > 1000:
                cv2.drawContours(im, contours, i, (255, 0, 0), 3)
    cv2.imshow("Final Image", im)         # Final image
    cv2.waitKey(1)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.