opencv-分水嶺算法分割

原理
任何一副灰度圖像都可以被看成拓撲平面,灰度值高的區域可以被看成是山峰,灰度值低的區域可以被看成是山谷。我們向每一個山谷中灌不同顏色的水。隨著水的位的升高,不同山谷的水就會相遇匯合,為了防止不同山谷的水匯合,我們需要在水匯合的地方構建起堤壩。不停的灌水,不停的構建堤壩知道所有的山峰都被水淹沒。我們構建好的堤壩就是對圖像的分割。這就是分水嶺算法的背后哲理。
分水嶺算法是一種圖像分割算法,常用于分割具有重疊目標的圖像。它基于數學形態學的理念,將圖像看作地形圖,水流在圖像的低谷(目標邊界)聚集,形成分割線。OpenCV 提供了 cv2.watershed() 函數來執行分水嶺算法。

基本的語法如下:

cv2.watershed(image, markers)

參數說明:

  • image: 輸入的圖像,通常是一個三通道彩色圖像。
  • markers: 標記圖像,用于指定分水嶺算法的初始標記。標記圖像應該是單通道灰度圖像,其中不同的標記值表示不同的區域。

cv2.watershed 函數會修改輸入圖像,將標記圖像中的區域分割開,并用不同的顏色標記不同的分割區域。分水嶺算法通常用于從預先標記的圖像中分割出目標區域。

以下是一個簡單的示例,演示如何使用分水嶺算法進行圖像分割:

import cv2
import numpy as np
import matplotlib.pyplot as plt# 讀取圖像
img = cv2.imread(r"C:\Users\mzd\Desktop\opencv\4.jpg")
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 轉換為灰度圖像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 使用閾值分割獲取前景區域掩碼
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
#cv2.threshold 是 OpenCV 中用于圖像閾值化的函數。閾值化是一種將圖像分割成兩個區域的方法,通常用于目標檢測、邊緣檢測等應用。
# 對前景區域進行形態學操作,消除小的噪點
kernel = np.ones((3, 3), np.uint8)
#np.ones 是 NumPy 中的一個函數,用于創建一個指定形狀(shape)的數組,并將數組的所有元素初始化為 1
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)# 通過距離變換獲取圖像的距離變換結果
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
_, sure_fg = cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0)# 獲取背景區域掩碼
sure_bg = cv2.dilate(opening, kernel, iterations=3)# 標記不確定的區域
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg, sure_fg)# 使用連通組件標記不確定區域
_, markers = cv2.connectedComponents(sure_fg)# 將標記+1作為不確定區域的標記,以避免與已知區域的標記沖突
markers = markers + 1
markers[unknown == 255] = 0  # 不確定區域的標記設為0# 應用分水嶺算法
cv2.watershed(img, markers)# 將分水嶺算法的標記區域設為紅色
img[markers == -1] = [255, 0, 0]# 顯示原始圖像、閾值分割結果和分水嶺算法結果
plt.figure(figsize=(12, 6))plt.subplot(131), plt.imshow(img_rgb)
plt.title('Original Image'), plt.axis('off')plt.subplot(132), plt.imshow(thresh, cmap='gray')
plt.title('Thresholded Image'), plt.axis('off')plt.subplot(133), plt.imshow(img)
plt.title('Watershed Result'), plt.axis('off')plt.show()

在這里插入圖片描述

在這個示例中,我們首先讀取了一幅圖像,將其轉換為灰度圖像。然后,使用閾值分割獲取前景區域的掩碼,并通過形態學操作和距離變換對圖像進行預處理。接著,通過分水嶺算法將圖像分割為不同的區域,并在結果圖像上標記分割線。最后,通過 Matplotlib 顯示原始圖像、閾值分割結果和分水嶺算法的分割結果。

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

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

相關文章

ios(swiftui) 畫中畫

一、環境 要實現畫中畫 ios系統必須是 iOS14 本文開發環境 xcode14.2 二、權限配置 在項目導航器中單擊項目,然后單擊Signing & Capabilities。單擊 Capabilit搜索Background Modes,然后雙擊將其添加為功能。在新添加的Background Modes部分&a…

前端——設計模式

