Python 小白的课题报告—OpenCV 抠图项目实战(8)
本系列是 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)源程序代码
第四章 图像分割
4.2 提取轮廓特征
轮廓特征是图像中的重要特征。在进行视觉检测的时候,常常利用轮廓特征来达到我们要检测的目的。
轮廓即是以某种方式表示图像中的曲线的点的列表。
轮廓与边缘很相似。但轮廓是连续的,边缘不一定都连续。可以说边缘包括轮廓。边缘主要是作为图像的特征使用,比如用边缘特征可以区分脸和手;而轮廓主要用来分析物体的形态,比如物体的周长和面积等。轮廓常用于形状分析和物体的检测和识别。
寻找轮廓的操作一般用于二值化图,所以通常会使用阈值分割或 Canny 边缘检测先得到二值图。
OpenCV 中提供了函数cv.findContours()寻找轮廓,函数cv.drawContours() 绘制轮廓。在 OpenCV 中查找轮廓就像在黑色背景中找白色物体。
函数说明:
···
cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]] ) → contours, hierarchy
···
参数说明:
- image:原始图像,8 位单通道二值图像
- mode: 轮廓检索模式
- cv.RETR_EXTERNAL:只检索最外层轮廓
- cv.RETR_LIST:检索所有轮廓,不建立任何层次关系
- cv.RETR_CCOMP:检索所有轮廓,并将其组织为两级层次结构
- cv.RETR_TREE:检索所有轮廓,并重建嵌套轮廓的完整层次结构
- cv.RETR_FLOODFILL:漫水填充法(泛洪填充)
- method: 轮廓近似方法
- cv.CHAIN_APPROX_NONE:存储每个轮廓的所有像素点
- cv.CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线段,仅保留其端点
- cv.CHAIN_APPROX_TC89_L1:应用 Teh-Chin 链近似算法 L1
- cv.CHAIN_APPROX_TC89_KCOS:应用 Teh-Chin 链近似算法 KCOS
- contours:检测到的轮廓,列表,储存图像中所有轮廓,每个轮廓存储为点的向量
- hierarchy:轮廓的层次结构,可选项,包含有关图像拓扑的信息
- offset:每个轮廓点的偏移量,可选项,
使用 findContours()和cv.drawContours()查找、绘制轮廓的基本程序如下:
# MattingFindContours.py
# Find contour by OpenCV
# Copyright 2021 youcans, XUPT
# Crated:2021-12-10
import cv2 as cv
from matplotlib.figure import FigureimgOri = cv2.imread("../images/imgGaia.tif", flags=1)imgGray = cv2.cvtColor(imgOri, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgGray, 175, 255, cv2.THRESH_BINARY_INV)
# 寻找二值化图中的轮廓
image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print(imgOri.shape, image.shape)# 绘制轮廓
imgC = imgOri.copy()
contourPic = cv2.drawContours(imgC, contours, -1, (0, 0, 255), 2)plt.figure(figsize=(9, 6))
plt.subplot(131), plt.axis('off'), plt.title("Origin")
plt.imshow(cv2.cvtColor(imgOri, cv2.COLOR_BGR2RGB))
plt.subplot(132), plt.title("Threshold"), plt.axis('off')
plt.imshow(thresh, cmap='gray', vmin=0, vmax=255)
plt.subplot(133), plt.title("Contours"), plt.axis('off')
plt.imshow(cv2.cvtColor(contourPic, cv2.COLOR_BGR2RGB))
plt.tight_layout()
plt.show()
使用findContours()提取轮廓特征的结果如下图所示。
图4.4 提取轮廓特征
4.3 图像分割
图像分割是抠图的理论基础。
图像分割是指根据灰度、颜色、纹理和形状等特征把图像划分成若干互不交迭的区域,并使这些特征在同一区域内呈现出相似性,而在不同区域间呈现出明显的差异性。
基于阈值的分割方法,基本思想是基于图像的灰度特征来计算一个或多个灰度阈值,并将图像中每个像素的灰度值与阈值相比较,最后将像素根据比较结果分到合适的类别中。因此,该类方法最为关键的一步就是按照某个准则函数来求解最佳灰度阈值。
基于边缘的分割方法是基于灰度值的边缘检测。
基于区域的分割方法,是将图像按照相似性准则分成不同的区域,主要包括种子区域生长法、区域分裂合并法和分水岭法等几种类型。
【本节完】
版权声明:
欢迎关注『Python 小白的项目实战 @ youcans』 原创作品
原创作品,转载必须标注原文链接:https://blog.csdn.net/youcans/article/details/122372133
Copyright 2022 youcans, XUPT
Crated:2022-01-05
欢迎关注『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)源程序代码