Удаление границ / полей из видеокадров - PullRequest
1 голос
/ 07 марта 2020

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

enter image description here

и

enter image description here

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

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

1 Ответ

3 голосов
/ 07 марта 2020

Вот один из способов сделать это в 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)


Ввод:

enter image description here


Изображение с порогом и очищено:

enter image description here

Обрезано Результат:

enter image description here

...