Я написал небольшой скрипт на python, где я пытаюсь извлечь или обрезать ту часть игральной карты, которая представляет только художественные работы, удаляя все остальное. Я пробовал различные методы пороговых значений, но не смог туда добраться. Также обратите внимание, что я не могу просто записать вручную положение обложки, потому что оно не всегда находится в одинаковом положении или размере, но всегда в прямоугольной форме, где все остальное - просто текст и границы.
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()
Токовый выход - самая близкая вещь, которую я мог получить. Я мог бы быть на правильном пути и попытаться еще немного спорить, чтобы нарисовать прямоугольник вокруг белых частей, но я не думаю, что это устойчивый метод:
Как последнее примечание, смотрите карты ниже, не все рамки имеют одинаковые размеры или позиции, но всегда есть произведение искусства с только текстом и рамками вокруг него. Это не должно быть супер точно вырезано, но ясно, что искусство - это «область» карты, окруженная другими областями, содержащими некоторый текст. Моя цель - постараться как можно лучше охватить область искусства.
источник
Ответы:
Я использовал преобразование линии Хафа для обнаружения линейных частей изображения. Пересечения всех линий были использованы для построения всех возможных прямоугольников, которые не содержат других точек пересечения. Так как та часть карты, которую вы ищете, всегда является самой большой из этих прямоугольников (по крайней мере, в предоставленных вами образцах), я просто выбрал самый большой из этих прямоугольников в качестве победителя. Скрипт работает без взаимодействия с пользователем.
Вот результаты с предоставленными вами образцами:
Код для нахождения пересечения линий можно найти здесь: найти точку пересечения двух линий, нарисованных с помощью houghlines opencv
Вы можете прочитать больше о Hough Lines здесь .
источник
Мы знаем, что карты имеют прямые границы по осям X и Y. Мы можем использовать это, чтобы извлечь части изображения. Следующий код реализует обнаружение горизонтальных и вертикальных линий на изображении.
Вам просто нужно нажать на две области, чтобы включить. Пример области щелчка и соответствующий результат:
Результаты из других изображений:
источник
Я не думаю, что можно автоматически обрезать ROI художественных работ с использованием традиционных методов обработки изображений из-за динамического характера цветов, размеров, местоположений и текстур для каждой карты. Вы должны изучить машинное / глубокое обучение и обучить свой собственный классификатор, если хотите сделать это автоматически. Вместо этого, вот ручной подход, чтобы выбрать и обрезать статическую область интереса на изображении.
Идея состоит в том, чтобы использовать
cv2.setMouseCallback()
и обработчики событий, чтобы определить, была ли нажата или отпущена мышь. Для этой реализации вы можете извлечь графическую область интереса, удерживая левую кнопку мыши и перетаскивая ее, чтобы выбрать нужную область интереса. После того, как вы выбрали нужный ROI, нажмите,c
чтобы обрезать и сохранить ROI. Вы можете сбросить ROI, используя правую кнопку мыши.Сохраненные графические объекты
Код
источник