Jak rozpoznać prostokąty na tym obrazie?

Mam obraz z poziomymi i pionowymi liniami. W rzeczywistości ten obraz jest stroną BBC przekonwertowaną na linie poziome i pionowe. Mój problem polega na tym, że chcę być w stanie znaleźć wszystkie prostokąty na obrazie. Chcę napisać program komputerowy, aby znaleźć wszystkie prostokąty. Czy ktoś wie jak to zrobić lub proponuje pomysły jak zacząć? To zadanie jest łatwe dla mnie jako osoby, aby znaleźć wizualne prostokąty, ale nie jestem pewien, jak opisać go jako program.

Obraz jest Strona BBC tutaj http://www.bbc.co.uk/


Update to this, I wrote the code which converts the BBC website image to the horizontal and vertical line, the problem is these lines do not completely meet at the corners and sometimes they do not completely form a prostokąt. Dzięki!

Author: casperOne, 2009-11-30

9 answers

Opencv (image processing and computer vision library napisana w języku c) ma implementację dla transformacji hougha (prosta transformacja hougha znajduje linie w obrazie, podczas gdy uogólniona znajduje bardziej złożone obiekty), więc może to być dobry początek. Dla prostokątów, które mają zamknięte narożniki, istnieją również czujniki narożne, takie jak cornerHarris, które mogą pomóc.

Uruchomiłem demo houghlines dostarczone z opencv i oto wynik na obrazku który podałeś (wykryte linie oznaczone na Czerwono): alt text http://imageapp.splintec.com/images/Screenshot2.png

 20
Author: elijah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-22 23:08:17

Myślę, że szukasz uogólnionej transformacji Hougha.

 8
Author: rlbond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-30 02:23:19

W wizji komputerowej istnieje algorytm o nazwie uogólniona transformata Hougha, która może rozwiązać twój problem. Powinien istnieć kod open source mający zaimplementowany ten algorytm. Po prostu go poszukaj.

 4
Author: ppan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-30 07:24:23

Zakładając, że jest to w miarę wolny od szumów obraz (a nie Wideo ekranu), jeden z prostych algorytmów floodfill powinien działać. Może być konieczne uruchomienie rozszerzenia / erozy na obrazie, aby zamknąć luki.

Normalnym sposobem znajdowania linii jest transformata Hougha ( następnie znajdowanie linii pod kątem prostym) Opencv jest najprostszym sposobem.

Spójrz na to pytanie wykrywanie obiektów OpenCV-Center Point

 3
Author: Martin Beckett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:00

Istnieje kilka różnych podejść do twojego problemu. Użyłbym narzędzia do przetwarzania obrazów morfologicznych , takiego jak to . Będziesz miał elastyczność, aby zdefiniować "prostokąt" nawet coś, co nie jest "dokładnie zamknięte" (gdzie algorytm wypełnienia zawiedzie).

Inną możliwością może być użycie podejściamachine learning , które zasadniczo jest bardziej oparte na danych niż na definicji, jak poprzednie. Będziesz musiał podać swój algorytm kilka " przykładów" tego, czym jest prostokąt, i w końcu się dowie (z tendencją i wskaźnikiem błędu).

 2
Author: Davide,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-30 02:07:47

Powtarzaj od lewej do prawej, aż trafisz w kolorowy piksel, a następnie użyj zmodyfikowanego algorytmu flood fill. więcej informacji na temat algo flood fill @ wiki

 1
Author: data,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-30 01:31:20

Innym podejściem byłoby znalezienie dowolnego kolorowego piksela na obrazie, a następnie przejście z

while(pixel under current is colored)
{
  lowest pixel coordinate = pixel under current
  current = pixel under
}

Następnie zrób to samo w górę. teraz zdefiniowaliśmy jedną linię. następnie użyj końców linii, aby dopasować linie do prostokątów. jeśli nie są idealne do pikseli, możesz zrobić jakiś tresholding.

 1
Author: data,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-30 01:42:50

Flood fill będzie działać, lub można użyć modyfikacji algorytmu śledzenia krawędzi.

To co robisz to: tworzenie tablicy 2d (lub dowolnej innej struktury danych d2) - każdy wiersz reprezentuje poziomą linię pikseli na ekranie, a każda kolumna pionową linię

Iteruj przez wszystkie piksele, od lewej do prawej, a za każdym razem, gdy znajdziesz kolorowy, Dodaj jego współrzędne do tablicy

Iteracja poprzez tablicę i znajdowanie linii oraz zapisywanie piksela początkowego i końcowego dla każdego z nich (inna struktura danych)

Wiedząc, że początek każdej linii jest jej lewym / górnym pikselem, możesz łatwo sprawdzić, czy jakiekolwiek 4 linie składają się z prostokąta

 1
Author: Zepee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-30 01:48:40

Aby uzyskać z obrazka, który masz z prawie stykającymi się poziomymi i pionowymi liniami, do tylko prostokątów:

  1. Konwertuj na binarne (tzn. wszystkie linie są białe, reszta jest czarna)
  2. Wykonaj dylatację binarną (tutaj każdy piksel, który dotknie białego piksela w obrazie źródłowym lub jest białym pikselem w obrazie źródłowym białym. Dotyk jest tylko prosty (więc każdy piksel "dotyka" pikseli po jego lewej, prawej, nad i pod nim) nazywa się to "4-connected"
  3. Powtórz krok 3 kilka razy, jeśli przerwy między końcami są większe niż 2 piksele szerokości, ale nie zbyt często!
  4. wykonaj operację szkieletu (tutaj każdy piksel obrazu wyjściowego jest czarny, jeśli jest to biały piksel w obrazie źródłowym, który dotyka co najmniej jednego czarnego piksela, a białe piksele, których dotyka (w obrazie źródłowym), dotykają się nawzajem. Ponownie dotknij zdefiniowany za pomocą 4-connectedness. Zobacz przykład poniżej.
  5. Powtórz krok 4, dopóki obraz nie zmieni się po a repeat (wszystkie białe piksele są końcami linii lub łącznikami)

To, przy odrobinie szczęścia, najpierw pokaże pola z grubymi liniami tłuszczu, pozostawiając grube artefakty tłuszczu na całym obrazie (po kroku 3), a następnie po kroku 5 Wszystkie grube artefakty tłuszczu zostaną usunięte, podczas gdy wszystkie pola pozostają. Aby uzyskać najlepsze wyniki, musisz tweekować liczbę powtórzeń w kroku 3. Jeśli interesuje Cię morfologia obrazu, jest to książka z naprawdę dobrego kursu wprowadzającego, który wziąłem.

Próbka: (0=Czarny, 1 = Biały, rozważane są piksele w środku każdego bloku 3x3, wejście w lewo, wyjście w prawo)

011 => 011    
011 => 001  all other white pixels touch, so eliminate      
011 => 011    

010 => 010    
010 => 010  top pixel would become disconnected, so leave      
010 => 010    

010 => 010    
010 => 000  touches only one white pixel, so remove     
000 => 000    

010 => 010    
111 => 111  does not touch black pixels, leave    
010 => 010    

010 => 010    
011 => 011  other pixels do not touch. so leave    
000 => 000    
 1
Author: jilles de wit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-07 22:54:34