本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。
原文链接:使用OpenCV轮廓检测提取图像前景
背景和介绍
前景提取是计算机视觉领域中非常流行的任务。使用前景提取方法,我们尝试提取任何我们感兴趣的图像或对象,并丢弃其余的背景。最近基于深度学习的图像分割技术使这变得非常容易。但我们也可以使用纯计算机视觉技术来实现这一点。
在基于计算机视觉的图像前景提取方面,Grabcut 是最流行的方法之一。在 Grabcut 中,我们提供了一个矩形区域,其中可能存在感兴趣的对象。之后,Grabcut 算法会处理其余部分。
那么,如果不使用 Grabcut 算法,我们该怎么做呢?
使用OpenCV轮廓检测进行图像前景提取
简单来说,我们需要找到感兴趣对象的边界区域或像素。之后,我们可以将其视为前景图像,而将其余部分视为背景图像。
我们可以使用轮廓检测技术来实现这一点。使用轮廓检测,我们可以找到我们想要提取的对象周围的像素,然后继续进行。我们将在本文中详细介绍如何使用 OpenCV 轮廓检测实现图像前景提取。
不仅如此,我们还将尝试改变结果前景的背景,使事情变得更有趣。所以,你可以期待类似下图的效果。
在上图中,顶部图像显示原始未经编辑的图像,背景为白色。没有什么特别之处。中间图像显示前景图像。这是我们仅从顶部图像中提取人物时的图像。没问题。您在最底部图像中看到的图像是我们将提取的前景图像与新的彩色背景合并后的图像。
库和依赖项
对于本教程,我们只需要一个主要库。那就是OpenCV计算机视觉库。
我使用的是 4.2.0.32 版本。虽然我建议使用与我相同的版本,但如果使用任何 4.x 版本,您仍然不会遇到任何问题。
目录结构
在本教程中,我们将使用以下目录结构。
│ extract_foreground.py
│ utils.py
│
├───input
│ background.jpg
│ image_1.jpg
│ image_2.jpg
│ image_3.jpg
│
├───outputs
│ ...
-
-
在父项目目录中,我们有两个 Python 文件,extract_foreground.py和utils.py。
-
输入文件夹包含我们将在本教程中使用的输入图像。总共有四张图片。
-
最后,输出运行 Python 脚本后,文件夹将包含输出图像。
-
下载后,只需将文件解压到项目目录中即可。所有图片均取自Pixabay,可免费使用。
https://pixabay.com/
使用OpenCV轮廓检测进行图像前景提取
从这里开始,我们将在编写代码时深入了解这两个Python文件的细节。
我们将从utils.py然后进入Python脚本extract_foreground.py文件。
这里的所有代码都将进入utils.py文件。此 Python 文件包含一些实用函数,我们可以在需要时执行这些函数。我们将这些函数分开,以便我们的代码尽可能保持干净和易读。
下面的代码块包含实用函数所需的两个导入。
import cv2
import numpy as np
查找最大轮廓的函数
我们要编写的第一个函数是找到图像中最大的轮廓区域。
这查找find_largest_contour()函数接受二值图像,找出图像中的所有轮廓,并返回最大的轮廓面积。
def find_largest_contour(image):