Wykrywanie powierzchni

9

W jaki sposób jeden obraz dzieli duży obszar szarości (od bieli do czerni)? (Jeśli wiesz o tym w opencv, możesz odpowiedzieć, mówiąc, co byś zrobił w opencv). Na przykład biorąc pod uwagę to zdjęcie:

wprowadź opis zdjęcia tutaj

Widzisz, że jest to duży obszar szarości i wyraźnie można go odróżnić od reszty. Jak to podzielić na segmenty, jeśli ten obszar może mieć dowolny odcień szarości i musi działać w czasie rzeczywistym.

Dzięki z góry.

Olivier_s_j
źródło
Widzę kilka wyraźnych obszarów szarości. Czy możesz pokazać pożądany wynik?
Dr belisarius
moim pożądanym rezultatem są współrzędne górnego prawego i lewego rogu oraz współrzędne lewego dolnego rogu środkowego szarego prostokąta
Olivier_s_j
Czy możesz nam powiedzieć coś jeszcze o środowisku i potencjalnej wariancji obrazów, które będziesz musiał przetworzyć? Czy cel zawsze będzie w pobliżu środka obrazu? Czy będą obecne inne szare prostokąty, być może tego samego rozmiaru? Co jeśli pojawią się w tym samym odcieniu szarości? Czy są jakieś inne rzeczy, których moglibyśmy użyć do identyfikacji? Czy zawsze będzie miał mały kształt litery „T” u góry?
justis
Cześć, Cel nie zawsze będzie znajdować się w pobliżu środka obrazu. Celem zawsze będzie jakiś prostokąt. (Może to być również ściana). Jeśli istnieje wiele prostokątów, należy je również wykryć, ale powinny być duże. Małe obszary można wyrzucić. Jeśli wszystkie pojawią się jako ten sam rodzaj szarości, należy je wszystkie wykryć, ale prawdopodobieństwo, że tak się stanie, jest bardzo małe. Jedyną właściwością, którą można wykryć, jest to, że powierzchnia będzie miała taką samą szarość (mniej więcej) na całej powierzchni i że jest to prostokąt. Za każdym razem nie będzie małego topu w kształcie litery T
Olivier_s_j

Odpowiedzi:

9

Uzyskasz rozsądną segmentację szarego obszaru za pomocą algorytmu wodnego lub wycięć graficznych. Rozlew wodny jest dostępny w wersji opencv, ale cięcia wykresów jeszcze nie. (BTW Czy to mapa głębokości z Kinect?)

nav
źródło
1
Funkcja przełomu w opencv wymagała wejścia 8-bitowego obrazu 3-kanałowego. Moja mapa głębokości to 8-bitowy obraz 1. Masz pomysł, jak to rozwiązać?
Olivier_s_j
/ * pobierz właściwości obrazu / width = src-> width; wysokość = src-> wysokość; / utwórz nowy obraz dla wersji w skali szarości * / IplImage * dst = cvCreateImage (cvSize (szerokość, wysokość), IPL_DEPTH_8U, 1); cvCvtColor (src, dst, CV_RGB2GRAY);
nav
Kolejne pytanie, właśnie dostałem funkcję zlewu działającą na innym obrazie (tylko przykład z opencv). Ale zaczynają się od kolorowego obrazu i obrazu binarnego. Mam tylko 1 zdjęcie ... obraz grascale. Masz pojęcie o tym, jaka powinna być maska ​​(druga zmienna wejściowa)?
Olivier_s_j
4

W Mathematica możesz zrobić coś takiego:

Colorize[MorphologicalComponents[
  ColorNegate@
   Erosion[Dilation[
     DeleteSmallComponents[
      Erosion[Binarize[
        GradientFilter[
         ColorConvert[Import@"http://i.stack.imgur.com/XdnaW.png", 
          "RGB"], 2], .015], 1], 100], 2], 2]], 
 ColorFunction -> "ThermometerColors"]

wprowadź opis zdjęcia tutaj

Prawdopodobnie możesz przetłumaczyć ten kod na dowolną bibliotekę przetwarzania obrazu.

Dr Belizariusz
źródło
Cześć, ładnie wygląda. Ale nie mam matematyki. Ale zgaduję, że użyłeś progów na podstawie skali szarości tego obrazu? Może mógłbyś podać trochę informacji za pomocą kodu? Dzięki
Olivier_s_j
1
@Ojt Dla każdego polecenia można przeczytać opis „ reference.wolfram.com/mathematica/ref/xxx.html ”. Na przykład reference.wolfram.com/mathematica/ref/…
Dr. belisarius
Ok, zrobiłem tak jak sugerowałeś. Ale wygląda na to, że używasz Binarize do progowania przy danej wartości. Co nie jest możliwe w moim przypadku. Ponieważ duże obszary mogą mieć różne odcienie szarości. (Na przykład środkowa powierzchnia może być bardzo jasna). A potem próg nie zadziałałby.
Olivier_s_j