zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【课题总结】OpenCV 抠图项目实战(4)固定阈值抠图

Opencv项目 总结 实战 固定 阈值 课题
2023-09-14 09:12:46 时间

Python 小白的课题报告—OpenCV 抠图项目实战(4)固定阈值抠图

本系列是 Python 小白的课题作业《基于OpenCV 的图像分割和抠图》。
需要说明的是,本系列并不能算是 OpenCV 的抠图项目教程,只是以此为主题的课题报告。其中包括了一个较为完整的 PyQt 项目。

欢迎关注『Python 小白的项目实战 @ youcans』 原创作品
Python 小白的课题报告—OpenCV 抠图项目实战(1)目录摘要
Python 小白的课题报告—OpenCV 抠图项目实战(2)抠图绪论
Python 小白的课题报告—OpenCV 抠图项目实战(3)抠图综述
Python 小白的课题报告—OpenCV 抠图项目实战(4)固定阈值抠图
Python 小白的课题报告—OpenCV 抠图项目实战(5)自适应阈值抠图
Python 小白的课题报告—OpenCV 抠图项目实战(6)色彩范围抠图
Python 小白的课题报告—OpenCV 抠图项目实战(7)边缘检测
Python 小白的课题报告—OpenCV 抠图项目实战(8)图像轮廓
Python 小白的课题报告—OpenCV 抠图项目实战(9)评价指标
Python 小白的课题报告—OpenCV 抠图项目实战(10)PyQt5 使用
Python 小白的课题报告—OpenCV 抠图项目实战(11)算法实验平台
Python 小白的课题报告—OpenCV 抠图项目实战(12)源程序代码


第三章 阈值抠图

阈值处理方法直观简单,是一种基本的图像分割方法。

根据图像的整体或部分信息适当选择阈值,像素值高于阈值时设为1/255,低于阈值时设为0,以此将图像中感兴趣的区域筛选出来生成掩模,再与原图像合成即可得到抠图图像。

由于待处理图像的灰度级数与其灰度直方图是不确定的,对于不同的图像、不同的目标前景,需要选取适当的阈值处理方法进行图像分割。本章采用固定阈值、自适应阈值与色彩范围三种方法进行图像抠图处理。


3.1 固定阈值抠图

蓝屏抠图问题泛指已知背景颜色的单一背景颜色图像抠图,广泛应用于证件拍照、影视制作。由于背景颜色是确定已知的,可以使用固定阈值方法进行图像抠图和背景颜色更换。

固定阈值抠图方法先将彩色图像转化为灰度图像,再基于适当的颜色阈值对图像进行阈值处理生成二值化掩模遮罩图像。将掩模遮罩与原始图像合成就得到抠图图像,将掩模遮罩与新的背景图片合成就可以更换图像背景。

固定阈值处理方法的阈值,可由人工经验选择或基于图像直方图进行选择。对于蓝屏抠图问题,通常使用固定阈值处理方法就可以获得较好的结果。

OpenCV 提供了函数 cv.threshold()实现图像的阈值处理。

函数说明:

cv.threshold(src, thresh, maxval, type[, dst]) → ret, dst

函数 threshold() 将灰度图像转换为二值图像(Binarization),即图像完全由像素 0 和 255 构成,呈现出只有黑白两色的视觉效果,突出图片的轮廓。

该方法通过固定阈值 thresh 处理图像,也称固定阈值处理方法。

参数说明:

  • scr:进行阈值处理的灰度图像
  • thresh:阈值,取值范围 0~255
  • maxval:填充色,取值范围 0~255,一般取 255
  • type:阈值类型
    • cv2.THRESH_BINARY:小于阈值的像素置 0,大于阈值的像素置 maxval;
    • cv2.THRESH_BINARY_INV:小于阈值的像素置 maxval,大于阈值的像素置 0;
    • cv2.THRESH_TRUNC:小于阈值的像素不变(保持原值),大于阈值的像素置阈值thresh;
    • cv2.THRESH_TOZERO:小于阈值的像素置 0,大于阈值时不变(保持原值)
    • cv2.THRESH_TOZERO_INV:大于阈值的像素置 0,小于阈值时不变(保持原值)
    • cv2.THRESH_OTSU:使用 OTSU 算法选择阈值
  • dst:返回二值化的灰度图像
  • ret:返回二值化的阈值

使用固定阈值进行图像抠图的基本程序如下:

# MattingThresh.py
# Copyright 2021 youcans, XUPTy
# Crated:2021-12-10 

# 1. 读取原始图像
imgOri = cv2.imread("../images/lady983Green.jpg") # 读取原始图像
width, height, channels = imgOri.shape

# 2. 从原始图像提取绿色通道
imgGray = cv2.cvtColor(imgOri, cv2.COLOR_BGR2GRAY) # 彩色图像转换为灰度图像
imgGreen = imgOri[:,:,1] # imgGreen 为 绿色通道的 色彩强度图 (注意不是原图的灰度转换结果)
print(imgOri.shape, imgGray.shape, imgGreen.shape)

