【课题总结】OpenCV 抠图项目实战(8)图像轮廓
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)源程序代碼
總結
以上是生活随笔為你收集整理的【课题总结】OpenCV 抠图项目实战(8)图像轮廓的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用一个环境的或者半径异样消除器来进行异
- 下一篇: 【OpenCV 例程200篇】47. 图