2013-07-26 12 views
5

Próbuję użyć OpenCV, a dokładniej jego HoughCircles, aby wykryć i zmierzyć źrenicę i tęczówkę, aktualnie gram z niektórymi zmiennymi w funkcji, ponieważ albo zwraca 0 kółek, albo nadmierną ilość. Poniżej znajduje się kod i obraz testowy, którego używam.Używanie HoughCircles do wykrywania i mierzenia źrenicy i tęczówki

Kod tęczówki pomiarowych:

eye1 = [self increaseIn:eye1 Contrast:2 andBrightness:0]; 

cv::cvtColor(eye1, eye1, CV_RGBA2RGB); 
cv::bilateralFilter(eye1, eye2, 75, 100, 100); 

cv::vector<cv::Vec3f> circles; 

cv::cvtColor(eye2, eye1, CV_RGBA2GRAY); 

cv::morphologyEx(eye1, eye1, 4, cv::getStructuringElement(cv::MORPH_RECT,cv::Size(3, 3))); 
cv::threshold(eye1, eye1, 0, 255, cv::THRESH_OTSU); 

eye1 = [self circleCutOut:eye1 Size:50]; 

cv::GaussianBlur(eye1, eye1, cv::Size(7, 7), 0); 

cv::HoughCircles(eye1, circles, CV_HOUGH_GRADIENT, 2, eye1.rows/4); 

Kodeks ucznia pomiaru:

eye1 = [self increaseBlackPupil:eye1]; 
    cv::Mat eye2 = cv::Mat::zeros(eye1.rows, eye1.cols, CV_8UC3); 

    eye1 = [self increaseIn:eye1 Contrast:2 andBrightness:0]; 

    cv::cvtColor(eye1, eye1, CV_RGBA2RGB); 
    cv::bilateralFilter(eye1, eye2, 75, 100, 100); 

    cv::threshold(eye2, eye1, 25, 255, CV_THRESH_BINARY); 

    cv::SimpleBlobDetector::Params params; 
    params.minDistBetweenBlobs = 75.0f; 
    params.filterByInertia = false; 
    params.filterByConvexity = false; 
    params.filterByCircularity = false; 
    params.filterByArea = true; 
    params.minArea = 50; 
    params.maxArea = 500; 

    cv::Ptr<cv::FeatureDetector> blob_detector = new cv::SimpleBlobDetector(params); 
    blob_detector->create("SimpleBlob"); 
    cv::vector<cv::KeyPoint> keypoints; 
    blob_detector->detect(eye1, keypoints); 

enter image description here

wiem, że obraz jest szorstka, byłem również stara znaleźć sposób na oczyszczenie i sprawienie, by krawędzie były wyraźniejsze.

Moje pytanie brzmi jasno: co mogę zrobić, aby dostosować parametry funkcji HoughCircles lub zmiany w obrazach, aby wykluczyć tęczówkę i źrenicę?

Dzięki

Odpowiedz

2

Ok, bez eksperymentowania zbyt dużo, co rozumiem, jest to, że zastosowaliśmy filtr dwustronnej tylko do obrazu przed użyciem detektora koło Hough.

Moim zdaniem, należy dodać krok progu do procesu.

Wziąłem swój przykładowy obraz, który podałeś w poście i sprawiał, że ulegają następujące kroki:

  1. konwersja do skali szarości

  2. morfologiczne gradientu

  3. obcinanie

  4. Wykrywanie okręgu hough.

po kroku progowania, mam następujący obraz dla lewego oka tylko:

thresholded image

Oto kod:

szarości:

cvCvtColor(im_rgb,im_rgb,CV_RGB2GRAY); 

morfologia :

 cv::morphologyEx(im_rgb,im_rgb,4,cv::getStructuringElement(cv::MORPH_RECT,cv::Size(size,size))); 

obcinanie: wykrywanie koło

cv::threshold(im_rgb, im_rgb, low, high, cv::THRESH_OTSU); 

Hough:

cv::vector<cv::Vec3f> circles; 
    cv::HoughCircles(im_rgb, circles, CV_HOUGH_GRADIENT, 2, im_rgb.rows/4); 

Teraz podczas drukowania:

NSLog(@"Found %ld cirlces", circles.size()); 

uzyskać:

 "Found 1 cirlces" 

Mam nadzieję, że to pomoże.

+0

"im_rgb" to "eye1" w twoim przypadku. – metsburg

+1

dla "rozmiaru" elementu struktury w części morfologicznej, użyłem statycznej wartości 5 dla parametru wielkości. – metsburg

+0

wykonał tę pracę, czy nie? – metsburg

Powiązane problemy