Pracuję w projekcie, w którym frędzle są rzutowane na obiekt i robione jest zdjęcie. Zadanie polega na znalezieniu linii środkowych obrzeży, które matematycznie przedstawiają krzywą 3D przecięcia płaszczyzny obrzeża z powierzchnią przedmiotu.
Zdjęcie jest w formacie PNG (RGB), a poprzednie próby wykorzystywały skalę szarości, a następnie próg różnicy, aby uzyskać czarno-białą „podobną do zebry” fotografię, z której łatwo było znaleźć punkt środkowy każdej kolumny pikselowej każdej grzywki. Problem polega na tym, że poprzez progowanie, a także przez przyjęcie średniej wysokości kolumny z dyskretnymi pikselami, mamy pewną utratę precyzji i kwantyzację, co wcale nie jest pożądane.
Mam wrażenie, patrząc na obrazy, że linie środkowe mogłyby być bardziej ciągłe (więcej punktów) i gładsze (nie skwantyzowane), gdyby zostały wykryte bezpośrednio z obrazu bez progów (RGB lub skali szarości) za pomocą jakiejś statystycznej metody zamiatania (trochę powodzi / iteracyjnego splotu, cokolwiek).
Poniżej znajduje się rzeczywisty przykładowy obraz:
Wszelkie sugestie będą mile widziane!
źródło
Odpowiedzi:
Proponuję następujące kroki:
x
znajdź ważony środek (według intensywności pikseli) wy
kierunku.y
wartości, aby usunąć szum.(x,y)
punkty, dopasowując jakąś krzywą. Ten artykuł może ci pomóc. Można również dopasować wielomian wysokiego poziomu, choć moim zdaniem jest gorzej.Oto kod Matlaba, który pokazuje kroki 1,2 i 4. Pominąłem automatyczny wybór progu. Zamiast tego wybrałem manual
th=40
:Oto krzywe, które można znaleźć, znajdując średnią ważoną na kolumnę:
Oto krzywe po dopasowaniu wielomianu:
Oto kod:
źródło
double
. Jeśli chodzi o wyniki w dolnej połowie, muszę sprawdzić, może to być błąd oprogramowaniaNie użyłbym obrazu RGB. Kolorowe obrazy są zwykle tworzone przez umieszczenie „filtra Bayera” na matrycy aparatu, co zwykle zmniejsza rozdzielczość, którą można uzyskać.
Jeśli używasz obrazu w skali szarości, myślę, że opisane kroki (binarizacja obrazu zebry, znajdowanie linii środkowej) są dobrym początkiem. Jako ostatni krok zrobiłbym to
źródło
Oto jeszcze alternatywne rozwiązanie problemu, modelując pytanie jako „problem optymalizacji ścieżki”. Chociaż jest to bardziej skomplikowane niż proste rozwiązanie do binaryzacji, a następnie dopasowania krzywej, w praktyce jest bardziej niezawodne.
Z bardzo wysokiego poziomu powinniśmy rozważyć ten obraz jako wykres, gdzie
każdy piksel obrazu jest węzłem na tym wykresie
każdy węzeł jest połączony z niektórymi innymi węzłami, znanymi jako sąsiedzi, a ta definicja połączenia jest często nazywana topologią tego wykresu.
każdy węzeł ma wagę (cechę, koszt, energię lub jakkolwiek chcesz to nazwać), odzwierciedlając prawdopodobieństwo, że ten węzeł znajduje się w optymalnej linii centralnej, której szukamy.
Tak długo, jak możemy modelować to prawdopodobieństwo, problem znalezienia „linii środkowych obrzeży” staje się problemem, aby znaleźć lokalne optymalne ścieżki na wykresie , które można skutecznie rozwiązać za pomocą programowania dynamicznego, np. Algorytmu Viterbi.
Oto niektóre zalety przyjęcia tego podejścia:
wszystkie wyniki będą ciągłe (w przeciwieństwie do metody progowej, która może rozbić jedną linię środkową na kawałki)
dużo swobody w tworzeniu takiego wykresu, możesz wybrać różne funkcje i topologię wykresu.
Twoje wyniki są optymalne w sensie optymalizacji ścieżek
Twoje rozwiązanie będzie bardziej odporne na zakłócenia, ponieważ dopóki szum jest równomiernie rozłożony na wszystkie piksele, te optymalne ścieżki pozostają stabilne.
Oto krótka prezentacja powyższego pomysłu. Ponieważ nie używam żadnej wcześniejszej wiedzy do określania możliwych węzłów początkowych i końcowych, po prostu dekoduję wrt każdy możliwy węzeł początkowy.
W przypadku rozmytych zakończeń jest to spowodowane tym, że szukamy optymalnych ścieżek dla każdego możliwego węzła końcowego. W rezultacie, chociaż dla niektórych węzłów znajdujących się w ciemnych obszarach, podświetlona ścieżka jest nadal lokalnie optymalna.
W przypadku rozmytej ścieżki można ją wygładzić po jej znalezieniu lub użyć wygładzonych funkcji zamiast surowej intensywności.
Możliwe jest przywrócenie ścieżek częściowych poprzez zmianę węzłów początkowych i końcowych.
Przycinanie tych niepożądanych lokalnych ścieżek optymalnych nie będzie trudne. Ponieważ mamy prawdopodobieństwo wszystkich ścieżek po dekodowaniu viterbi i możesz skorzystać z różnych wcześniejszych informacji (np. Widzimy, że prawdą jest, że potrzebujemy tylko jednej optymalnej ścieżki dla osób współużytkujących to samo źródło).
Aby uzyskać więcej informacji, możesz odwołać się do artykułu.
Oto krótki fragment kodu python używanego do wykonania powyższego wykresu.
źródło
Pomyślałem, że powinienem opublikować swoją odpowiedź, ponieważ różni się ona nieco od innych podejść. Próbowałem tego w Matlabie.
Jedną wadą, którą widzę tutaj, jest to, że to podejście nie będzie działać dobrze w przypadku niektórych orientacji pasków. W takim przypadku musimy poprawić jego orientację i zastosować tę procedurę.
Oto kod Matlab:
Na przykład, jeśli weźmiesz środkową kolumnę obrazu, jego profil powinien wyglądać następująco: (na niebiesko jest profil. Na zielono są lokalne maksima)
Obraz zawierający lokalne maksima dla wszystkich kolumn wygląda następująco:
Oto połączone komponenty (chociaż niektóre paski są zepsute, większość z nich ma ciągły region):
źródło