课题总结报告OpenCV 抠图项目实战
Posted 小白YouCans
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了课题总结报告OpenCV 抠图项目实战相关的知识,希望对你有一定的参考价值。
Python 小白的课题报告—OpenCV 抠图项目实战(5)
本系列是 Python 小白的课题作业《基于OpenCV 的图像分割和抠图》。
需要说明的是,本系列并不能算是 OpenCV 的抠图项目教程,只是以此为主题的课题报告。其中包括了一个较为完整的 PyQt 项目。
从学生课题作业报告的角度,还是可以晒出来给大家参考的。
欢迎关注『Python 小白的项目实战 @ youcans』 原创作品
Python 小白的课题报告—OpenCV 抠图项目实战(1)
Python 小白的课题报告—OpenCV 抠图项目实战(2)
Python 小白的课题报告—OpenCV 抠图项目实战(3)
Python 小白的课题报告—OpenCV 抠图项目实战(4)
Python 小白的课题报告—OpenCV 抠图项目实战(5)
Python 小白的课题报告—OpenCV 抠图项目实战(6)
第三章 阈值抠图
阈值处理方法直观简单,是一种基本的图像分割方法。
根据图像的整体或部分信息适当选择阈值,像素值高于阈值时设为1/255,低于阈值时设为0,以此将图像中感兴趣的区域筛选出来生成掩模,再与原图像合成即可得到抠图图像。
由于待处理图像的灰度级数与其灰度直方图是不确定的,对于不同的图像、不同的目标前景,需要选取适当的阈值处理方法进行图像分割。本章采用固定阈值、自适应阈值与色彩范围三种方法进行图像抠图处理。
3.2 自适应阈值抠图
在图像抠图的应用中,噪声和非均匀光照等因素会影响阈值算法的性能。对于很多图像,使用固定阈值难以获得理解的抠图效果,就需要使用自适应阈值处理方法,使用可变阈值处理。
自适应阈值处理可以根据图像不同区域的亮度分布,使用高斯滤波、移动平均等方法计算其局部阈值,以此得到抠图图像。
OpenCV 提供了函数 cv.adaptivethreshold()实现图像的阈值处理。
函数说明:
cv.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) → dst
参数说明:
- scr:输入图像,8位单通道图像
- dst:输出图像,大小和类型与输入图像相同
- maxValue:二值处理的最大值设置,通常为255
- adaptiveMethod:自适应阈值算法
- cv.ADAPTIVE_THRESH_MEAN_C:阈值为矩形邻域像素值的均值
- cv.ADAPTIVE_THRESH_GAUSSIAN_C:阈值为矩形邻域像素值的加权均值,默认权值服从高斯分布
- thresholdType:阈值类型,可选项THRESH_BINARY或THRESH_BINARY_INV
- blockSize:自适应计算的邻域大小,如:3, 5, 7等
- C:偏移量
使用自适应阈值进行图像抠图的基本程序如下:
# MattingAdaptThresh.py
# Copyright 2021 youcans, XUPT
# Crated:2021-12-10
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 1. 读取原始图像
imgOri = cv2.imread("../images/lady983Green.jpg") # 读取原始图像
height, width, 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 = 245 # 绿屏背景的颜色阈值 (注意研究阈值的影响)
# ret, binary = cv2.threshold(imgGreen, colorThresh, 255, cv2.THRESH_BINARY) # 转换为二值图像,生成遮罩,抠图区域黑色遮盖
# 自适应阈值化能够根据图像不同区域亮度分布自适应地改变阈值
# cv.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst
# 参数 adaptiveMethod: ADAPTIVE_THRESH_MEAN_C(均值法), ADAPTIVE_THRESH_GAUSSIAN_C(高斯法)
# 参数 thresholdType: THRESH_BINARY(小于阈值为0), THRESH_BINARY_INV(大于阈值为0)
# 参数 blockSize: 邻域大小,正奇数
# 参数 C: 偏移量,一般取 0
binary = cv2.adaptiveThreshold(imgGreen, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 5, 0)
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(binary, cmap='gray'), plt.title("binary mask"), plt.axis('off')
plt.subplot(235), plt.imshow(binaryInv, cmap='gray'), plt.title("inv-binary mask"), plt.axis('off')
plt.subplot(236), plt.imshow(cv2.cvtColor(imgReplace, cv2.COLOR_BGR2RGB)), plt.title("BgColor changed"), plt.axis('off')
plt.tight_layout()
使用自适应阈值方法对单色背景图像抠图的结果如图3.4所示。
对于确定颜色背景的蓝屏抠图,自适应阈值方法的结果并没有更好,但是仍然能很好地提取图像特征,如果使用其它方法进一步进行处理,也可以得到满意的抠图效果。
而对于自然背景图像抠图,自适应阈值方法的性能优于固定阈值方法。
图3.4 自适应阈值抠图法
【本节完】
版权声明:
欢迎关注『Python 小白的项目实战 @ youcans』 原创作品
原创作品,转载必须标注原文链接:https://blog.csdn.net/youcans/article/details/122296231
Copyright 2022 youcans, XUPT
Crated:2022-01-01
欢迎关注『Python 小白的项目实战 @ youcans』 原创作品
Python 小白的课题报告—OpenCV 抠图项目实战(1)
Python 小白的课题报告—OpenCV 抠图项目实战(2)
Python 小白的课题报告—OpenCV 抠图项目实战(3)
Python 小白的课题报告—OpenCV 抠图项目实战(4)
Python 小白的课题报告—OpenCV 抠图项目实战(5)
Python 小白的课题报告—OpenCV 抠图项目实战(6)
以上是关于课题总结报告OpenCV 抠图项目实战的主要内容,如果未能解决你的问题,请参考以下文章