Хобрук: Ваш путь к мастерству в программировании

Удаление границ/полей из видеокадров

Я работаю с видео, вокруг которых есть границы (поля). У кого-то он со всех 4-х сторон, у кого-то только слева и справа, а у кого-то только сверху и снизу. Длина этих полей также не фиксирована. Я извлекаю кадры из этих видео, например,

введите здесь описание изображения

и

введите здесь описание изображения

Оба они содержат границы сверху и снизу.

Может ли кто-нибудь предложить некоторые способы удаления этих границ с этих изображений (желательно на Python). Я столкнулся с некоторыми методами, такими как этот в Stackoverflow, но это касается с идеальной ситуацией, когда границы абсолютно черные (0,0,0). Но в моем случае они могут быть не черными как смоль, а также могут содержать дрожащие шумы. Любая помощь/предложения будут высоко оценены.


  • Опубликуйте некоторые из ваших неидеальных изображений, чтобы мы могли увидеть, какая у вас проблема. Красные прямоугольники на ваших реальных изображениях? Как насчет зеленых или темных отметин? Они есть и на ваших изображениях? 07.03.2020
  • Извините за вызванную путаницу. Я отредактировал изображения. Зеленые и темные метки не были частью исходного изображения, а были просто бликом, сделанным с моей стороны (чтобы показать черные границы). 07.03.2020

Ответы:


1

Вот один из способов сделать это в Python/OpenCV.

  • Прочитать изображение
  • Преобразовать в оттенки серого и инвертировать
  • Порог
  • Примените морфологию, чтобы удалить небольшие черные или белые области, затем снова инвертируйте
  • Получить контур одной области
  • Получить ограничивающую рамку этого контура
  • Используйте нарезку numpy, чтобы обрезать эту область изображения, чтобы сформировать результирующее изображение.
  • Сохраните полученное изображение


import cv2
import numpy as np

# read image
img = cv2.imread('gymnast.png')

# convert to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# invert gray image
gray = 255 - gray

# gaussian blur
blur = cv2.GaussianBlur(gray, (3,3), 0)

# threshold
thresh = cv2.threshold(blur,236,255,cv2.THRESH_BINARY)[1]

# apply close and open morphology to fill tiny black and white holes
kernel = np.ones((5,5), np.uint8)
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)

# invert thresh
thresh = 255 -thresh

# get contours (presumably just one around the nonzero pixels) 
# then crop it to bounding rectangle
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
cntr = contours[0]
x,y,w,h = cv2.boundingRect(cntr)
crop = img[y:y+h, x:x+w]

cv2.imshow("IMAGE", img)
cv2.imshow("THRESH", thresh)
cv2.imshow("CROP", crop)
cv2.waitKey(0)
cv2.destroyAllWindows()

# save cropped image
cv2.imwrite('gymnast_crop.png',crop)
cv2.imwrite('gymnast_crop.png',crop)


Вход:

введите здесь описание изображения


Пороговое и очищенное изображение:

введите здесь описание изображения

Обрезанный результат:

введите здесь описание изображения

06.03.2020
  • Вы должны выбрать разумный порог для каждого изображения. Но есть некоторая широта из-за очистки морфологии. 08.03.2020
  • Да, поскольку вы предлагаете морфологическое открытие и закрытие, я думаю, что это сводит на нет необходимость определения точного порога ... теперь даже диапазон значений будет служить идеальным порогом. Даже классические методы, такие как метод Оцу, также должны хорошо служить этой цели. 08.03.2020
  • Ну, это слишком много на морфологии. И затем вам нужно настроить морфологию, чтобы очистить еще больше или меньше в зависимости от порога. Но если это работает для вашего диапазона изображений, отлично. 08.03.2020
  • Да, согласен. В очередной раз благодарим за помощь. Я буду иметь в виду эти моменты. 08.03.2020
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..