Napisałem mały skrypt w Pythonie, w którym próbuję wyodrębnić lub wykadrować część karty do gry, która reprezentuje tylko grafikę, usuwając resztę. Próbowałem różnych metod progowania, ale nie mogłem się tam dostać. Zauważ też, że nie mogę po prostu ręcznie zapisać pozycji dzieła, ponieważ nie zawsze jest ono w tej samej pozycji lub rozmiarze, ale zawsze w kształcie prostokąta, gdzie wszystko inne to tylko tekst i obramowania.
from matplotlib import pyplot as plt
import cv2
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY)
binary = cv2.bitwise_not(binary)
kernel = np.ones((15, 15), np.uint8)
closing = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
plt.imshow(closing),plt.show()
Prąd wyjściowy jest najbliższą rzeczą, jaką mogę uzyskać. Mógłbym być na dobrej drodze i spróbować dalszych sporów, aby narysować prostokąt wokół białych części, ale nie sądzę, że jest to metoda zrównoważona:
Na koniec, patrz karty poniżej, nie wszystkie ramki mają dokładnie takie same rozmiary lub pozycje, ale zawsze jest kawałek grafiki z samym tekstem i ramkami wokół niego. Nie musi być bardzo precyzyjnie cięty, ale najwyraźniej sztuka jest „regionem” karty, otoczonym innymi regionami zawierającymi tekst. Moim celem jest jak najlepsze uchwycenie regionu dzieła sztuki.
źródło
Odpowiedzi:
Użyłem transformacji liniowej Hougha do wykrycia liniowych części obrazu. Skrzyżowania wszystkich linii wykorzystano do skonstruowania wszystkich możliwych prostokątów, które nie zawierają innych punktów przecięcia. Ponieważ część karty, której szukasz, jest zawsze największym z tych prostokątów (przynajmniej w podanych próbkach), po prostu wybrałem największy z tych prostokątów jako zwycięzcę. Skrypt działa bez interakcji użytkownika.
Oto wyniki z podanymi przez Ciebie próbkami:
Kod znajdowania skrzyżowań linii można znaleźć tutaj: znajdź punkt przecięcia dwóch linii narysowanych za pomocą linii Houghlines opencv
Możesz przeczytać więcej o Hough Lines tutaj .
źródło
Wiemy, że karty mają proste granice wzdłuż osi xiy. Możemy to wykorzystać do wyodrębnienia części obrazu. Poniższy kod implementuje wykrywanie poziomych i pionowych linii na obrazie.
Musisz tylko kliknąć dwa obszary, które chcesz uwzględnić. Przykładowy obszar kliknięcia i odpowiedni wynik są następujące:
Wyniki z innych zdjęć:
źródło
Nie sądzę, że możliwe jest automatyczne przycinanie ROI grafiki przy użyciu tradycyjnych technik przetwarzania obrazu ze względu na dynamiczny charakter kolorów, wymiarów, lokalizacji i tekstur dla każdej karty. Będziesz musiał przyjrzeć się uczeniu maszynowemu / głębokiemu i wyszkolić własnego klasyfikatora, jeśli chcesz to zrobić automatycznie. Zamiast tego oto ręczne podejście do wybierania i kadrowania statycznego ROI z obrazu.
Chodzi o to, aby użyć
cv2.setMouseCallback()
i obsługi zdarzeń, aby wykryć, czy mysz została kliknięta lub zwolniona. W przypadku tej implementacji można wyodrębnić ROI grafiki, przytrzymując lewy przycisk myszy i przeciągając, aby wybrać żądany ROI. Po wybraniu żądanego ROI naciśnij,c
aby przyciąć i zapisać ROI. Możesz zresetować ROI za pomocą prawego przycisku myszy.Zapisane zwroty z inwestycji
Kod
źródło