(純新手教學)計算機視覺(opencv)實戰六——圖像形態學(腐蝕、膨脹、開運算、閉運算、梯度、頂帽、黑帽)


圖像形態學

在圖像處理中,形態學(Morphology) 是一種基于圖像中物體形狀的處理方法,通常用于二值圖像和灰度圖像。它通過腐蝕、膨脹等基本操作,結合開運算、閉運算、梯度運算、頂帽、黑帽等派生操作,來實現去噪、邊緣檢測、連接或斷開物體等目的。

在 OpenCV 中,常用函數有:

  • cv2.erode() —— 腐蝕

  • cv2.dilate() —— 膨脹

  • cv2.morphologyEx() —— 各類高級形態學操作(開運算、閉運算、梯度、頂帽、黑帽)

準備圖片:

sun.png

wenzi.png

zhiwen.png

zhiwen_duan.png


1. 圖像腐蝕(Erosion)

原理

腐蝕操作的本質是:取局部最小值
在二值圖像中,腐蝕會“侵蝕”白色區域(前景),使得物體的邊界縮小,細小的高亮噪點被去除。

公式:

即:結構元素 B 在圖像 A 上滑動,若完全落在前景內,則該像素保留,否則被侵蝕。

OpenCV 函數

cv2.erode(src, kernel, dst, anchor, iterations, borderType, borderValue)
  • src:輸入圖像

  • kernel:卷積核(結構元素),默認為 3×3 矩形

  • iterations:迭代次數,越大腐蝕越明顯

參數名默認值類型 / 取值作用說明
src必填圖像對象輸入圖像,可以是二值圖、灰度圖或彩色圖。
kernelNone(默認 3×3 矩形)numpy.ndarray卷積核(結構元素),決定腐蝕范圍和形狀。
dstNone圖像對象輸出圖像,和 src 類型、大小相同。通常不寫,函數會返回結果。
anchor(-1,-1)(核中心)(x,y) 坐標核的參考點位置。默認在中心。
iterations1整數腐蝕迭代次數,數值越大,腐蝕越嚴重。
borderTypecv2.BORDER_CONSTANTOpenCV 邊界模式邊界擴展方式。- BORDER_CONSTANT 常數填充- BORDER_REPLICATE 復制邊緣- BORDER_REFLECT 鏡像填充
borderValue0(黑色)數值borderType=BORDER_CONSTANT 時使用,表示填充顏色。

代碼示例

import cv2
import numpy as npsun = cv2.imread('sun.png')
cv2.imshow('sun', sun)
cv2.waitKey(0)kernel = np.ones((3,3), np.uint8)  # 3×3核
erosion_1 = cv2.erode(sun, kernel, iterations=2)  # 腐蝕2次
cv2.imshow('sun_erode', erosion_1)
cv2.waitKey(0)

說明

  • 如果 kernel 改為 5×5,腐蝕會更明顯。

  • 如果 iterations 改為 5,物體會被“蠶食”得更多。


2. 圖像膨脹(Dilation)

原理

膨脹操作的本質是:取局部最大值
在二值圖像中,膨脹會“擴張”白色區域,使得物體邊界擴大,細小的黑洞被填充。

公式:

OpenCV 函數

cv2.dilate(img, kernel, iterations)
參數名默認值類型 / 取值作用說明
src必填圖像對象輸入圖像,可以是二值圖、灰度圖或彩色圖。
kernelNone(默認 3×3 矩形)numpy.ndarray卷積核(結構元素),決定膨脹范圍和形狀。
dstNone圖像對象輸出圖像,和 src 類型、大小相同。通常不寫,函數會返回結果。
anchor(-1,-1)(核中心)(x,y) 坐標核的參考點位置。默認在中心。
iterations1整數膨脹迭代次數,數值越大,膨脹越明顯。
borderTypecv2.BORDER_CONSTANTOpenCV 邊界模式邊界擴展方式。- BORDER_CONSTANT 常數填充- BORDER_REPLICATE 復制邊緣- BORDER_REFLECT 鏡像填充
borderValue0(黑色)數值borderType=BORDER_CONSTANT 時使用,表示填充顏色。

代碼示例

