temel hsb cilt tespiti, neon aydınlatma


14

Umarım bu sormak için doğru yer. Aksi takdirde benim hatam ve üzgünüm daha iyi bir site tavsiye için üzgünüm.

Ben hsb görüntü bazı kullanarak süper basit bir cilt dedektörü uygulamaya çalışıyorum. Burada ve burada açıklanan yaklaşımı kullanıyorum .

web kameramdan bir video kaynağı kullanmaya çalışıyorum. güneş aydınlatma kullanırsanız oldukça iyi çalışır (çok iyi değil ama oldukça iyi), ama neon ışığı ile .. bu bir karmaşa. bir sürü beyaz bölge ve her yerde çok gürültü var.

neden?

İkinci kaynakta açıklanan algoritmayı kullanıyorum :

  1. görüntü ho HSV renk alanı dönüştürmek
  2. 0 <H <38 aralığına beyaz koyun
  3. dilate filtre
  4. aşındırma filtresi
  5. bulanıklaştırma filtresi

resim açıklamasını buraya girin

Yanıtlar:


10

Bu aslında HSV yerine RGB'de basit bir üretken model kullanarak daha iyi çalışabilir.

  1. Bir cilt görüntüsü ile bir egzersiz görüntüsü veya birkaç egzersiz görüntüsü alın.
  2. Cilt piksellerini manuel olarak seçin (örn. İkili maske oluşturarak)
  3. Cilt tonunun ortalamasını ve kovaryansını RGB olarak hesaplayın (her biri 3 elemanlı vektör olmalıdır)
  4. Bilinmeyen bir piksel için, kovaryansı kullanarak Mahalanobis değerini ortalamadan hesaplayın.
  5. Mesafe bir eşik değerin altındaysa onu cilt olarak sınıflandırın.
  6. En iyi performans için eşiği ayarlayın.

Düzenleme: OpenCV kovaryans hesaplamak için bir işlevi olup olmadığını bilmiyorum, ama size nasıl kendiniz söyleyebilirim. Diyelim ki RGB pikseliniz var. Onları x 3 matrisine koydunuz , buna diyelim . Sonra sütunların ortalamasını hesaplayarak ortalama RGB vektörü olan hesaplayın . , 1 x 3 vektör olacaktır. Çıkarma her satırdan ve elde edilen matris çağrı . Şimdi kovaryans hesaplamak için tek yapmanız gereken kendi : . 3 x 3 olduğundan emin olun .n P m m m P Q Q C = Q Q CnnPmmmPQQC=QQC

Edit2: Aldığınız değerler çok büyük görünüyor. Maksimum kovaryans elde etmek için aşağıdaki matrisi oluşturun:

255 255 255
 0   0   0

ve bunun kovaryansını hesaplayın. Her değerin yaklaşık 32513 olduğu bir matris almalısınız. Bu nedenle piksel değerlerinizin 0 ila 255 arasında değiştiğinden ve bunları kayan noktalara veya iki katına doğru kopyaladığınızdan emin olun. Mahalanobis mesafesi varyans birimlerindedir, bu nedenle sayılar küçük olmalıdır. Cilt sınıflandırma eşiğiniz muhtemelen 4'ten az olmalıdır.


i nasıl bir görüntüden opencv ile 3x3 kovaryans matris almak anlamakta sorun var .. bana biraz referans verebilir misiniz?
Mart'ta nkint

@nkint, lütfen düzenlenen cevaba bakınız.
Dima

tamam harika. 5 satırda kovaryansın ne olduğunu anlamamı sağladın. Teşekkürler. işe yarıyor. ama sonuçları saklamakta sorun yaşıyorum. 0-255 pikselim varsa, Mahalanobis mesafesini nasıl beklemeliyim? Onları 8-uint'te saklarsam cildin sadece küçük bir kısmını alır, 32-şamandıra içinde saklarsam beyaz gürültü
alırım

evet sanırım yanlış bir şey yapıyorum çünkü kovaryans matrisim: [10913058.00000000, 7046611.50000000, 3290781.50000000; 7046611.50000000, 4811646.00000000, 2225078.00000000; 3290781.50000000, 2225078.00000000, 1387631.87500000]
nkint

1
Kovaryansın üç boyutlu bir elipsoid tanımlaması olduğunu düşünebilirsiniz. Matlab'da görselleştirebilirsiniz, ancak bu muhtemelen çok fazla iş olacaktır. Alternatif olarak, elipsoidin 2D projeksiyonlarına bakmayı deneyebilirsiniz, ancak bu da biraz çalışma gerektirecektir.
Dima

4

Neon ışığı uygulandığında HSV renginde elde edilen farklı değerleri göz önünde bulundurun: sapmasının bir örneği burada . Algoritmanızı bu değerlere uyum sağlayacak şekilde uyarlamayı deneyin.

İşte orada cildi tespit etmek için başka algoritma ve ışık koşulları tespit etmek için kullanabileceğiniz bu bir .

Başka bir algoritma, deri algılama ile ilgili, ancak çok fazla neon ışık etkileri ile ilgili olup, bir bu .


2

Şimdiye kadar aldığınız cevaplar iyi alternatif yöntemlere işaret ediyor, ancak ilk algoritmanız gibi bir şey kullanmak istiyorsanız, muhtemelen düzeltilmesi zor değildir. Sadece OpenCV'nin HSV özelliklerini ayarlamanız gerekir. Tuhaf sonuçlar göz önüne alındığında, muhtemelen eşiklerinizi seçerken ve / veya pikselleri dönüştürürken HSV'nin daha yaygın sayısal gösterimlerinden birini kullandığınızı varsayıyorum?

OpenCV, HSV'yi bulmuş olabileceğiniz diğer kaynakların çoğundan farklı olarak temsil eder:

  • Sizin için en büyük fark w / r / t tonu olacaktır: OpenCV, 0-255 arasındaki neredeyse her şey daha fazla bilgi korumak için asılı bitten yararlandığında 0 ile 179 arasında değişen bir tonu temsil eder.
  • Diğer fark: doygunluk ölçümü norm ile karşılaştırıldığında ters çevrilir. 255 doygunluk opencv'de beyaz yerine parlak anlamına gelir (dikkat, 255'e geri döndük - belki 'tekerlek' temsili nedeniyle sadece renk 0-180'dir?)

Muhtemelen size yardım etmek için çok geç, ama ilginç bir soruydu ve başka biri de aynı sorunla karşılaşabilir.


-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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.