Python-OpenCV学习(十)用GrabCUt算法进行图片前景的提取

简介:

用GrabCUt算法进行图片前景的提取(这个是之前解决词云图片问题的一种方法):
grabCut算法的实现步骤为:

  • 在图片中定义含有(一个或多个)物体的矩形。
  • 矩形外的区域被自动认为是背景
  • 对于用户定义的矩形区域,可用背景中数据来区分是前景还是背景
  • 用高斯混合模型(GMM)来对被禁和前景见面,并将未定义的像素标记为可能的前景或背景
  • 图像中的每一个像素都被看作通过通过虚拟变与周围像素连接,而每条边都有一个属于前景或背景的概率这基于它和周围像素颜色上的相似性
  • 每一个像素(即算法中的节点)会与前一各前景或背景节点连接,与下图类似:
    1

-在节点连接完成后,用图论中最大流最小割的方法来分割:
2

例子:

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('statue_small.jpg')
mask = np.zeros(img.shape[:2],np.uint8)

bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)

rect = (100,1,421,378)
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)

mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img = img*mask2[:,:,np.newaxis]

plt.subplot(121), plt.imshow(img)
plt.title("grabcut"), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(cv2.cvtColor(cv2.imread('statue_small.jpg'), cv2.COLOR_BGR2RGB))
plt.title("original"), plt.xticks([]), plt.yticks([])
plt.show()

结果:
3
例程先创建一个与加载图像相同形状的mask:

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('statue_small.jpg')
mask = np.zeros(img.shape[:2],np.uint8)

创建以0填充的前景和背景模型:

bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)

可以用数据填充这些模型,要准备一个标识出想要各类的对象的矩形框来初始化GrabCut算法。背景和前景要基于这个矩形框来决定:
这边用下面一行代码来决定:

rect = (100,1,421,378)

其实可以用opencv提供的窗口函数自己写一个取前景;
使用致敬的空模型来运行GrabCUt算法,实际上是用一个矩形框来初始化这个操作:

cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)

fgbModel后面是一个算法的迭代次数

之后mask编程0~3之间的值,值中0~2转换为01和3转为1 保存在mask2中,

mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img = img*mask2[:,:,np.newaxis]
目录
相关文章
|
8天前
|
存储 索引 Python
python图片九宫格图片处理
本篇文章介绍了一个Python项目的实现,项目能够处理图片并将其组合成九宫格或四宫格,同时还具备音乐播放功能,对于初学者来说是一个可以进行实战学习的初级项目。
|
8天前
|
存储 计算机视觉 Python
python实现Gif图片的字符画
这是一个Python实战项目,旨在将GIF动态图转化为ASCII字符动画。项目适合有一定Python基础的学习者,主要使用os、imageio、PIL库。首先,代码导入所需库,然后通过PIL创建空白图片并添加文本。接着,程序读取GIF,拆分帧并转为字符画,存入“tmp”目录。同时,代码提供了清空“tmp”目录、将灰度值映射为ASCII字符、将图片处理成字符画的函数。此外,还有创建新画布和合成GIF的步骤。主函数调用这些模块,最终将ASCII字符画合并成GIF。项目展示了将动态图像转换为ASCII艺术的过程。
|
9天前
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习专栏】关联规则学习:Apriori算法详解
【4月更文挑战第30天】Apriori算法是一种用于关联规则学习的经典算法,尤其适用于购物篮分析,以发现商品间的购买关联。该算法基于支持度和置信度指标,通过迭代生成频繁项集并提取满足阈值的规则。Python中可借助mlxtend库实现Apriori,例如处理购物篮数据,设置支持度和置信度阈值,找出相关规则。
|
10天前
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】集成学习算法的原理与应用
【4月更文挑战第30天】集成学习通过组合多个基学习器提升预测准确性,广泛应用于分类、回归等问题。主要步骤包括生成基学习器、训练和结合预测结果。算法类型有Bagging(如随机森林)、Boosting(如AdaBoost)和Stacking。Python中可使用scikit-learn实现,如示例代码展示的随机森林分类。集成学习能降低模型方差,缓解过拟合,提高预测性能。
|
11天前
|
前端开发 API 计算机视觉
opencv绘制基本图形,在图片上添加文字
opencv绘制基本图形,在图片上添加文字
|
12天前
|
Python
python代码根据点坐标裁切图片
【4月更文挑战第19天】python代码根据点坐标裁切图片
25 2
|
21天前
|
数据采集 Web App开发 开发者
探秘Python爬虫技术:王者荣耀英雄图片爬取
探秘Python爬虫技术:王者荣耀英雄图片爬取
|
22天前
|
机器学习/深度学习 算法 自动驾驶
opencv python 图片叠加
【4月更文挑战第17天】
|
23天前
|
机器学习/深度学习 算法 前端开发
Scikit-learn进阶:探索集成学习算法
【4月更文挑战第17天】本文介绍了Scikit-learn中的集成学习算法,包括Bagging(如RandomForest)、Boosting(AdaBoost、GradientBoosting)和Stacking。通过结合多个学习器,集成学习能提高模型性能,减少偏差和方差。文中展示了如何使用Scikit-learn实现这些算法,并提供示例代码,帮助读者理解和应用集成学习提升模型预测准确性。
|
23天前
|
机器学习/深度学习 算法 Python
使用Python实现集成学习算法:Bagging与Boosting
使用Python实现集成学习算法:Bagging与Boosting
22 0