26.OpenCV形態學操作

OpenCV形態學操作

形態學操作(Morphological Operations)源自二值圖像處理,主要用于分析和處理圖像中的結構元素,對圖像進行去噪、提取邊緣、分割等預處理步驟。OpenCV庫中提供了豐富的形態學函數,常見的包括:

  • 膨脹(Dilation)
  • 腐蝕(Erosion)
  • 開操作(Opening)
  • 閉操作(Closing)
  • 形態學梯度(Morphological Gradient)
  • 頂帽(Top Hat)
  • 黑帽(Black Hat)

下面將逐一介紹這些操作的原理、用途,以及在 C++ 中的使用方法。

1. 基礎概念:結構元素(Kernel)

形態學操作的核心是“結構元素”:一個二值矩陣,用來掃描圖像并決定像素的處理方式。在 OpenCV 中,我們通常使用 getStructuringElement 來創建常見形狀的結構元素:

// 創建 5×5 的矩形結構元素
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
// 創建 3×3 的橢圓結構元素
Mat kernelEllipse = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
// 創建 7×7 的交叉形結構元素
Mat kernelCross = getStructuringElement(MORPH_CROSS, Size(7, 7));

2. 膨脹(Dilation)與腐蝕(Erosion)

2.1 腐蝕(Erosion)

  • 原理:用結構元素“擦除”邊緣,使前景對象變小。
  • 用途:去除小噪點、斷開細小的連通區域。
Mat src = imread("input.jpg", IMREAD_GRAYSCALE);
Mat eroded;
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
erode(src, eroded, kernel);

在這里插入圖片描述

如上圖腐蝕可以把白點去除

2.2 膨脹(Dilation)

  • 原理:用結構元素“擴展”邊緣,使前景對象變大。
  • 用途:填補小孔洞、連接相鄰的對象。
Mat src = imread("input.jpg", IMREAD_GRAYSCALE);
Mat dilated;
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
dilate(src, dilated, kernel);

在這里插入圖片描述

如上圖膨脹會把數字A中的小黑點去除

3. 開操作(Opening)與閉操作(Closing)

對腐蝕和膨脹的組合操作

3.1 開操作(Opening)

  • 定義:先腐蝕后膨脹(Erosion → Dilation)。
  • 效果:去除小的光斑噪點,同時保持整體輪廓不變。
Mat opened;
morphologyEx(src, opened, MORPH_OPEN, kernel);

在這里插入圖片描述

開操作對比腐蝕,去除白點后保證中間黑點和字母A大小不變

3.2 閉操作(Closing)

  • 定義:先膨脹后腐蝕(Dilation → Erosion)。
  • 效果:填補前景對象的小孔洞,同時保持整體輪廓不變。
Mat closed;
morphologyEx(src, closed, MORPH_CLOSE, kernel);

在這里插入圖片描述

閉操作對比膨脹,其去除中間黑點同時保證外圍白點和字母A大小不變

4. 形態學梯度(Morphological Gradient)

  • 定義:膨脹結果與腐蝕結果之間的差值:

    G r a d i e n t = D i l a t i o n ( s r c ) ? E r o s i o n ( s r c ) Gradient=Dilation(src)?Erosion(src) Gradient=Dilation(src)?Erosion(src)

  • 用途:突出獲取圖像邊緣。

Mat gradient;
morphologyEx(src, gradient, MORPH_GRADIENT, kernel);

在這里插入圖片描述

突出圖像邊緣

5. 頂帽(Top Hat)與黑帽(Black Hat)

5.1 頂帽(Top Hat)

  • 定義:原圖像與開操作結果的差值: T o p H a t = s r c ? O p e n i n g ( s r c ) TopHat=src?Opening(src) TopHat=src?Opening(src)
  • 用途:提取比背景亮的細小區域(小光斑)。
Mat tophat;
morphologyEx(src, tophat, MORPH_TOPHAT, kernel);

在這里插入圖片描述

突出背景亮點

5.2 黑帽(Black Hat)

  • 定義:閉操作結果與原圖像的差值: B l a c k H a t = C l o s i n g ( s r c ) ? s r c BlackHat=Closing(src)?src BlackHat=Closing(src)?src
  • 用途:提取比背景暗的細小區域(小暗點)。
