编辑: 我为此编写了一个Python脚本。
由于您的目标是模糊(用于隐私保护),因此您基本上需要一个高召回率检测器作为第一步。以下是如何进行此操作的说明。其中包含的代码提示使用Python的OpenCV。
- 转换为灰度。
应用高斯模糊。
img = cv2.imread('input.jpg',1)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_gray = cv2.GaussianBlur(img_gray, (5,5), 0)
让输入图像如下所示。
![enter image description here](https://istack.dev59.com/fgDry.webp)
- 应用Sobel滤波器以检测垂直边缘。
- 使用严格阈值或OTSU二值化对结果图像进行阈值处理。
cv2.Sobel(image, -1, 1, 0)
cv2.threshold()
使用适当的结构元素进行形态学闭合操作。(我使用了16x4作为结构元素)
se = cv2.getStructuringElement(cv2.MORPH_RECT,(16,4))
cv2.morphologyEx(image, cv2.MORPH_CLOSE, se)
第5步后的结果图像。
![enter image description here](https://istack.dev59.com/5wppq.webp)
查找该图像的外轮廓。
cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
对于每个轮廓,找到包围它的最小矩形(minAreaRect()
).
根据长宽比、最小和最大面积以及与水平线的夹角选择矩形。(我使用了2.2<=长宽比<=8, 500<=面积<=15000, 夹角<=45度)
所有minAreaRect()
都显示为橙色,满足我们条件的矩形是绿色的。
- 此步骤可能会出现误检,可以使用边缘密度过滤。边缘密度定义为矩形中的白色像素数/总像素数。设置边缘密度阈值。(我使用了0.5)
![enter image description here](https://istack.dev59.com/IuGvm.webp)
- 模糊检测到的区域。
![enter image description here](https://istack.dev59.com/VX1gn.webp)
您可以应用其他适当的过滤器来增加召回率和精度。检测也可以使用HOG+SVM进行训练以提高精度。