phát hiện da hsb cơ bản, chiếu sáng neon


14

tôi hy vọng đây là nơi thích hợp để hỏi Mặt khác, xin lỗi vì sai lầm của tôi và Pleace tư vấn cho tôi một trang web tốt hơn.

Tôi đang cố gắng thực hiện một trình phát hiện da siêu đơn giản bằng cách sử dụng một số hình ảnh hsb. Tôi đang sử dụng phương pháp được mô tả ở đâyở đây .

Tôi đang cố gắng sử dụng một nguồn video từ webcam của tôi. Nếu tôi sử dụng ánh sáng mặt trời, nó hoạt động khá tốt (không tốt lắm nhưng khá tốt), nhưng với ánh sáng neon .. thì thật là bừa bộn. rất nhiều vùng trắng được phát hiện và rất nhiều tiếng ồn ở khắp mọi nơi.

tại sao?

Tôi đang sử dụng thuật toán được mô tả trong nguồn thứ hai :

  1. chuyển đổi hình ảnh ho HSV không gian màu
  2. Đặt màu trắng trong phạm vi 0 <H <38
  3. lọc bộ lọc
  4. bộ lọc ăn mòn
  5. bộ lọc mờ

nhập mô tả hình ảnh ở đây

Câu trả lời:


10

Điều này thực sự có thể hoạt động tốt hơn bằng cách sử dụng một mô hình thế hệ đơn giản trong RGB thay vì HSV.

  1. Nhận một hình ảnh đào tạo hoặc một số hình ảnh đào tạo với một số da.
  2. Chọn thủ công các pixel da (ví dụ: bằng cách tạo mặt nạ nhị phân)
  3. Tính toán trung bình và hiệp phương sai của tông màu da trong RGB (mỗi nên là các vectơ 3 phần tử)
  4. Đối với một pixel không xác định, tính khoảng cách Mahalanobis của nó với giá trị trung bình, sử dụng hiệp phương sai.
  5. Phân loại nó như da nếu khoảng cách nhỏ hơn một ngưỡng.
  6. Điều chỉnh ngưỡng cho hiệu suất tốt nhất.

nnPmmmPQQC= =Q'QC

Edit2: Các giá trị bạn nhận được dường như quá lớn. Để có được hiệp phương sai tối đa, hãy tạo ma trận sau:

255 255 255
 0   0   0

và tính hiệp phương sai của điều đó. Bạn sẽ nhận được một ma trận trong đó mọi giá trị xấp xỉ 32513. Vì vậy, hãy đảm bảo rằng các giá trị pixel của bạn nằm trong khoảng từ 0 đến 255 và đảm bảo bạn sao chép chúng thành các số float hoặc nhân đôi chính xác. Khoảng cách Mahalanobis tính theo đơn vị phương sai, do đó, các số này phải nhỏ. Ngưỡng phân loại da của bạn có lẽ nên dưới 4.


Tôi có vấn đề trong việc hiểu làm thế nào để có được ma trận hiệp phương sai 3x3 với opencv từ một hình ảnh .. bạn có thể cho tôi một số tài liệu tham khảo?
nkint

@nkint, vui lòng xem câu trả lời đã được chỉnh sửa.
Dima

Tuyệt. trong 5 dòng bạn làm cho tôi hiểu hiệp phương sai là gì. cảm ơn. nó hoạt động nhưng tôi có vấn đề trong việc lưu trữ kết quả. Nếu tôi có pixel từ 0-255 thì loại số nào tôi phải mong đợi về khoảng cách Mahalanobis? nếu tôi lưu trữ chúng trong 8 giờ thì chỉ mất một phần da, nếu tôi lưu trữ chúng trong 32 phao tôi sẽ có tiếng ồn trắng lạ
nkint

vâng tôi nghĩ rằng tôi đang làm gì đó sai bởi vì ma trận hiệp phương sai của tôi là: [10913058.00000000, 7046611.50000000, 3290781.50000000; 7046611.50000000, 4811646.00000000, 2225078.00000000; 3290781.50000000, 2225078.00000000, 1387631.87500000]
nkint

1
Bạn có thể nghĩ về hiệp phương sai khi xác định một ellipsoid trong 3D. Bạn có thể hình dung nó trong Matlab, nhưng đó có thể là rất nhiều công việc. Ngoài ra, bạn có thể thử xem các hình chiếu 2D của ellipsoid, nhưng điều đó cũng sẽ mất một số công việc.
Dima

4

Hãy tính đến các giá trị khác nhau thu được bằng màu HSV khi ánh sáng neon được áp dụng: một ví dụ về độ lệch của nó ở đây . Hãy thử điều chỉnh thuật toán của bạn để nó thích ứng với các giá trị này.

Ở đây có một thuật toán khác để phát hiện da và để phát hiện các điều kiện ánh sáng, bạn có thể sử dụng thuật toán này .

Một thuật toán khác, liên quan đến phát hiện da, nhưng không liên quan quá nhiều đến hiệu ứng ánh sáng neon, là thuật toán này .


2

Các câu trả lời bạn đã nhận được cho đến nay chỉ ra các phương pháp thay thế tốt, nhưng nếu bạn quan tâm đến việc sử dụng một cái gì đó như thuật toán ban đầu của mình, có lẽ không khó để sửa. Bạn chỉ cần điều chỉnh cho các đặc thù HSV của OpenCV. Đưa ra kết quả kỳ quặc, tôi cho rằng có lẽ bạn đã sử dụng một trong những biểu diễn số phổ biến hơn của HSV trong việc chọn ngưỡng và / hoặc trong việc chuyển đổi pixel?

OpenCV đại diện cho HSV khác với hầu hết các nguồn khác mà bạn có thể đã tìm thấy:

  • Sự khác biệt lớn nhất đối với bạn sẽ là w / r / t hue: OpenCV đại diện cho màu sắc từ 0 đến 179, khi hầu hết mọi thứ khác đều tận dụng bit treo để lưu giữ nhiều thông tin hơn, w / 0-255.
  • Sự khác biệt khác: đo độ bão hòa được đảo ngược so với định mức. Vì vậy, độ bão hòa 255 có nghĩa là sáng trong opencv, thay vì màu trắng (thông báo, chúng tôi trở lại 255 - chỉ có màu sắc là 0-180, có lẽ vì đại diện của 'bánh xe'?)

Có lẽ đã quá muộn để giúp bạn, nhưng đó là một câu hỏi thú vị và ai đó có thể gặp phải vấn đề tương tự.


-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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.