一、背景介绍
实际应用场景中,图片或视频中可能会存在黑边,影响美观度,不适合推荐给用户,本文主要是介绍如何去除黑边和蒙版。
(限于篇幅,以图像蒙版去除为例子,进行讲解)
(1) 先看下效果
A图和C图是带有蒙版的的视频帧(图像),B图和D图是检测蒙版并进行裁剪后的图像,可以看出,该算法可以完美去除蒙版。【黑边去除更易】
下面的分数表示基于蒙版的遮盖程度,对该图片进行打分,分数越高,说明视频被遮挡的区域越小
(2)算法流程
(a)先用candy算子进行边缘检测
(b)使用霍夫曼直线检测,检测直线
(c)NMS非极大值抑制去除多余直线
(d)按照一定规则选取最终的2条直线
对每一步进行可视化:
上图是有蒙版的,下图是无蒙版的
二、代码
#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import os
import cv2
from math import cos,sin
def lines_detector_hough(edge,ThetaDim = None,DistStep = None,threshold = None,halfThetaWindowSize = 2,halfDistWindowSize = None):
'''
:return: 返回检测出的所有直线的参数(theta,dist)
参考了:https://github.com/o0o0o0o0o0o0o/image-processing-from-scratch,欢迎给他点小星星
'''
imgsize = edge.shape
if ThetaDim == None:
ThetaDim = 90
if DistStep == None:
DistStep = 1
MaxDist = np.sqrt(imgsize[0]**2 + imgsize[1]**2)
DistDim = int(np.ceil(MaxDist/DistStep))
if halfDistWindowSize == None:
halfDistWindowSize = int(DistDim/50)
accumulator = np.zeros((ThetaDim,DistDim)) # theta的范围是[0,pi). 在这里将[0,pi)进行了线性映射.类似的,也对Dist轴进行了线性映射
sinTheta = [np.sin(t*np.pi/ThetaDim) for t in range(ThetaDim)]
cosTheta = [np.cos(t*np.pi/ThetaDim) for t in range(ThetaDim)]
for i in range(imgsize[0]):
for j in range(imgsize[1