【繪制圖像輪廓】——圖像預處理(OpenCV)

目錄

1 什么是輪廓

2 尋找輪廓

2.1 mode參數

2.2 method參數

3 繪制輪廓


1 什么是輪廓

輪廓是一系列相連的點組成的曲線,代表了物體的基本外形。輪廓是連續的,邊緣不一定連續。輪廓是一個閉合的、封閉的形狀。

輪廓的作用

  • 形狀分析

  • 目標識別

  • 圖像分割

2 尋找輪廓

在OpenCV中,使用cv2.findContours()來進行尋找輪廓,具體的實現原理可參考:

https://zhuanlan.zhihu.com/p/107257870

尋找輪廓需要將圖像做一個二值化處理,并且根據圖像的不同選擇不同的二值化方法來將圖像中要繪制輪廓的部分置為白色,其余部分置為黑色。如下圖所示。

之后,對圖像中的像素進行遍歷,當一個白色像素相鄰(上下左右及兩條對角線)位置有黑色像素存在或者一個黑色像素相鄰(上下左右及兩條對角線)位置有白色像素存在時,那么該像素點就會被認定為邊界像素點,輪廓就是有無數個這樣的邊界點組成的。

下面具體介紹一下cv2.findContours()函數,其函數原型為:

contours,hierarchy = cv2.findContours(image,mode,method)
  • 返回值:[ 輪廓點坐標 ] 和 [ 層級關系 ]。

  • contours:表示獲取到的輪廓點的列表。檢測到有多少個輪廓,該列表就有多少子列表,每一個子列表都代表了一個輪廓中所有點的坐標。

  • hierarchy:表示輪廓之間的關系。對于第i條輪廓,hierarchy[i][0], hierarchy[i][1] , hierarchy[i][2] , hierarchy[i][3]分別表示其后一條輪廓、前一條輪廓、(同層次的第一個)子輪廓、父輪廓的索引(如果沒有相應的輪廓,則對應位置為-1)。該參數的使用情況會比較少。

  • image:表示輸入的二值化圖像。

  • mode:表示輪廓的檢索模式。

  • method:輪廓的表示方法。

2.1 mode參數

輪廓查找方式。返回不同的層級關系。

mode參數共有四個選項分別為:RETR_LIST,RETR_EXTERNAL,RETR_CCOMP,RETR_TREE。

1. RETR_EXTERNAL

表示只查找最外層的輪廓。并且在hierarchy里的輪廓關系中,每一個輪廓只有前一條輪廓與后一條輪廓的索引,而沒有父輪廓與子輪廓的索引。

2. RETR_LIST

表示列出所有的輪廓。并且在hierarchy里的輪廓關系中,每一個輪廓只有前一條輪廓與后一條輪廓的索引,而沒有父輪廓與子輪廓的索引。

3. RETR_CCOMP

表示列出所有的輪廓。并且在hierarchy里的輪廓關系中,輪廓會按照成對的方式顯示。

RETR_CCOMP 模式下,輪廓被分為兩個層級:

  • 層級 0:所有外部輪廓(最外層的邊界)。

  • 層級 1:所有內部輪廓(孔洞或嵌套的區域)。

4. RETR_TREE

表示列出所有的輪廓。并且在hierarchy里的輪廓關系中,輪廓會按照樹的方式顯示,其中最外層的輪廓作為樹根,其子輪廓是一個個的樹枝。

2.2 method參數

輪廓存儲方法。輪廓近似方法。決定如何簡化輪廓點的數量。就是找到輪廓后怎么去存儲這些點。

method參數有三個選項:CHAIN_APPROX_NONE、CHAIN_APPROX_SIMPLE、CHAIN_APPROX_TC89_L1。

  • CHAIN_APPROX_NONE表示將所有的輪廓點都進行存儲

  • CHAIN_APPROX_SIMPLE表示只存儲有用的點,比如直線只存儲起點和終點,四邊形只存儲四個頂點,默認使用這個方法;

對于mode和method這兩個參數來說,一般使用RETR_EXTERNAL和CHAIN_APPROX_SIMPLE這兩個選項。

3 繪制輪廓

輪廓找出來后,其實返回的是一個輪廓點坐標的列表,因此我們需要根據這些坐標將輪廓畫出來,因此就用到了繪制輪廓的方法。

