OpenCV:圖像輪廓

目錄

簡述

1. 什么是圖像輪廓?

2. 查找圖像輪廓

2.1 接口定義

2.2 參數說明

?2.3 代碼示例

2.4 運行結果

3. 繪制圖像輪廓

3.1 接口定義

3.2 參數說明

3.3 代碼示例

?3.4 運行結果

4. 計算輪廓周長

5. 計算輪廓面積

6. 示例:計算圖像輪廓的面積與周長

7. 應用場景


相關閱讀

OpenCV:多邊形逼近與凸包-CSDN博客


簡述

在圖像處理領域,輪廓是圖像中物體的邊界或形狀信息的表達方式。通過提取輪廓,可以對圖像中的目標進行識別、測量和分析。本文將從概念到實際操作詳細介紹圖像輪廓及其相關操作,并展示如何在 OpenCV 中實現。


1. 什么是圖像輪廓?

圖像輪廓?是圖像中物體邊界的閉合曲線,表示具有相同強度或顏色像素的連接路徑。它是一種重要的圖像特征,常用于形狀分析和對象檢測。

特點

  • 輪廓基于二值圖像計算,必須先將輸入圖像轉換為二值圖。
  • OpenCV 提供的輪廓查找算法將視圖像中的白色區域為前景(目標)。
  • 輪廓的方向可以是順時針或逆時針。

2. 查找圖像輪廓

OpenCV 提供了 cv2.findContours() 函數來查找圖像的輪廓。

2.1 接口定義

contours, hierarchy = cv2.findContours(image, mode, method)

2.2 參數說明

image:輸入的二值圖像(通常是灰度圖的閾值化結果)。
mode:輪廓的檢索模式,常見值:

  • cv2.RETR_EXTERNAL:只檢測最外層輪廓。
  • cv2.RETR_LIST:檢測所有輪廓,不建立層級關系。
  • cv2.RETR_TREE:檢測所有輪廓,并構建完整層級關系。

method:輪廓的近似方法:

  • cv2.CHAIN_APPROX_NONE:存儲所有的輪廓點。
  • cv2.CHAIN_APPROX_SIMPLE:只存儲必要的輪廓點,壓縮水平和垂直冗余點。

返回值:

  • contours:檢測到的輪廓列表,每個輪廓是一個 Numpy 數組。
  • hierarchy:每個輪廓的層級關系。

?2.3 代碼示例

import cv2# 讀取圖像并轉為灰度圖
image = cv2.imread('D:\\resource\\filter\\find_contours.png', cv2.IMREAD_GRAYSCALE)# 二值化
_, binary_img = cv2.threshold(image, 150, 255, cv2.THRESH_BINARY)# 輪廓查找
#contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print(contours)# 顯示圖像 
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

示例說明:

  • 當前示例使用的圖像為:白色背景,中間畫了一個黑色的矩形。
  • 用win11自帶的畫圖軟件畫出來的,并非純粹的黑白圖像,在代碼中最好進行二值化處理
  • 該示例的作用是將圖像中所有輪廓的必要點打印出來。

2.4 運行結果

?

打印結果顯示的是:圖像必要的輪廓點。

該圖像包含2個輪廓?:

  • 最外層的白色背景邊框。
  • 中間黑色矩形邊框。

3. 繪制圖像輪廓

OpenCV 提供了 cv2.drawContours() 函數用于繪制輪廓。

3.1 接口定義

cv2.drawContours(image, contours, contourIdx, color, thickness)

3.2 參數說明

image:目標圖像,輪廓將繪制在此圖像上。
contours:輪廓數據,cv2.findContours() 的輸出。
contourIdx:指定繪制的輪廓索引:

  • -1:繪制所有輪廓。
  • >=0:繪制特定索引的輪廓。

color:繪制輪廓的顏色(BGR 格式)。
thickness:線條粗細,-1 表示填充輪廓。

3.3 代碼示例

import cv2# 讀取圖像
image = cv2.imread('D:\\resource\\filter\\find_contours.png')# 轉為灰度圖
gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 二值化
_, binary_img = cv2.threshold(gray_img, 150, 255, cv2.THRESH_BINARY)# 輪廓查找
contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 繪制輪廓
result = cv2.drawContours(image, contours, -1, (0,0,255), 2)# 顯示圖像 
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

示例說明:

  • 依舊使用同一張圖片。
  • 該示例的作用是將圖像中所有的輪廓用紅色的線條繪制出來,其中線條的粗細數值為2。?

?3.4 運行結果

