2013-05-09 7 views
5

Mam zdjęcie dłoni wykonane za pomocą atramentu i papieru, który wygląda jak poniżej (a). enter image description here Potrzebuję podświetlić fałdy, zachowując ich szerokość i orientację, patrz rysunek (b). Ink and paper palm print imgeWyróżnij tylko zmarszczki (główne linie i zmarszczki) na zdjęciu dłoni.

Próbowałem używać detektorów krawędzi takich jak Canny, Laplacian i Sobel z różnymi wartościami progowymi, ale nie mogłem wymyślić wyraźnej mapy zagnieceń, jak w (b). Ale gdy wyżej wymienione są detektory krawędzi, wszystkie czarne linie są wykrywane jako krawędzie. Chcę tylko podkreślić grubsze białe linie obrazu (a). Używam OpenCV 2.4.5. Czy ktoś może pomóc? Dziękuję Ci.

Odpowiedz

2

Jest to metoda wymyśliłem:

cv::Mat im; //Already loaded 
cv::Mat grey; 
cv::cvtColor(im, grey, CV_BGR2GRAY); 

cv::Mat binary; 
cv::threshold(grey, binary, 0, 255, cv::THRESH_OTSU); 

//Create a mask of the hand region 
cv::Mat mask; 
cv::Mat kern = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(20,20)); //Large kernel to remove all interior detail 
cv::morphologyEx(binary, mask, cv::MORPH_OPEN, kern); 
cv::threshold(mask, mask, 128, 255, cv::THRESH_BINARY_INV);  //Invert colors 

cv::imshow("", mask); 

//Remove thin lines 
cv::Mat blurred; 
cv::GaussianBlur(grey, blurred, cv::Size(9,9), 0); 
cv::threshold(blurred, binary, 0, 255, cv::THRESH_OTSU); 
cv::morphologyEx(binary, binary, cv::MORPH_OPEN, cv::noArray()); 

cv::Mat result; 
binary.copyTo(result, mask); 

Co daje ten wynik: Palm lines result

Istnieją pewne artefakty na krawędziach z maski, które mogą być naprawione przy użyciu bardziej złożonego metoda maskowania. Rozmiary jądra dla rozmycia i operacji morfologicznych można oczywiście modyfikować dla różnych poziomów szczegółowości.

+0

jak tylko użyję THRESH_OTSU, moja cała ręka stanie się białą maską. – nurettin

+0

@nurettin Sprawdź, na jakim tle znajduje się dłoń. Metoda Otsu jest dość uproszczona i może zostać odrzucona przez tło obrazu. – Aurelius

+0

Izolowałem tylko dłoń na czarnym tle i przekonwertowałem ją na skalę szarości przed użyciem THRESH_OTSU. Teraz próbuję adaptacyjne gaussowskie podejście i uzyskuję znacznie lepsze wyniki. – nurettin

1

Po pierwsze można przekonwertować obraz na format binarny za pomocą progowania.

Następnie można zastosować pewne operacje morfologiczne, takie jak erozja, dzięki czemu cienkie linie mogą być filtrowane, istnieje wbudowana metoda w openCV dla tej operacji.

Wreszcie można użyć jednego z wymienionych czujników krawędzi.