Mat blackhat;
morphologyEx(src, blackhat, MORPH_BLACKHAT, kernel);

在這里插入圖片描述

突出中間黑點區域

6. 小結

  • 腐蝕 / 膨脹:最基本的形態學操作,用于縮小或擴展前景區域。
  • 開 / 閉操作:腐蝕與膨脹的組合,開操作用于去除小噪點,閉操作用于填補小孔洞。
  • 形態學梯度:用于提取邊緣信息。
  • 頂帽 / 黑帽:分別用于突出小的亮區域與暗區域。

掌握這些形態學操作后配合掩膜,你可以在圖像預處理、特征提取、目標分割等任務中如虎添翼。

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

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

相關文章

邏輯回歸:損失和正則化技術的深入研究

邏輯回歸:損失和正則化技術的深入研究 引言 邏輯回歸是一種廣泛應用于分類問題的統計模型,尤其在機器學習領域中占據著重要的地位。盡管其名稱中包含"回歸",但邏輯回歸本質上是一種分類算法。它的核心思想是在線性回歸的基礎上添…

大模型面經 | 介紹一下CLIP和BLIP

大家好,我是皮先生!! 今天給大家分享一些關于大模型面試常見的面試題,希望對大家的面試有所幫助。 往期回顧: 大模型面經 | 春招、秋招算法面試常考八股文附答案(RAG專題一) 大模型面經 | 春招、秋招算法面試常考八股文附答案(RAG專題二) 大模型面經 | 春招、秋招算法…

【MCP】第二篇:IDE革命——用MCP構建下一代智能工具鏈

【MCP】第二篇:IDE革命——用MCP構建下一代智能工具鏈 一、引言二、IDE集成MCP2.1 VSCode2.1.1 安裝VSCode2.1.2 安裝Cline2.1.3 配置Cline2.1.4 環境準備2.1.5 安裝MCP服務器2.1.5.1 自動安裝2.1.5.2 手動安裝 2.2 Trae CN2.2.1 安裝Trae CN2.2.2 Cline使用2.2.3 內…

【新能源科學與技術】MATALB/Simulink小白教程(一)實驗文檔【新能源電力轉換與控制仿真】

DP讀書:新能源科學與工程——專業課「新能源發電系統」 2025a 版本 MATLAB下面進入正題 仿真一:Buck 電路一、仿真目的二、仿真內容(一)Buck電路基本構成及工作原理(二)Buck電路仿真模型及元件連接&#xf…

BootStrap:首頁排版(其一)

今天我要介紹的是在BootStrap中有關于首頁排版的內容知識點,即(模態框,選項卡)。 模態框: 模態框經過了優化,更加靈活,以彈出對話框的形式出現,具有最小和最實用的功能集。 在運行…

Spring Data

目錄 一、Spring Data 簡介與生態概覽 什么是 Spring Data? Spring Data 與 Spring Data JPA 的關系 Spring Data 家族:JPA、MongoDB、Redis、Elasticsearch、JDBC、R2DBC…… 與 MyBatis 的本質差異(ORM vs SQL 顯式控制) 二…

建筑末端配電回路用電安全解決方案

一、電氣火災的嚴峻現狀 根據國家應急管理部消防救援局的數據,電氣火災長期占據各類火災原因之首,2021年占比高達50.4%。其中,末端配電回路因保護不足、監測手段落后,成為火災高發隱患點。私拉電線、線路老化、接觸不良、過載等問…

華為開發崗暑期實習筆試(2025年4月16日)

刷題小記: 第一題懷疑測試樣例不完整,貪心法不應該能夠解決該題。第二題使用0-1BFS解決單源最短路徑的問題,往往搭配雙端隊列實現。第三題是運用動態規劃解決最大不重疊子區間個數的問題,難點在于滿足3重判斷規則,所需…

Rust: 從內存地址信息看內存布局

內存布局其實有幾個:address(地址)、size(大小)、alignment(對齊位數,2 的自然數次冪,2,4,8…)。 今天主要從address來看內存的布局。 說明&…

每日一題算法——兩個數組的交集

兩個數組的交集 力扣題目鏈接 我的解法&#xff1a;利用數組下標。 缺點&#xff1a;當取值范圍很大時&#xff0c;浪費空間。 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {int count1[1001]{0…