將圖像中所有的輪廓繪制出來:


    4. 計算輪廓周長

    OpenCV 提供了 cv2.arcLength() 函數計算輪廓的周長。

    接口定義

    perimeter = cv2.arcLength(curve, closed)

    參數說明

    • curve:輸入輪廓點。
    • closed:布爾值,是否將輪廓視為閉合曲線。

    返回值

    輪廓的周長(浮點數)。


    5. 計算輪廓面積

    OpenCV 提供了 cv2.contourArea() 函數計算輪廓的面積。

    接口定義:

    area = cv2.contourArea(contour)
    

    參數說明:

    • contour:輸入輪廓點。

    返回值

    輪廓的面積(浮點數)。


    6. 示例:計算圖像輪廓的面積與周長

    示例如下:?

    import cv2# 讀取圖像
    image = cv2.imread('D:\\resource\\filter\\find_contours.png')# 轉為灰度圖
    gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 二值化
    _, binary_img = cv2.threshold(gray_img, 150, 255, cv2.THRESH_BINARY)# 輪廓查找
    #contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    # print(contours)# 繪制輪廓
    #result = cv2.drawContours(image, contours, -1, (0,0,255), 2)# 計算面積
    area = cv2.contourArea(contours[1])
    print("area=%d"%(area))# 計算周長
    len = cv2.arcLength(contours[1], True)
    print("len=%d"%(len))# 顯示圖像 
    #cv2.imshow('image', image)
    #cv2.imshow('result', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    示例說明:

    • 依舊使用同一張圖像。
    • 查找圖像輪廓,取索引為1的輪廓。
    • 計算其面積與周長,并打印出來。

    ?打印輸出:

    PS D:\code\opencv_python> & "D:/Program Files/Python38-32/python.exe" d:/code/opencv_python/calc_contours.py
    area=35951
    len=769
    PS D:\code\opencv_python>

    7. 應用場景

    1. 目標檢測與識別:通過輪廓提取圖像中的特定對象。
    2. 形狀分析:計算周長、面積等幾何屬性。
    3. 物體測量:用于測量物體的尺寸和外觀特征。

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

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

    相關文章

    在Mac mini M4上部署DeepSeek R1本地大模型

    在Mac mini M4上部署DeepSeek R1本地大模型 安裝ollama 本地部署,我們可以通過Ollama來進行安裝 Ollama 官方版:【點擊前往】 Web UI 控制端【點擊安裝】 如何在MacOS上更換Ollama的模型位置 默認安裝時,OLLAMA_MODELS 位置在"~/.o…

    CVPR | CNN融合注意力機制,蕪湖起飛!

    **標題:**On the Integration of Self-Attention and Convolution **論文鏈接:**https://arxiv.org/pdf/2111.14556 **代碼鏈接:**https://github.com/LeapLabTHU/ACmix 創新點 1. 揭示卷積和自注意力的內在聯系 文章通過重新分解卷積和自…

    module ‘matplotlib.cm‘ has no attribute ‘get_cmap‘

    目錄 解決方法1: 解決方法2,新版api改了: module matplotlib.cm has no attribute get_cmap 報錯代碼: cmap matplotlib.cm.get_cmap(Oranges) 解決方法1: pip install matplotlib3.7.3 解決方法2,新版…

    使用Nuxt.js實現服務端渲染(SSR):提升SEO與性能的完整指南

    使用Nuxt.js實現服務端渲染(SSR):提升SEO與性能的完整指南 使用Nuxt.js實現服務端渲染(SSR):提升SEO與性能的完整指南1. 服務端渲染(SSR)核心概念1.1 CSR vs SSR vs SSG1.2 SSR工作原…

    解釋 Java 中的反射機制和動態代理的原理?

    反射機制是Java語言的一個特性,它允許程序在運行時檢查和操作類、方法、字段等。 通過反射,我們可以在運行時獲取類的信息,創建對象,調用方法和訪問字段,即使這些信息在編譯時是未知的。 反射的基本用法 import jav…

    http狀態碼:504 Gateway Timeout(網關超時)的原有以及排查問題的思路

    504 Gateway Timeout(網關超時) 是一種常見的HTTP錯誤狀態碼,表示服務器作為網關或代理時,未能及時從上游服務器收到響應。以下是它的原因和排查問題的思路: 1. 504錯誤的含義 定義:服務器作為網關或代理時…

    Linux 安裝 RabbitMQ

    Linux下安裝RabbitMQ 1 、獲取安裝包 # 地址 https://github.com/rabbitmq/erlang-rpm/releases/download/v21.3.8.9/erlang-21.3.8.9-1.el7.x86_64.rpm erlang-21.3.8.9-1.el7.x86_64.rpmsocat-1.7.3.2-1.el6.lux.x86_64.rpm# 地址 https://github.com/rabbitmq/rabbitmq-se…

    LOCAL_PREBUILT_JNI_LIBS使用說明

    LOCAL_PREBUILT_JNI_LIBS使用說明 使用LOCAL_PREBUILT_JNI_LIBS,可用于控制APK集成時,其相關so的集成方式。 比如,用于將APK中的so,抽取出來。 LOCAL_PREBUILT_JNI_LIBS : \lib/arm64-v8a/libNativeCore.so \lib/arm64-v8a/liba…

    Java中的object類

    1.Object類是什么? 🟪Object 是 Java 類庫中的一個特殊類,也是所有類的父類(超類),位于類繼承層次結構的頂端。也就是說,Java 允許把任何類型的對象賦給 Object 類型的變量。 🟦Java里面除了Object類,所有的…

    uniapp小程序自定義中間凸起樣式底部tabbar

    我自己寫的自定義的tabbar效果圖 廢話少說咱們直接上代碼,一步一步來 第一步: 找到根目錄下的 pages.json 文件,在 tabBar 中把 custom 設置為 true,默認值是 false。list 中設置自定義的相關信息, pagePath&#x…

    四、GPIO中斷實現按鍵功能

    4.1 GPIO簡介 輸入輸出(I/O)是一個非常重要的概念。I/O泛指所有類型的輸入輸出端口,包括單向的端口如邏輯門電路的輸入輸出管腳和雙向的GPIO端口。而GPIO(General-Purpose Input/Output)則是一個常見的術語&#xff0c…

    vscode+CMake+Debug實現 及權限不足等諸多問題匯總

    環境說明 有空再補充 直接貼兩個json tasks.json {"version": "2.0.0","tasks": [{"label": "cmake","type": "shell","command": "cmake","args": ["../"…

    【Elasticsearch】post_filter

    post_filter是 Elasticsearch 中的一種后置過濾機制,用于在查詢執行完成后對結果進行過濾。以下是關于post_filter的詳細介紹: 工作原理 ? 查詢后過濾:post_filter在查詢執行完畢后對返回的文檔集進行過濾。這意味著所有與查詢匹配的文檔都…

    《數據可視化新高度:Graphy的AI協作變革》

    在數據洪流奔涌的時代,企業面臨的挑戰不再僅僅是數據的收集,更在于如何高效地將數據轉化為洞察,助力決策。Graphy作為一款前沿的數據可視化工具,憑借AI賦能的團隊協作功能,為企業打開了數據協作新局面,重新…

    Vue 2 與 Vue 3 的主要區別

    Vue.js 是一個流行的前端框架,用于構建用戶界面和單頁應用。自從 Vue 2 發布以來,社區對其進行了廣泛的應用和擴展,而 Vue 3 的發布則帶來了許多重要的改進和新特性。 性能提升 Vue 3 在響應式系統上進行了重大的改進,采用了基于…

    從零開始:用Qt開發一個功能強大的文本編輯器——WPS項目全解析

    文章目錄 引言項目功能介紹1. **文件操作**2. **文本編輯功能**3. **撤銷與重做**4. **剪切、復制與粘貼**5. **文本查找與替換**6. **打印功能**7. **打印預覽**8. **設置字體顏色**9. **設置字號**10. **設置字體**11. **左對齊**12. **右對齊**13. **居中對齊**14. **兩側對…

    【IoCDI】_Spring的基本掃描機制

    目錄 1. 創建測試項目 2. 改變啟動類所屬包 3. 使用ComponentScan 4. Spring基本掃描機制 程序通過注解告訴Spring希望哪些bean被管理,但在僅使用Bean時已經發現,Spring需要根據五大類注解才能進一步掃描方法注解。 由此可見,Spring對注…

    vue 引入百度地圖和高德天氣 都得獲取權限

    vue接入百度地圖---獲取ak https://blog.csdn.net/qq_57144407/article/details/143430661 vue接入高德天氣, 需要授權----獲取key https://www.jianshu.com/p/09ddd698eebe

    通向AGI之路:人工通用智能的技術演進與人類未來

    文章目錄 引言:當機器開始思考一、AGI的本質定義與技術演進1.1 從專用到通用:智能形態的范式轉移1.2 AGI發展路線圖二、突破AGI的五大技術路徑2.1 神經符號整合(Neuro-Symbolic AI)2.2 世界模型架構(World Models)2.3 具身認知理論(Embodied Cognition)三、AGI安全:價…

    python中的命名規范

    在python中,命名規范是編寫清晰,可讀性強代碼的重要部分,遵循這些規范可以使代碼更易于理解和維護。 Type命名約定命名例子函數(Function)小寫單詞,下劃線分割單詞function,delta_function方法&#xff08…