wenzi = cv2.imread('wenzi.png')
cv2.imshow('wenzi', wenzi)
cv2.waitKey(0)kernel = np.ones((2,2), np.uint8)
wenzi_new = cv2.dilate(wenzi, kernel, iterations=2)
cv2.imshow('wenzi_dilate', wenzi_new)
cv2.waitKey(0)
cv2.destroyAllWindows()

說明

  • kernel 越大,膨脹效果越明顯。

  • 常用于加粗文字、填補小空洞。


morphologyEx函數

cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst
參數名默認值類型 / 取值作用說明
src必填圖像對象輸入圖像,可以是二值、灰度或彩色圖。
op必填整數常量指定形態學操作類型(見下表)。
kernelNone(默認 3×3 矩形)numpy.ndarray卷積核(結構元素),決定操作范圍和形狀。
dstNone圖像對象輸出圖像,與 src 類型、大小相同。通常不寫,函數會返回結果。
anchor(-1,-1)(核中心)(x,y) 坐標核的參考點位置。默認在中心。
iterations1整數操作迭代次數,數值越大效果越強。
borderTypecv2.BORDER_CONSTANTOpenCV 邊界模式邊界擴展方式。
borderValue0(黑色)數值borderType=BORDER_CONSTANT 時使用,表示填充值。

3. 開運算與閉運算

(1)開運算(Opening)

先腐蝕后膨脹

  • 作用:去除小噪點、分離粘連物體。

kernel = np.ones((2,2), np.uint8)
zhiwen = cv2.imread('zhiwen.png')
zhiwen_new = cv2.morphologyEx(zhiwen, cv2.MORPH_OPEN, kernel)
cv2.imshow('zhiwen_OPEN', zhiwen_new)

(2)閉運算(Closing)

先膨脹后腐蝕

  • 作用:填補小黑洞、連接相鄰物體。(指紋斷點被連接)

kernel = np.ones((4,4), np.uint8)
zhiwen_duan = cv2.imread('zhiwen_duan.png')
zhiwen_new = cv2.morphologyEx(zhiwen_duan, cv2.MORPH_CLOSE, kernel)
cv2.imshow('zhiwen_duan_CLOSE', zhiwen_new)


4. 形態學梯度(Gradient)

原理

梯度 = 膨脹 - 腐蝕
它突出顯示物體的邊緣區域,常用于邊緣檢測。

代碼示例