c++ 互斥鎖

為練習c 線程同步&#xff0c;做了LeeCode 1114題. 按序打印&#xff1a; 給你一個類&#xff1a; public class Foo {public void first() { print("first"); }public void second() { print("second"); }public void third() { print("third"…

山東大學軟件學院創新項目實訓開發日志(20)之中醫知識問答自動生成對話標題bug修改

在原代碼中存在一個bug&#xff1a;當前對話的標題不是現有對話的用戶的第一段的前幾個字&#xff0c;而是歷史對話的第一段的前幾個字。 這是生成標題的邏輯出了錯誤&#xff1a; 當改成size()-1即可

WSL2-Ubuntu22.04下拉取Docker MongoDB鏡像并啟動

若未安裝docker可參考此教程&#xff1a;可以直接在wsl上安裝docker嗎&#xff0c;而不是安裝docker desktop&#xff1f;-CSDN博客 1. 拉取鏡像 docker pull mongo:latest 2.打開網絡加速&#xff0c;再次拉取鏡像 3.創建docker-compose.yml 進入vim編輯器后輸入i進行編輯&a…

中通 Redis 集群從 VM 遷移至 PVE:技術差異、PVE 優劣勢及應用場景深度解析

在數字化轉型浪潮下&#xff0c;企業對服務器資源的高效利用與成本控制愈發重視。近期&#xff0c;中通快遞將服務器上的 Redis 集群服務從 VM&#xff08;VMware 虛擬化技術&#xff09;遷移至 PVE&#xff08;Proxmox VE&#xff09;&#xff0c;這一技術舉措引發了行業廣泛關…

Prometheus+Grafana實時監控系統各項指標

一、監控架構設計 核心組件與數據流 Prometheus&#xff1a;時序數據采集、存儲與告警規則管理Node Exporter&#xff1a;采集主機指標&#xff08;CPU、內存、磁盤、網絡等&#xff09;數據庫Exporter&#xff1a;如 mysqld_exporter、postgres_exporterGrafana&#xff1a;…

[密碼學基礎]GMT 0029-2014簽名驗簽服務器技術規范深度解析

GMT 0029-2014簽名驗簽服務器技術規范深度解析 引言 在數字化轉型和網絡安全需求激增的背景下&#xff0c;密碼技術成為保障數據完整性與身份認證的核心手段。中國密碼管理局發布的GMT 0029-2014《簽名驗簽服務器技術規范》&#xff0c;為簽名驗簽服務器的設計、開發與部署提…

多路轉接select服務器

目錄 select函數原型 select服務器 select的缺點 前面介紹過多路轉接就是能同時等待多個文件描述符&#xff0c;這篇文章介紹一下多路轉接方案中的select的使用 select函數原型 #include <sys/select.h> int select(int nfds, fd_set *readfds, fd_set *writefds, f…

QT6 源(45):分隔條 QSplitter 允許程序的用戶修改布局,程序員使用 IDE時,就是分隔條的用戶,以及其 QSplitter 源代碼

&#xff08;1&#xff09; &#xff08;2&#xff09;本類的繼承關系如下&#xff0c;所以說分隔條屬于容器&#xff1a; &#xff08;3&#xff09;本類的屬性&#xff1a; &#xff08;4&#xff09; 這是一份 QSplitter 的舉例代碼&#xff0c;注意其構造函數時候的傳參&am…

VSCode PIO使用Jlink SWD燒錄Stm32

一、背景 PIO的編譯速度比Arduino快很多&#xff0c;同樣支持Arduino的語法。VScode的自動補全和插件也能夠幫助快速開發目前使用JLINK SWD的方式連接STM32 二、配置 在ini配置文件中&#xff0c;添加如下內容 [env:genericSTM32F103C8] platform ststm32 board genericS…

JavaScript 渲染內容爬取:Puppeteer 入門

在現代網絡應用中&#xff0c;許多網頁內容是通過 JavaScript 渲染生成的&#xff0c;傳統的爬蟲工具往往難以獲取這些動態內容。Puppeteer 作為一種強大的瀏覽器自動化工具&#xff0c;為這一問題提供了優雅的解決方案。本文將帶你入門 Puppeteer&#xff0c;介紹如何安裝、啟…