實戰項目-----在圖片 hua.png 中,用紅色畫出花的外部輪廓,用綠色畫出其簡化輪廓(ε=周長×0.005),并在同一窗口顯示

實戰項目實現以下功能:

對圖片 hua.png 進行輪廓提取,并在同一窗口中完成以下兩個繪制操作:

  1. 用紅色畫出花的外部輪廓(即最外層輪廓)

  2. 用綠色畫出該輪廓的近似多邊形,其中近似精度參數 ε 設置為輪廓周長的 0.005

項目完整代碼:

import cv2
hua = cv2.imread('picture/hua.png')#讀取原圖
hua_gray = cv2.cvtColor(hua,cv2.COLOR_BGR2GRAY)#灰度圖的處理
cv2.imshow('hua_b',hua_gray)
cv2.waitKey(0)
# hua_gray=cv2.imread('hua.png',0)  #讀取灰度圖
ret, hua_binary = cv2.threshold(hua_gray, 240, 255, cv2.THRESH_BINARY_INV)#閾值處理為二值
cv2.imshow('hua_binary',hua_binary)
cv2.waitKey(0)
_,contours, hierarchy = cv2.findContours(hua_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  #cv2.RETR_EXTERNAL:只檢測外輪廓(黑底),所有子輪廓被忽略
# _,contours, hierarchy = cv2.findContours(hua_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# sortcnt=contours[0]
print(len(contours))# image_copy = hua.copy()
# cv2.drawContours(image=image_copy, contours=contours, contourIdx=-1,color=(0,255,0),thickness=2)
# cv2.imshow('Contours_show', image_copy)
# cv2.waitKey(0)image_copy = hua.copy()
sortcnt = sorted(contours, key=cv2.contourArea, reverse=True)[0]  # 選取最大面積的輪廓
image_contours = cv2.drawContours(image_copy,[sortcnt],contourIdx=-1,color=(0,0,255),thickness=3)#繪制輪廓
cv2.imshow('image_contours',image_contours)
cv2.waitKey(0)epsilon = 0.005  * cv2.arcLength(sortcnt,True)        #設置近似精度   【h要<ε;ε越小,點越多,越精確】
approx = cv2.approxPolyDP(sortcnt, epsilon, True)   #對輪廓進行近似
print(sortcnt.shape)
print(approx.shape)image_contours = cv2.drawContours(image_copy,[approx],contourIdx=-1,color=(0,255,0),thickness=3)#繪制輪廓
cv2.imshow('image_contours',image_contours)
cv2.waitKey(0)

整體功能概述

此代碼實現了以下核心功能:

  1. 圖像預處理 → 灰度轉換 + 反向二值化
  2. 輪廓檢測 → 提取所有輪廓并篩選最大面積輪廓
  3. 輪廓可視化 → 繪制原始輪廓與多邊形逼近結果
  4. 幾何簡化 → 使用 Douglas-Peucker 算法對輪廓進行多點精簡

?模塊 1: 圖像加載與預處理

import cv2
hua = cv2.imread('picture/hua.png')          # ① 讀取原圖
hua_gray = cv2.cvtColor(hua, cv2.COLOR_BGR2GRAY)  # ② 轉為灰度圖
cv2.imshow('hua_b', hua_gray)                 # ③ 顯示灰度圖
cv2.waitKey(0)                               # ④ 暫停等待按鍵
關鍵點解析:
  • 灰度轉換必要性:減少顏色干擾,聚焦亮度信息,提升后續二值化效果
  • cv2.COLOR_BGR2GRAY:OpenCV 默認 BGR 色彩空間,此處正確轉換
  • 可視化驗證:通過 imshow 確保灰度轉換無誤

模塊 2: 二值化處理

ret, hua_binary = cv2.threshold(hua_gray, 240, 255, cv2.THRESH_BINARY_INV)  # ⑤ 反向二值化
cv2.imshow('hua_binary', hua_binary)           # ⑥ 顯示二值圖
cv2.waitKey(0)
關鍵參數詳解
參數說明
thresh=240閾值像素值 >240 → 設為255(白);≤240 → 設為0(黑)
maxval=255飽和值超過閾值時的賦值上限
THRESH_BINARY_INV反向模式關鍵! 將高亮區域變為黑色背景,低亮區域變為白色前景

為何選擇反向模式?
如果花朵主體比背景更暗(常見情況),正向二值化會使背景變白,導致輪廓斷裂。反向模式可保留暗色前景的完整性。

模塊 3: 輪廓檢測

_, contours, hierarchy = cv2.findContours(hua_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # ⑦ 檢測所有輪廓
print(len(contours))                                                                    # ⑧ 輸出輪廓數量
核心概念解析
  1. 三個返回值

    • _:忽略的 retval(通常無用)
    • contours:存儲所有輪廓點的列表(每個輪廓是一個 numpy 數組)
    • hierarchy:輪廓層級關系矩陣(父子兄弟關系)
  2. 關鍵參數

    • cv2.RETR_TREE:檢索所有輪廓并建立完整層級樹(包括嵌套輪廓)
    • cv2.CHAIN_APPROX_SIMPLE:壓縮水平/垂直方向連續點,僅保留端點

典型輪廓數量:若輸出 n,表示檢測到 n 個獨立輪廓(含嵌套結構)


模塊 4: 篩選最大面積輪廓

image_copy = hua.copy()                                  # ⑨ 創建原圖副本用于繪圖
sortcnt = sorted(contours, key=cv2.contourArea, reverse=True)[0]  # ⑩ 按面積降序排序,取最大輪廓
關鍵操作
  • cv2.contourArea():計算單個輪廓的面積(像素數)
  • sorted(..., reverse=True):按面積從大到小排序
  • [0]:取排序后的第一個元素(最大面積輪廓)

注意事項
如果圖像存在多個相似大小的物體,此方法可能無法穩定選取目標。建議結合位置/形狀特征進一步過濾。


模塊 5: 繪制原始輪廓

image_contours = cv2.drawContours(image_copy, [sortcnt], contourIdx=-1, color=(0,0,255), thickness=3)  # ? 繪制紅色輪廓
cv2.imshow('image_contours', image_contours)                                                 # ? 顯示結果
cv2.waitKey(0)
繪圖參數詳解
參數說明
imageimage_copy在原圖副本上繪制
contours=[sortcnt]僅繪制最大輪廓注意傳入的是單元素列表
contourIdx=-1繪制全部層級-1 表示繪制輪廓的所有層級
color=(0,0,255)純紅色BGR 格式
thickness=3線寬較大的線寬使輪廓更醒目

模塊 6: 多邊形逼近(幾何簡化)

epsilon = 0.005 * cv2.arcLength(sortcnt, True)      # ? 計算近似精度(基于輪廓周長)
approx = cv2.approxPolyDP(sortcnt, epsilon, True)    # ? 執行多邊形逼近
print(sortcnt.shape)                                 # ? 輸出原始輪廓點數
print(approx.shape)                                # ? 輸出逼近后點數
?核心算法解析
  1. 近似精度計算

    • cv2.arcLength(sortcnt, True):計算輪廓總長度(閉合路徑)
    • epsilon = 0.005 * 周長:控制逼近誤差容忍度(經驗值)
    • 原理:ε 越小,保留的細節越多;越大,簡化程度越高
  2. Douglas-Peucker 算法

    • 遞歸刪除偏離直線距離小于 ε 的中間點
    • closed=True:保證首尾相連形成閉合多邊形

點數對比示例
假設原始輪廓有 1000 個點 → 逼近后可能只剩 10-20 個頂點,大幅減少數據量


模塊 7: 繪制逼近輪廓

image_contours = cv2.drawContours(image_copy, [approx], contourIdx=-1, color=(0,255,0), thickness=3)  # ? 繪制綠色逼近輪廓
cv2.imshow('image_contours', image_contours)                                                # ? 顯示結果
cv2.waitKey(0)
可視化對比
顏色含義特點
紅色原始輪廓顯示實際邊緣細節
綠色多邊形逼近結果展示幾何簡化后的頂點分布

應用場景
可用于形狀識別(如判斷是否為多邊形)、尺寸測量、碰撞檢測等需要簡化幾何表示的場景


?常見問題與優化建議

  1. 二值化失效怎么辦?

    • 調整閾值(嘗試 127 或自適應閾值 adaptiveThreshold
    • 添加高斯模糊去噪:blurred = cv2.GaussianBlur(hua_gray, (5,5), 0)
  2. 輪廓斷裂如何處理?

    • 提高閾值使前景更連貫
    • 使用形態學操作連接斷開部分:kernel = np.ones((3,3), np.uint8); closed = cv2.morphologyEx(hua_binary, cv2.MORPH_CLOSE, kernel)
  3. 多目標場景改進方案

    # 過濾小面積噪聲
    min_area = 100  # 根據實際調整
    valid_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > min_area]
    

完整流程總結

讀取圖像 → 灰度轉換 → 反向二值化 → 檢測所有輪廓 → 篩選最大輪廓 → 繪制原始輪廓 → 多邊形逼近 → 繪制簡化輪廓

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

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

相關文章

開源鴻蒙北向框架開發:系統服務理論詳解

系統服務的啟動 基本可以認為:OpenHarmony 的系統服務進程都是“由 init 直接或間接拉起”的。 直接方式: init 按 /system/etc/init/.cfg 啟動可執行(如 /system/bin/sa_main、/system/bin/samgr 等),這些進程的 PPid…

龍虎榜——20250909

上證指數今天縮量收陰線,跌破10日均線,目前日線總體處于高位寬幅震蕩中,小級別暫未明確方向,指數面臨方向選擇,需要注意高位股的風險。 深證指數今天縮量收陰線,跌破5日均線,接下來幾天方向的選…

基于dijkstra算法的WSN網絡MAC協議matlab仿真,分析網絡延遲與網絡開銷

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.部分程序 4.算法理論概述 5.完整程序 1.程序功能描述 無線傳感器網絡(WSN, Wireless Sensor Network)是由大量低成本、低功耗的傳感器節點組成,通過無線通信實現數據采集、傳輸與…

ES數據庫啟動時可以設置1G一下內存嗎

可以,但強烈不建議在生產環境中這樣做。ES 7.0 版本確實可以設置小于 1GB 的堆內存,但這會帶來嚴重的性能問題和穩定性風險。 快速回答 # 最小化配置示例 - 僅用于測試或開發環境 export ES_JAVA_OPTS"-Xms512m -Xmx512m" ./bin/elasticsearch…

TI-92 Plus計算器:單位換算功能介紹

1 TI-92 Plus計算器:單位換算功能介紹 TI-92 Plus 內置了全面的單位換算功能,支持長度、質量、時間、溫度、面積、體積、速度等數十種物理量的單位轉換,操作直觀,無需手動輸入換算系數。以下是具體使用方法、示例及功能特點&#…

雪球科技Java開發工程師筆試題

單選 1.下列哪些語句關于內存回收的說明是正確的?( C ) A.內存回收程序允許程序員直接釋放內存 B.程序員必須創建一個線程來釋放內存 C.內存回收程序負責釋放無用內存 D.內存回收程序可以在指定的時間釋放內存對象 2.以下哪項不是Java基礎類型(A) A.String B.int C.b…

NV3041A-01芯片屏幕

1. 核心概覽這是一款集成了電源管理、顯示內存(RAM)、時序控制等多種功能的單片顯示驅動芯片(通常稱為Driver IC)。它采用COG(Chip-On-Glass) 工藝,直接將芯片綁定在玻璃基板上,使得…

aiagent知識點

一、MCP (Model Context Protocol) 1. 核心概念是什么:MCP是一個開放協議,用于在應用(如IDE、Agent) 和工具/數據源(如服務器、數據庫) 之間建立標準化的通信。目標:解決AI工具生態的碎片化問題…

第2節-過濾表中的行-WHERE

摘要:在本教程中,您將學習如何使用 PostgreSQL 的 WHERE 子句來篩選表中的行。 PostgreSQL WHERE 子句 SELECT FROM 語句從表中所有行的一個或多個列中查詢數據。實際上,你經常需要選擇滿足某個條件的行。 要根據條件從表中篩選行&#xf…

IACheck賦能AI環評報告審核,推動環保設備制造行業發展

在“雙碳目標”和綠色制造的背景下,環保設備制造行業正在迎來快速發展。然而,環評報告作為項目合規的“通行證”,卻一直是企業最頭疼的環節之一:編寫復雜、審核周期長、錯誤率高。傳統的審核模式不僅耗時耗力,還容易出…

常見的多態

一、核心概念多態(Polymorphism) 的字面意思是“多種形態”。在Java中,它指的是:同一個行為(方法)具有多個不同表現形式或形態的能力。更具體地說,它允許你:父類的引用指向子類的對象…

20250909_排查10.1.1.190檔案庫房綜合管理系統20250908備份缺失問題+優化scp腳本(把失敗原因記錄進日志)并測試腳本執行情況

目錄 一、現象(圖中現象) 二、可能原因 1、本地源文件沒生成(最可能原因) 2、清理邏輯誤刪 三、時間同步檢查 1、運行命令查看當前時間源:w32tm /query /source 2、修改為內網 NTP 服務器 10.1.10.251: 四、腳本優化 1、scp.bat vs roboscp.bat 對比表 2、robo…

OpenHarmony之有源NFC-connected_nfc_tag模塊詳解

1. 模塊概述 Connected NFC Tag模塊是OpenHarmony NFC子系統的一部分,專門用于處理有源NFC標簽的讀寫操作。與基礎NFC模塊不同,該模塊專注于與已連接的有源NFC標簽進行交互,提供更高層次的API供應用層使用。 設備必須具備有源NFC標簽芯片,才能使用有源NFC標簽的讀和寫服務…

MySql案例詳解之事務

下面我會從“事務是什么”→“為什么需要事務”→“事務的四大特性(ACID)”→“MySQL中怎么用事務”→“常見坑與調試技巧”→“完整實戰案例(含代碼、輸出、講解)”六個層次,給你一個“看完就能上手”的MySQL事務速查…

Linux之環境變量(內容由淺入深,層層遞進)

一、概念介紹(來源:比特就業課)環境變量一般是指在操作系統中用來指定操作系統運行環境的一些參數環境變量通常具有某些特殊用途,并且在系統中通常具有全局特性二、現象引入與解答 1.為什么像ls這樣的系統指令可以直接執行&#x…

監控 Linux 服務器資源

使用 Bash 腳本監控 Linux 服務器資源并發送告警郵件前言一、🛠? 腳本功能概覽二、 📜 腳本核心邏輯分解2.1. 變量初始化2.2. CPU 使用率監控2.3. 內存使用率監控2.4. 磁盤使用率監控2.5. 磁盤 IO 延遲監控(await)2.6. 網絡流量監…

隨機獲取數組內任意元素

Math.random() * arr.length 是 JavaScript 中常用的表達式,用于生成一個范圍在 [0, arr.length) 之間的隨機浮點數(包含 0,但不包含數組長度本身)。 作用說明: Math.random() 生成一個 [0, 1) 區間的隨機浮點數&#…

android studio gradle 訪問不了

1.通過國內鏡像站 2.通過本地部署 參考這個搞定 https://blog.csdn.net/2401_82819685/article/details/144542784

科普:企業微信的第三方應用涉及的“配置應用權限”

企業微信的第三方應用涉及“配置應用權限”,它在不同階段含義不同:開發階段意指應用自身所需的功能權限,安裝階段意指企業管理員對應用使用范圍的控制,產生此歧義的問題,歸根到低還是語言的縮寫問題,設想一…

YOLOv11改進大全:從卷積層到檢測頭,全方位提升目標檢測性能

## 1 引言YOLO(You Only Look Once)系列作為目標檢測領域的重要算法,以其**高效推理**和**良好精度**贏得了廣泛認可。2024年9月,Ultralytics團隊正式發布了YOLOv11,在先前版本基礎上引入了**多項架構改進**和**訓練優…