Solidne śledzenie plam

Mam problem z ekstrakcją funkcji obrazu. Obrazy wejściowe są binarne (czarno-białe) i mogą zawierać plamy o w przybliżeniu znanym obszarze i współczynniku proporcji. Muszą być dopasowane do elips przy użyciu algorytmu najlepszego dopasowania.

Przykładowe dane wejściowe:

Pożądane wyjście:

Może być wiele plam (zero lub więcej), liczba nie jest znana z góry. Znany jest przybliżony obszar i współczynnik kształtu wszystkich plam (i jest taki sam). Ile jest na obrazie, ich położenie, orientacja i rzeczywisty rozmiar są tym, co próbuję znaleźć. Wyjście powinno być najlepiej dopasowaną elipsą dla każdej kropli na podstawie rzeczywistego znalezionego rozmiaru i współczynnika proporcji.

To, co sprawia, że ​​jest to trudne, to hałas i możliwe nakładanie się.

Przykład z hałasem:

Przykład z nakładaniem się i szumem:

Zakłócony obraz może mieć dziury w plamach, a także małe inne plamki rozproszone wokół. Małe inne plamy nie są liczone, ponieważ są zbyt małe i nie pokrywają wystarczająco gęsto obszaru, aby można je było uznać za prawdziwy mecz.

Obraz z zakładką należy policzyć jako dwie kropelki, ponieważ obszar jest zbyt duży, aby pojedyncza kropla mogła go dobrze zakryć.

Możliwą metryką, która ocenia potencjalne dopasowanie, jest:

suma wszystkich elips (K1 * procent odchylenia od oczekiwanego rozmiaru + K2 * procent odchylenia od oczekiwanego współczynnika proporcji + K3 * procent elipsy, która nie jest czarna + K4 * procent pokryta dowolną inną elipsą) + K5 * procent reszty obrazu który jest czarny

dla niektórych odpowiednio wybranych parametrów K1..K5. Doskonały wynik meczu 0.

Widzę, jak rozwiązać ten problem za pomocą brutalnej siły, na przykład próbując wystarczająco różnych możliwych dopasowań, aby dobrze wypróbować przestrzeń wyszukiwania. Nie mogę myśleć o metodzie znacznie szybciej niż brutalna siła.

Wolałbym przykłady w python i / lub opencv. Spróbuję wdrożyć i opublikować wszelkie sugerowane rozwiązania w Pythonie. Dzięki!

P.S. Nie można założyć, że blob jest podłączony. Może być dość hałasu, aby rozbić go na nieciągłe części.

P.P.S. Małych kawałków szumu nie można usunąć przez erozję binarną. W niektórych moich obrazach jest wystarczająco dużo wewnętrznych dziur, że erozja powoduje, że cała (prawdziwa) kropla znika, jeśli obraz jest na tyle erodowany, że bity szumu również zanikają.

P.P.P.S. Myślę, że byłoby to bardzo trudne do rozwiązania za pomocą jakiegokolwiek podejścia opartego na konturach. Dane, które widzę w praktyce, mają za dużo szumu brzegowego, mogą istnieć (i często są) bity szumu, które łączą oddzielne plamy, lub które oddzielają pojedynczy obszar blobu na kilka (pozornie) połączonych komponentów. Chciałbym podejście oparte na obszarach, ponieważ pokrycie obszaru wydaje się być znacznie mniej wścibskie niż kształty krawędzi.

P.P.P.P.S. Zgodnie z prośbą, tutaj jest przykład z przecięciem z powodu hałasu:

i próbka z dużą ilością szumu, ale mimo to wyraźna kropla:

EDYTOWAĆ Żadna z odpowiedzi nie rozwiązuje problemu, chociaż Bharat zasugerował częściowe rozwiązanie, które dobrze sprawdza się w przypadku nienakładających się plam. Więcej proszę :) Przyznam dodatkową nagrodę wszystkim rzeczywistym rozwiązaniom.

questionAnswers(5)

yourAnswerToTheQuestion