【问题标题】:Removing Borders/Margins from Video Frames从视频帧中删除边框/边距
【发布时间】:2020-06-19 15:44:35
【问题描述】:

我正在处理带有边框(边距)的视频。有些沿所有 4 个侧面都有,有些仅沿左侧和右侧,有些仅沿顶部和底部。这些边距的长度也不是固定的。 我正在从这些视频中提取帧,例如,

这两个都包含顶部和底部的边框。

任何人都可以建议一些方法来从这些图像中删除这些边框(最好是在 Python 中)。 我遇到了一些方法,例如 Stackoverflow 上的 this,但这处理的是边框完全黑色 (0,0,0) 的理想情况。但就我而言,它们可能不是漆黑的,也可能包含抖动的噪音。 任何帮助/建议将不胜感激。

【问题讨论】:

  • 发布一些不理想的图片,以便我们了解您有什么问题。您的实际图像上有红色框吗?绿色或深色标记呢?它们也在你的图片上吗?
  • 对造成的混乱感到抱歉。我已经编辑了图像。绿色和深色标记不是原始图像的一部分,而只是我所做的一些突出显示(以显示黑色边框)

标签: python image opencv image-processing python-imaging-library


【解决方案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)


输入:


阈值和清洁图像:

裁剪结果:

【讨论】:

  • 您必须为每个图像选择一个合理的阈值。但由于形态清洗存在一定的纬度。
  • 是的,既然你建议形态学打开和关闭,我认为这消除了确定精确阈值的需要......现在,即使是一系列值也可以作为完美的阈值。即使是像大津方法这样的经典方法,也应该很好地达到目的。
  • 嗯,这对形态学的影响太大了。然后您必须根据阈值调整形态以或多或少地进行清洁。但如果它适用于您的图像范围,那就太好了。
  • 是的,同意。再次感谢你的帮助。我会牢记这些要点。