Это продолжение проблемы при другом подходе.
Я хочу избавиться от коробок и всего, что находится за его пределами, и оставить все, что находится внутри коробки,как есть. Или, по крайней мере, только поле.
Поле:
Как я хочу, чтобы это выглядело после некоторой магии:
Вот откуда он был обрезан:
Если вы посмотрите первое изображение на черном фоне, вы заметите, что все еще белыйполоса за рамкой поля. Его можно обрезать меньше или больше, если получить статистику ограничивающего прямоугольника и добавить в него отступ.
Это наивный и мой первый подход. Проблема в следующем:
- Он не может учитывать слишком большую ширину линии, не влияя на символы внутри. Скажем, вы добавили -9 в качестве отступа. Он будет работать в основном достаточно хорошо для блоков с шириной линии ~ 9px, но все, что находится за пределами ~ 9px, остается внутриЭто вызывает некоторые оставшиеся пиксели, что в конечном итоге влияет на точность моего приложения.
- С другой стороны, любое поле в штучной упаковке с шириной линии, значительно меньшей, чем 9, может также уничтожить символы внутри.
Моя вторая попытка удаление контура с маской. Однако, это не получилось так, как ожидалось.
Код для извлечения контуров очень длинный, поэтому предположим, что stats
содержит contours
, возвращенный из contours, _ = cv2.findContours
# loop in each contour in stats
for i in range(len(stats)):
# get the stats of the bounding rectangle
x, y, w, h = cv2.boundingRect(stats[i])
# draw the field contour into the mask
cv2.drawContours(mask, [stats[i]], -1, 0, -1)
# remove the contour from the original image
section = cv2.bitwise_and(section, section, mask=mask)
# crop the boxed field
field = crop_by_origin(x, y, w, h, padding=p)
Вот что я получаю:
Я не понимаю, почему это не сработало? Может, потому что на сайте его пример на черном фоне? Может быть, это не работает с "прозрачными" контурами? Это вообще возможно?
Как это исправить? Любые другие возможные решения здесь?
ОБНОВЛЕНИЕ
Я попробовал другое изображение с ответом @ nathancy, и вот что пришло:
Результат:
Я пытался поиграться с ядром горизонтальной линии, но это не сработало, как задумано, есть ли способ сделать это более динамичным?