# 3. 绿色通道转换为二值图像,生成遮罩 Mask、逆遮罩 MaskInv
# 如果背景不是绿屏而是其它颜色,可以采用对应的颜色通道进行阈值处理 (不宜基于灰度图像进行固定阈值处理,性能差异很大)
colorThresh = 220 # 绿屏背景的颜色阈值 (注意研究阈值的影响)
ret, binary = cv2.threshold(imgGreen, colorThresh, 255, cv2.THRESH_BINARY) # 转换为二值图像,生成遮罩,抠图区域黑色遮盖
binaryInv = cv2.bitwise_not(binary) # 按位非(黑白转置),生成逆遮罩,抠图区域白色开窗,抠图以外区域黑色

# 4. 用遮罩进行抠图和更换背景
# 生成抠图图像 (前景保留,背景黑色)
imgMatte = cv2.bitwise_and(imgOri, imgOri, mask=binaryInv) # 生成抠图前景,标准抠图以外的逆遮罩区域输出黑色

# 将背景颜色更换为红色: 修改逆遮罩 (抠图以外区域黑色)
imgReplace = imgOri.copy()
imgReplace[binaryInv==0] = [0,0,255] # 黑色区域(0/0/0)修改为红色(BGR:0/0/255) 

plt.figure(figsize=(12,8))
plt.subplot(231), plt.imshow(cv2.cvtColor(imgOri, cv2.COLOR_BGR2RGB)), plt.title("Origin image"), plt.axis('off'
plt.subplot(232), plt.imshow(imgGray, cmap='gray'), plt.title("Gray image"), plt.axis('off')
plt.subplot(233), plt.imshow(imgGreen, cmap='gray'), plt.title("Green channel level"), plt.axis('off')
plt.subplot(234), plt.imshow(binaryInv, cmap='gray'), plt.title("inv-binary mask"), plt.axis('off')
plt.subplot(235), plt.imshow(cv2.cvtColor(imgMatte, cv2.COLOR_BGR2RGB)), plt.title("Matting Image"), plt.axis('off')
plt.subplot(236), plt.imshow(cv2.cvtColor(imgReplace, cv2.COLOR_BGR2RGB)), plt.title("BgColor changed"), plt.axis('off')
plt.tight_layout()
plt.show()

使用固定阈值方法对单色背景图像抠图的结果如图3.1~图3.3所示。

图中:inv-binary mask为生成的掩膜图像,Matting Image为生成的目标前景图像,BgColor changed为合成的抠图图像。

需要说明的是,图中的结果并不是将原始图像转换为灰度图像进行阈值处理,而是提取原始图像的绿色通道(imaGreen)处理的结果。由于原始图像的背景就是绿色,使用图像绿色通道进行阈值处理,其性能比灰度图像得到了显著提高。

(1)使用固定阈值方法对单色背景图像抠图,可以取得比较满意的结果;
(2)阈值设置对蓝屏抠图的性能影响较大,图3.1~图3.3分别是阈值设置为220、230、245时的实验结果。

由以上三组图片对比可以看到,阈值较大时的掩膜图像较为精确完整,而阈值降低后的掩膜图像质量降低。

固定阈值方法对于蓝色/绿色/红色背景的图像抠图的性能较好,但对于自然背景图像处理比较困难。


在这里插入图片描述
图3.1 固定阈值抠图法(阈值=245)


在这里插入图片描述
图3.2 固定阈值抠图法(阈值=230)


在这里插入图片描述

图3.3 固定阈值抠图法(阈值=220)

【本节完】


版权声明:

欢迎关注『Python 小白的项目实战 @ youcans』 原创作品

原创作品,转载必须标注原文链接:https://blog.csdn.net/youcans/article/details/122306621

Copyright 2022 youcans, XUPT

Crated:2022-01-05


欢迎关注『Python 小白从零开始 PyQt5 项目实战 @ Youcans』系列,持续更新中
Python 小白的课题报告—OpenCV 抠图项目实战(1)目录摘要
Python 小白的课题报告—OpenCV 抠图项目实战(2)抠图绪论
Python 小白的课题报告—OpenCV 抠图项目实战(3)抠图综述
Python 小白的课题报告—OpenCV 抠图项目实战(4)固定阈值抠图
Python 小白的课题报告—OpenCV 抠图项目实战(5)自适应阈值抠图
Python 小白的课题报告—OpenCV 抠图项目实战(6)色彩范围抠图
Python 小白的课题报告—OpenCV 抠图项目实战(7)边缘检测
Python 小白的课题报告—OpenCV 抠图项目实战(8)图像轮廓
Python 小白的课题报告—OpenCV 抠图项目实战(9)评价指标
Python 小白的课题报告—OpenCV 抠图项目实战(10)PyQt5 使用
Python 小白的课题报告—OpenCV 抠图项目实战(11)算法实验平台
Python 小白的课题报告—OpenCV 抠图项目实战(12)源程序代码