0 設計模式分類 創建型:幫助創建對象(工廠模式、單例模式、建造者模式、原型模式)結構型:幫助設計代碼結構(適配器模式、裝飾者模式、享元模式)行為型:幫助組織模塊行為(策略模式、…

Pyqt5實現多線程程序

主從架構 Pyqt常常使用**主從架構(Master-Workers 架構)**來避免界面卡死的情況。 Master-Workers 架構就像它的名字,一個master統領著幾個workers一起干活。其中某個worker倒下了不會導致整體任務失敗。matser不用干活,因此可以…

分布式鎖之基于redis實現分布式鎖(二)

2. 基于redis實現分布式鎖 2.1. 基本實現 借助于redis中的命令setnx(key, value),key不存在就新增,存在就什么都不做。同時有多個客戶端發送setnx命令,只有一個客戶端可以成功,返回1(true);其他…

市場是變化的?這種悖論fpmarkets澳福一秒打破

你是不是始終認為市場是經常變化的,其實這是不對的,這種認識fpmarkets澳福今天一秒打破。 市場經常變化嗎?眾多投資者無需過多思考,就認為答案是肯定的。因為無論是在互聯網的哪個角落,都可以看到這樣的信息。即使我們沒有深入研…

NLP基本知識

NLP基本知識 詞嵌入&詞向量 詞嵌入(Word Embedding)是一種將單詞或文本轉化為向量表示的技術,它在自然語言處理(NLP)中廣泛應用。詞嵌入的目標是將文本數據映射到一個低維度的向量空間中,以便計算機可…

Python---函數的嵌套(一個函數里面又調用了另外一個函數)詳解

函數嵌套調用------就是一個函數里面又調用了另外一個函數。 基本語法: # 定義 函數B def funcB():print(這是funcB函數的函數體部分...)# 定義 函數A def funcA():print(- * 80) # 這一行為了更好區分print(這是funcA函數的函數體部分...)# 假設我們在調用funcA…

設計模式-Adapter

定義 適配器設計模式是一種結構型設計模式,用于將一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。 適配器模式包括三種形式:類適配器模式、對象適配器模式、接口適配器模式&a…

Ubuntu18 Opencv3.4.12 viz 3D顯示安裝、編譯、使用、移植

Opencv3.*主模塊默認包括兩個3D庫 calib3d用于相機校準和三維重建 ,viz用于三維圖像顯示,其中viz是cmake選配。 參考: https://docs.opencv.org/3.4.12/index.html 下載linux版本的源碼 sources。 查看cmake apt list --installed | grep…

App Cleaner Uninstaller Pro 一鍵清理,徹底卸載Mac應用

隨著科技的不斷發展,Mac電腦已經成為許多用戶工作和娛樂的首選。然而,隨著時間的推移,我們的Mac電腦上可能會堆積大量的無效文件和冗余數據,這不僅占用了寶貴的磁盤空間,還可能影響到系統的運行速度。為了解決這一問題…

基于51單片機zigbee溫室大棚監控系統

**單片機設計介紹,基于51單片機zigbee溫室大棚監控系統 文章目錄 一 概要二、功能設計設計思路 三、 軟件設計原理圖 五、 程序六、 文章目錄 一 概要 基于51單片機和Zigbee技術的溫室大棚監控系統是一種用于監測和控制溫室大棚環境的設備。以下是一個基本的設計介…

STM32 CAN通信自定義數據包多幀連發亂序問題

場景: can標準幀中每一幀只能傳輸8字節,而應用中傳輸一包的內容往往超過8字節,因此需要把一個包拆成多個幀發送,接收端才把收到的多幀重新組裝成一個完整的包 問題描述 在一問一答的兩塊板間通信,多幀連發是能夠按照…

UDP分片和丟包與TCP效果對比

UDP 分片 與 丟包,UDP 真的比 TCP 高效嗎? UDP(用戶數據報協議)和TCP(傳輸控制協議)在很多方面都有顯著的區別。總體來說,TCP更適合需要可靠傳輸的應用,例如網頁瀏覽、電子郵件等&a…

信創系列之大數據,分布式數據庫產業鏈跟蹤梳理筆記…

并購優塾 投行界的大叔,大叔界的投行 【產業鏈地圖,版權、內容與免責聲明】1)版權:版權所有,違者必究,未經許可不得翻版、摘編、拷貝、復制、傳播。2)尊重原創:如有引用未標注來源…

CentOS 7啟動時報“Started Crash recovery kernel arming.....shutdown....”問題處理過程

有臺虛擬機由于CPU負載過高而宕機,宕機重啟后停在“Started Crash recovery kernel arming…shutdown…”階段,如下所示: 重置虛擬機,進入grub菜單,按e編輯啟動選項,在linux16 行末,加上&…

【考研】數據結構(更新到循環鏈表)

聲明&#xff1a;所有代碼都可以運行&#xff0c;可以直接粘貼運行&#xff08;只有庫函數沒有聲明&#xff09; 線性表的定義和基本操作 基本操作 定義 靜態&#xff1a; #include<stdio.h> #include<stdlib.h>#define MaxSize 10//靜態 typedef struct{int d…

【追求卓越02】數據結構--鏈表

引導 今天我們進入鏈表的學習&#xff0c;我相信大家對鏈表都很熟悉。鏈表和數組一樣&#xff0c;作為最基礎的數據結構。在我們的工作中常常會使用到。但是我們真的了解到數組和鏈表的區別嗎&#xff1f;什么時候使用數組&#xff0c;什么時候使用鏈表&#xff0c;能夠正確的選…

監控員工上網有什么軟件

監控員工上網的軟件主要用于監控員工在工作時間內的網絡行為&#xff0c;包括瀏覽網頁、使用社交媒體、發送郵件等。通過監控員工上網行為&#xff0c;企業管理者可以更好地了解員工的工作狀態和行為&#xff0c;規范員工的上網行為&#xff0c;提高工作效率&#xff0c;同時也…

SSL證書對網站的作用及影響?

SSL證書作為當下互聯網的重要安全件&#xff0c;包括搜索引擎的收錄、網站是否具備信任的條件以及HTTP2.0傳輸協議的相互作用等&#xff0c;尤其是瀏覽器對古老的http協議警告提示不安全將直接影響到用戶的信任度以及品牌形象&#xff0c;對于網站來說可謂是必不可少。 SSL證書…

Webstorm 插件文件目錄顏色分析——白藍綠紅黃灰

Webstorm 插件文件目錄【白色、藍色、綠色、紅色、黃色、灰色】對應當前文件發生什么了&#xff0c;即文件夾當前狀態。 WebStrom配置好git或SVN后文件顏色代表的含義&#xff1a; 白色&#xff1a;本地無修改內容 藍色&#xff1a;文件內容有修改&#xff0c;暫未提交到git…