cv2.drawContours(image, contours, contourIdx, color, thickness)
  • image:原始圖像,一般為單通道或三通道的 numpy 數組。

  • contours:包含多個輪廓的列表,每個輪廓本身也是一個由點坐標構成的二維數組(numpy數組)。

  • contourIdx:要繪制的輪廓索引。如果設為 -1,則會繪制所有輪廓。根據索引找到輪廓點繪制出來。默認是-1。

  • color:繪制輪廓的顏色,可以是 BGR 值或者是灰度值(對于灰度圖像)。

  • thickness:輪廓線的寬度,如果是正數,則畫實線;如果是負數,則填充輪廓內的區域。

案例:

import cv2 as cv
# 讀圖,轉灰度
img = cv.imread("./images/num.png")
number = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 二值化
ret,binary = cv.threshold(number,127,255,cv.THRESH_BINARY_INV)
# 查找輪廓: [輪廓列表],[層級關系] = cv2.findCountours(img,mode(如何找),method(如何存))
counters,h = cv.findContours(binary,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
# 繪制輪廓:cv.drawContours(img,counters,-1(要繪制輪廓的索引),color,thickness)
cv.drawContours(img,counters,-1,(0,255,0),2)
# 顯示原圖
cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()
print(counters)
print("---------")
print(h)

輸出:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91492.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91492.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91492.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

嵌入式 Linux 深度解析:架構、原理與工程實踐(增強版)

嵌入式 Linux 深度解析:架構、原理與工程實踐(增強版) 目錄嵌入式 Linux 深度解析:架構、原理與工程實踐(增強版)第一章 嵌入式 Linux 基礎概念1.1 定義與核心特征1.2 典型架構棧深度解析第二章 Linux 文件…

xcode swift項目運行、連接真機運行報錯,引入文件夾失敗

最近亂七八糟解決了很多報錯,看著記錄點吧 xcode版本:16 failed to emit precompiled header ‘/Users/yuqing/Library/Developer/Xcode/DerivedData/cloudspace-ios-ejldldcfhouqnretchuzoewmsqkg/Build/Intermediates.noindex/PrecompiledHeaders/spic…

[python][selenium] Web UI自動化8種頁面元素定位方式

測試工程師必備!Selenium自動化測試全攻略 | 手寫POM框架數據驅動,輕松搞定UI自動化!簡單的加個前置知識: 第一:webdriver.Chrome()這句話,通過WebDriver的構造方法,拿到瀏覽器驅動的對象&…

絲桿支撐座在電子裝配中的關鍵作用

絲桿支撐座是電子裝配過程中不可或缺的組件,主要用于支撐和固定絲桿,確保其穩定性和精度。在高速、高精度裝配場景中,絲桿支撐座的作用尤為突出。穩定性與精度保障:絲桿支撐座采用高品質鋼材制作,具有高剛性和高強度&a…

微信小程序頁面間通信的實現方式

微信小程序中頁面間的通信是指不同頁面之間的數據傳遞、狀態同步或交互操作,常見于多頁面協作場景。根據通信方向和場景不同,主要有以下幾種實現方式:一、基于頁面跳轉的參數傳遞1. 正向傳遞(A頁面到B頁面)通過URL參數…

uniapp開發微信小程序(新舊版本對比:授權手機號登錄、授權頭像和昵稱)

目錄標題授權手機號新舊版本核心差異對比強制使用新版的情況代碼實現方案特殊處理邏輯企業賬號要求最佳實踐建議授權頭像和昵稱新舊版本核心差異對比強制使用新版的情況代碼實現方案最佳實踐建議注意事項授權手機號 新舊版本核心差異對比 觸發方式 舊版(2023年前&…

Java函數式編程之【Stream終止操作】【下】【三】【收集操作collect()與分組分區】【下游收集器】

分組收集器groupingBy():groupingBy()收集器用于按條件對元素象進行分組,并將結果存儲在Map實例中。其作用與數據庫的SQL語句的group by的用法有異曲同工之妙。 分區收集器partitioningBy():partitioningBy()可以看作是分組groupingBy()的特殊…

python設計模式-工廠模式

工廠模式的核心思想:封裝對象創建過程、解耦對象使用與創建 。示例代碼:from enum import Enum# 基類:人類 class Person:species Homo sapiensdef __init__(self, name):self.name namedef __str__(self):return f"{self.__class__._…

Rust:anyhow::Result 與其他 Result 類型轉換

當函數返回的不是 anyhow::Result 而是其他 Result 類型時(如 std::io::Result、serde_json::Result 或自定義 Result),可通過以下方法統一處理錯誤類型,確保與 anyhow 兼容或實現錯誤傳播:🛠? 一、錯誤類…

PLC-梯形圖編程

1.位運算,比較 如&#xff1a;>,<,, 2.定時器 生成脈沖TP&#xff0c;常開觸點閉合觸發&#xff0c;賦值10秒時長&#xff0c;PT配置參數&#xff0c;ET運行時已PT計時 接通延時TON&#xff0c;常開觸點閉合觸發&#xff0c;延時10秒后賦值 關斷延時TOF&#xff0c;常開觸…

LLM學習筆記5——InstructGPT

系列文章目錄 參考文獻 參考文獻 參考文獻 參考視頻 文章目錄系列文章目錄前言目前大模型不同的技術流派與框架路線&#xff1a;1. ??BERT&#xff1a;Encoder-only架構????1&#xff09; 架構特點????2&#xff09; 訓練目標??3&#xff09; ????應用場景2. …

熱能小車cad【12張】三維圖+設計說明書

摘要 無碳小車來自全國大學生工程能力訓練大賽題目&#xff0c;根據“節能減排&#xff0c;綠色出行”的環保理念&#xff0c;提出了一種基于熱力驅動的具有方向自動控制的無碳小車。 本文設計的無碳小車主要是將熱能轉化成機械能&#xff0c;用來驅動小車前進的裝置&#xff0…

云原生 DevOps 實戰之Jenkins+Gitee+Harbor+Kubernetes 構建自動化部署體系

技術背景? 在云原生生態中&#xff0c;工具鏈的選擇直接決定 CI/CD 流水線的效率與穩定性。本次方案的工具組合并非偶然&#xff0c;而是基于各組件的核心優勢與生態適配性&#xff1a;? 代碼管理層&#xff1a;Gitee 作為國內主流的代碼托管平臺&#xff0c;支持 Git 分布…

二建機電工程專業都考哪些知識點?

二建機電工程專業需要考《建設工程施工管理》《建設工程法規及相關知識》和《機電工程管理與實務》三個科目。其中《機電工程管理與實務》是專業科目&#xff0c;也是考試重點&#xff0c;主要考查機電工程技術、機電工程相關法規與標準、機電工程項目管理實務等內容。具體如下…

React + ts + react-webcam + CamSplitter 實現虛擬攝像頭解決win攝像頭獨占的問題

一、安裝 CamSplitter 這塊網上有很多教程了&#xff0c;這里不再贅述&#xff0c;就一點&#xff0c;需要分幾個虛擬攝像頭&#xff0c;就要在CamSplitter 的安裝目錄下 driver_install.cmd 執行幾次。二、React ts react-webcam 調用虛擬攝像頭import { useState, useEffec…

【深度學習①】 | Numpy數組篇

0 序言 本文為NumPy數組庫的系統學習筆記&#xff0c;將自己先前的筆記做一個總結歸納。內容涵蓋數組基礎、創建、索引、變形、運算、函數、布爾型數組及與張量的銜接等內容。通過具體示例解析核心概念與操作&#xff0c;幫助讀者掌握NumPy的使用邏輯與方法&#xff0c;為后續深…

5.實現 call

call 是 JavaScript 中非常核心的函數方法之一。它能改變函數的執行上下文&#xff08;也就是 this 的指向&#xff09;&#xff0c;在日常開發和面試中都極其常見。本文將帶你一步步實現一個 Function.prototype.call 的自定義版本&#xff0c;真正理解它的底層原理。? 一、c…

Go語言中的盲點:競態檢測和互斥鎖的錯覺

&#x1f9e0; Go語言中的盲點&#xff1a;競態檢測和互斥鎖的錯覺 使用 -race 就能發現所有并發問題&#xff1f;加了 mutex 就萬無一失&#xff1f; 這篇文章揭示了 Go 并發編程中的一個“危險盲區” —— 互斥鎖并不能總能保護你免受數據競爭的影響&#xff0c;尤其是在 -ra…

從文件到文件描述符:理解程序與文件的交互本質

一、理解文件 拋一個概念&#xff1a; 文件 內容 屬性。 1. 那么&#xff0c;空文件有大小嗎&#xff1f;答案是有的。因為空文件指的是文件內容為空&#xff0c;文件屬性也要占據大小啊。 將來對文件操作&#xff0c;無非分為兩類&#xff1a; 1.對文件內容做修改。 2.對文件…

優化算法專欄——閱讀導引

前言 提醒&#xff1a; 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布&#xff0c;其中引用內容都會使用鏈接表明出處&#xff08;如有侵權問題&#xff0c;請及時聯系&#xff09;。 其中內容多為一次書寫&#xff0c;缺少檢查與訂正&#xff0c;如有問題或其他拓展…