wenzi = cv2.imread('wenzi.png', 0)
cv2.imshow('wenzi', wenzi)
cv2.waitKey(0)kernel = np.ones((2, 2), np.uint8)  # 設置kernel大小
# 膨脹
pz_wenzi = cv2.dilate(wenzi, kernel, iterations=1)
cv2.imshow('wenzi_dilate', pz_wenzi)
cv2.waitKey(0)# 腐蝕
fs_wenzi = cv2.erode(wenzi, kernel, iterations=1)
cv2.imshow('wenzi_erode', fs_wenzi)
cv2.waitKey(0)# 膨脹 - 腐蝕
bianyuan = cv2.morphologyEx(wenzi, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('wenzi_GRADIENT', bianyuan)
cv2.waitKey(0)
cv2.destroyAllWindows()

以下三張圖為:原圖膨脹后;原圖腐蝕后;原圖梯度后


5. 頂帽與黑帽運算

(1)頂帽(Top Hat)

頂帽 = 原始圖像 - 開運算結果

  • 突出圖像中比周圍亮的部分(亮斑檢測)。

(2)黑帽(Black Hat)

黑帽 = 閉運算結果 - 原始圖像

  • 突出圖像中比周圍暗的部分(暗斑檢測)。

代碼示例

sun = cv2.imread('sun.png', 0)
cv2.imshow('sun', sun)
cv2.waitKey(0)kernel = np.ones((2, 2), np.uint8)  # 設置kernel大小
# 開運算
open_sun = cv2.morphologyEx(sun, cv2.MORPH_OPEN, kernel)
cv2.imshow('sun_OPEN', open_sun)
cv2.waitKey(0)# 頂帽運算
tophat = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('sun_TOPHAT', tophat)
cv2.waitKey(0)# 閉運算
close_sun = cv2.morphologyEx(sun, cv2.MORPH_CLOSE, kernel)
cv2.imshow('sun_CLOSE', close_sun)
cv2.waitKey(0)# 黑帽運算
blackhat = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('sun_BLACKHAT', blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()

以下圖片為:開運算、頂帽、閉運算、黑帽


總結

  • 腐蝕:縮小白色區域,去噪點。

  • 膨脹:擴大白色區域,填洞。

  • 開運算:去噪、斷開。

  • 閉運算:填洞、連接。

  • 梯度:提取邊緣。

  • 頂帽:突出亮斑。

  • 黑帽:突出暗斑。

形態學操作廣泛應用于:

  • 圖像預處理(去噪、增強特征)

  • OCR 文字識別(加粗或斷開筆畫)

  • 工業檢測(焊點檢測、缺陷檢測)

  • 醫學圖像處理(血管提取)

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

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

相關文章

學習嵌入式第三十五天

文章目錄網絡(續上)1.函數接口2.相關功能實現1.TCP連接2.UDP習題網絡(續上) 1.函數接口 sendto 原型:ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, sockle…

為什么給數據表加了索引,寫入速度反而變慢了

為數據表增加索引后之所以會導致寫入(包括插入、更新、刪除)操作的速度變慢,其根本原因在于索引本質上是一個獨立的、需要與主表數據保持實時同步的“數據結構”。這一機制的核心邏輯涵蓋五個方面:因為索引本質上是一個“獨立的數…

.NET Core 中采用獨立數據庫的SAAS(多租戶)方法

介紹多租戶是指一種軟件架構,其中軟件的單個實例在服務器上運行并為多個租戶提供服務。在基于 SAAS 的平臺中,租戶是指使用該平臺開展業務運營的客戶。每個租戶都擁有獨立的數據、用戶帳戶和配置設置,并且與其他租戶隔離。多租戶允許有效利用…

運維日常工作100條

這是一份非常詳細和實用的“運維日常工作100條”清單。它涵蓋了從日常巡檢、變更管理、故障處理到安全、優化和文檔等運維工作的方方面面,可以作為運維工程師的日常工作指南和檢查清單。 運維日常工作100條 一、日常巡檢與監控 (20條) 檢查核心監控大盤:查看整體業務健康狀態…

OpenHarmony子系統介紹

OpenHarmony子系統OpenHarmony子系統1. AI業務子系統2. 方舟運行時子系統3. ArkUI框架子系統4. DFX子系統5. DeviceProfile子系統6. XTS子系統7. 上傳下載子系統8. 主題框架子系統9. 事件通知子系統10. 位置服務子系統11. 元能力子系統12. 全局資源調度子系統13. 全球化子系統1…

博士招生 | 英國謝菲爾德大學 招收計算機博士

內容源自“圖靈學術博研社”gongzhonghao學校簡介謝菲爾德大學(The University of Sheffield)是英國久負盛名的公立研究型大學,也是羅素集團成員之一。在 2026 年 QS 世界大學排名中,謝菲爾德大學位列第92位,其中計算機…

如何理解面向過程和面向對象,舉例說明一下?

面向過程和面向對象是兩種不同的編程思想,核心區別在于解決問題的視角不同:前者關注 “步驟和過程”,后者關注 “對象和交互”。面向過程的核心思想是把問題拆解成一系列步驟,通過函數實現每個步驟,然后按順序調用這些…

深入了解評估與微調中使用的Graders:原理、實現與最佳實踐

深入了解評估與微調中使用的Graders 在模型評估與微調(Fine-tuning)過程中,Graders(評分器)是衡量模型輸出與參考答案之間表現的重要工具。本文將系統介紹Grader的類型、技術實現及如何在實際項目中融入穩定且高質量的…

行緩存(line buffer)在圖像卷積中的工作方式

上面這張圖配合文字,展示了行緩存(line buffer)在圖像卷積中的工作方式:上半部分是一個按行掃描輸入的圖像塊(示例為 99,編號 1–81)。 藍色表示已被寫入行緩存并按隊列等待的數據,綠…

【數據分享】中國371個城市的坡度矢量數據和excel數據

今天要說明數據就是中國371個城市的坡度矢量數據和excel數據。數據介紹在城市發展的進程中,地形地貌始終是影響規劃決策的關鍵因素,而坡度作為表征地表傾斜程度的核心指標,更是貫穿于城市建設、生態保護等諸多環節。本文將全面解讀中國 371 個…

《WINDOWS 環境下32位匯編語言程序設計》第7章 圖形操作(1)

圖形設備接口GDI(Graphics Device Interface)是Win32的一個重要組成部分,其作用是允許Windows的應用程序將圖形輸出到計算機屏幕、打印機或其他輸出設備上。GDI實際上是一個函數庫,包括直線、畫圖和字體處理等數百個函數。7.1 GDI…

數據結構-HashMap

在 Java 鍵值對(Key-Value)集合中,HashMap 是使用頻率最高的實現類之一,憑借高效的查找、插入性能,成為日常開發的 “利器”。本文將從 HashMap 的底層原理、核心特點、常用方法到遍歷方式、使用注意事項,進…

[系統架構設計師]安全架構設計理論與實踐(十八)

[系統架構設計師]安全架構設計理論與實踐(十八) 一.信息安全面臨的威脅 1.信息系統安全威脅的來源 物理環境,通信鏈路,網絡系統,操作系統,應用系統,管理系統 2.網絡與信息安全風險類別 風險類別…

AI適老服務暖人心:AI適老機頂盒破數字鴻溝、毫米波雷達護獨居安全,銀發生活新保障

銀發經濟領域長期受限于 “專業照護資源稀缺”“老年人數字適應能力弱”“獨居老人安全隱患多” 的困境,而 AI 技術的適老化改造,正讓銀發服務從 “被動保障” 轉向 “主動關懷”,既能幫老年人跨越數字鴻溝,又能為獨居老人筑起安全…

Linux應用軟件編程---網絡編程1(目的、網絡協議、網絡配置、UDP編程流程)

Linux下的網絡編程一、目的不同主機,進程間通信。二、解決的問題1. 主機與主機之間物理層面必須互聯互通。 2. 進程與進程在軟件層面必須互聯互通。物理層面的互聯互通流程圖如下:其中:IP地址:計算機的軟件地址,用來標…

常見開源協議詳解:哪些行為被允許?哪些被限制?

常見開源協議詳解:哪些行為被允許?哪些被限制? 開源世界的魅力在于共享與合作,但不同的開源協議對分發、修改、再發布以及宣傳/推廣有不同的要求和限制。很多開發者在 fork 項目、改 README、放到自己倉庫并在自媒體傳播 時&…

服務器硬盤進行分區和掛載

查看服務器上的硬盤:lsblk -d -o NAME,SIZE,MODEL可以看到我的硬盤是除了vda系統盤以外,還有個vdb。我們查看一下分區:lsblk可以看到:vdb 1T disk (底下沒有分區,也沒有掛載)我們想要用起來這…

【C初階】數據在內存中的存儲

目錄 1. 整數在內存中的存儲 2. 大小端字節序 2.1 什么是大小端? 2.2 為什么有大小端? 2.3 練習 2.3.1 練習1 2.3.2 練習2 2.3.3 練習3 2.3.4 練習4 2.3.5 練習5 2.3.6 練習6 3. 浮點數在內存中的存儲 3.1 浮點數存儲的過程 3.2 浮點數的取…

AI 自動化編程 trae 體驗2 幫我分析一個項目

總結: 接手一個項目可以讓trae 幫忙分析 上次講到trae在處理組件引入的時候,經常會碰到版本問題,分析引入了互聯網上非本版本或者有bug的代碼。主要依賴互聯網的資源庫。 但是分析一個項目應該是沒問題。 這次表現非常好,接手一個…

VMware虛擬機中CentOS 7 報錯 ping: www.xxx.com: Name or service not known

1:主要原因是網絡配置的問題 2:其實就是下面三張圖片中的,物理機虛擬網卡 vmware8 和虛擬機網絡編輯器,如果設置靜態IP 就是這三個地方的問題最簡單的解決辦法第一步:還原虛擬機網絡點擊確認后 ** 第二步給自己的虛擬機設置網絡連接方式 選擇NAT模式連接…