OpenCV計算機視覺實戰(16)——圖像分割技術

OpenCV計算機視覺實戰(16)——圖像分割技術

    • 0. 前言
    • 1. 分水嶺算法
      • 1.1 應用場景
      • 1.2 實現過程
    • 2. GrabCut 交互式分割
      • 2.1 應用場景
      • 2.2 實現過程
    • 3. FloodFill
      • 3.1 應用場景
      • 3.2 實現過程
    • 小結
    • 系列鏈接

0. 前言

圖像分割是計算機視覺中將像素劃分為具有特定語義或結構的區域。面對目標緊密相連或前景背景對比不明顯的復雜場景,僅憑簡單的閾值往往捉襟見肘。本文深入講解并演示了三種經典而高效的分割方法——分水嶺算法借鑒地形水漫模型精準分離粘連目標,GrabCut 交互式摳圖通過最小割迭代優化實現細節豐富的前景提取,以及 FloodFill 以種子點為起點快速覆蓋同質區域。

1. 分水嶺算法

將灰度圖看作地形高程圖,把“低谷”視為種子點,利用梯度圖構造“水漫”過程,最終在“山脊線”處形成分割邊界,適合處理前景連通但邊界黯淡的場景。

1.1 應用場景

  • 重疊目標分離:當前景對象相互粘連時(如重疊的硬幣、細胞團),分水嶺能精確沿“山脊”將它們分開
  • 紋理分割:結合梯度圖,能處理前景背景亮度相近但紋理不同的場景
  • 預分割:常作為后續目標檢測或特征提取的預處理步驟,提供連通組件

1.2 實現過程

  • 讀取圖像與預處理
    • 轉灰度并做高斯模糊,減少噪聲
    • 計算梯度圖 (SobelLaplacian) 以突出邊緣
  • 二值化與距離變換
    • 對圖像做閾值化,得到粗略二值前景
    • 對前景做距離變換并歸一化
  • 標記種子區域
    • 對距離變換結果做閾值,提取“確實前景”作為種子標記
    • 將未知區域標為 0,背景標為 1
  • 調用分水嶺
    • cv2.watershed 會修改標記矩陣,將邊界點標記為 –1
    • 在原圖上將邊界涂為紅色
import cv2
import numpy as np# 1. 讀取與預處理
img = cv2.imread('2.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)# 2. 梯度與二值化
grad = cv2.Laplacian(blur, cv2.CV_8U, ksize=3)
_, binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)# 3. 距離變換與種子標記
dist = cv2.distanceTransform(binary, cv2.DIST_L2, 5)
_, fg = cv2.threshold(dist, 0.4 * dist.max(), 255, 0)
fg = np.uint8(fg)
bg = cv2.dilate(binary, np.ones((3,3), np.uint8), iterations=3)
unknown = cv2.subtract(bg, fg)# 4. 連通組件與標記
_, markers = cv2.connectedComponents(fg)
markers = markers + 1           # 背景標記為 1
markers[unknown == 255] = 0     # 未知區域標記為 0# 5. 分水嶺
markers = cv2.watershed(img, markers)
output = img.copy()
output[markers == -1] = [0, 0, 255]  # 邊界標紅cv2.imshow('Watershed Segmentation', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

分水嶺

關鍵函數解析:

  • cv2.distanceTransform(src, distType, maskSize):計算二值圖中每個前景像素到最近背景的距離,用于挖掘前景核心區域
  • cv2.connectedComponents(src):對前景二值圖進行連通組件標記,生成初始標記矩陣
  • cv2.watershed(image, markers):以 markers 為種子,在彩色圖像上執行分水嶺算法,輸出帶邊界的標記圖

2. GrabCut 交互式分割

GrabCut 利用圖割 (Graph Cut) 模型結合少量用戶標注(矩形或前景/背景涂抹),自動學習前景與背景像素分布,實現高質量分割,適合人物/物體摳圖。

2.1 應用場景

  • 半自動摳圖:用戶只需框選對象,后續可用筆刷細化邊緣,比如頭發、樹葉等復雜輪廓
  • 視頻摳像:在關鍵幀交互后,將模型應用于相鄰幀,實現半自動背景替換
  • 圖形編輯工具:集成 GrabCut,讓非專業用戶也能輕松摳圖

2.2 實現過程

  • 讀取圖像與定義感興趣區域 (Region of Interest, ROI)
    • 用戶給定一個大致含前景的矩形框 rect
  • 初始化掩碼與模型
    • mask 初始化為全 “可能背景”
    • bgModelfgModel 用于內部高斯混合模型 (Gaussian Mixture Model, GMM)
  • 調用 GrabCut
    • cv2.grabCut 根據 rect 或用戶刷涂的 mask 迭代優化
    • 模型會不斷更新前景/背景分布
  • 提取結果
    • mask 中標記為前景/可能前景的像素保留,其余設為背景
import cv2
import numpy as npimg = cv2.imread('2.jpeg')
mask = np.zeros(img.shape[:2], np.uint8)# 1. 用戶定義矩形 ROI (x,y,w,h)
rect = (50, 50, img.shape[1]-100, img.shape[0]-100)# 2. 初始化模型
bgModel = np.zeros((1,65), np.float64)
fgModel = np.zeros((1,65), np.float64)# 3. 執行 GrabCut
cv2.grabCut(img, mask, rect, bgModel, fgModel, 5, cv2.GC_INIT_WITH_RECT)# 4. 構建前景掩碼并應用
mask2 = np.where((mask==cv2.GC_FGD)|(mask==cv2.GC_PR_FGD),255,0).astype('uint8')
result = cv2.bitwise_and(img, img, mask=mask2)cv2.imshow('GrabCut Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

分割結果

關鍵函數解析:

  • cv2.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount, mode):在指定 rect 區域或已有 mask 上運行 GrabCut
    • mode=cv2.GC_INIT_WITH_RECT:使用矩形初始化
    • mode=cv2.GC_INIT_WITH_MASK:根據用戶細化涂抹結果再運行
  • mask 標簽值:GC_BGD(0), GC_FGD(1), GC_PR_BGD(2), GC_PR_FGD(3),可提取出最終前景

3. FloodFill

FloodFill 從給定種子點開始,將相似像素“漫水填充”到邊界,可用于區域生長、缺陷檢測與交互式標注。

3.1 應用場景

  • 缺陷檢測:從劃痕起點填充,快速定位裂紋區域
  • 交互式分割:點擊圖像生成精確區域掩碼,配合 GrabCut 等方法
  • 色塊分割:在質感均勻的背景或卡通圖像中,快速提取色塊

3.2 實現過程

  • 讀取圖像
  • 指定種子點 (x, y)
  • 設置填充參數
    • loDiff / upDiff:允許填充的像素與種子點最大差異
    • flags:控制填充方式、掩碼使用
  • 調用 FloodFill
    • 返回填充后的像素數與更新后的圖像
import cv2
import numpy as npimg = cv2.imread('1.jpeg')
h, w = img.shape[:2]# 1. 構建掩碼,需比原圖多兩像素邊緣
mask = np.zeros((h+2, w+2), np.uint8)# 2. 漫水填充參數
seed_point = (700, 500)
newVal = (0, 0, 255)      # 填充顏色:紅色
loDiff = (20, 20, 20)     # 下限差異
upDiff = (20, 20, 20)     # 上限差異
flags = 4 | cv2.FLOODFILL_FIXED_RANGE | (255<<8)# 3. 執行 FloodFill
num, img_flood, mask, rect = cv2.floodFill(img.copy(), mask, seed_point,newVal, loDiff, upDiff, flags)cv2.imshow('FloodFill Result', img_flood)
cv2.waitKey(0)
cv2.destroyAllWindows()

floodfill

關鍵函數解析

  • cv2.floodFill(image, mask, seedPoint, newVal, loDiff, upDiff, flags):從 seedPoint 開始填充,loDiff / upDiff 控制像素相似度
  • flags 參數含義:
    • cv2.FLOODFILL_FIXED_RANGE:像素差異相對種子點
    • cv2.FLOODFILL_MASK_ONLY:僅更新 mask

小結

本節從分水嶺的高程地圖思路切入,講解如何借助距離變換與連通組件構建水漫分割,再通過 GrabCut 的圖割模型與用戶交互實現更高精度的前景去背,最后以 FloodFill 的種子驅動方式演示快速區域生長。三者各有側重,卻可互為補充:分水嶺適合自動化預分割,GrabCut 適合復雜邊緣細化,FloodFill 則勝在簡單直觀和交互式應用。

系列鏈接

OpenCV計算機視覺實戰(1)——計算機視覺簡介
OpenCV計算機視覺實戰(2)——環境搭建與OpenCV簡介
OpenCV計算機視覺實戰(3)——計算機圖像處理基礎
OpenCV計算機視覺實戰(4)——計算機視覺核心技術全解析
OpenCV計算機視覺實戰(5)——圖像基礎操作全解析
OpenCV計算機視覺實戰(6)——經典計算機視覺算法
OpenCV計算機視覺實戰(7)——色彩空間詳解
OpenCV計算機視覺實戰(8)——圖像濾波詳解
OpenCV計算機視覺實戰(9)——閾值化技術詳解
OpenCV計算機視覺實戰(10)——形態學操作詳解
OpenCV計算機視覺實戰(11)——邊緣檢測詳解
OpenCV計算機視覺實戰(12)——圖像金字塔與特征縮放
OpenCV計算機視覺實戰(13)——輪廓檢測詳解
OpenCV計算機視覺實戰(14)——直方圖均衡化
OpenCV計算機視覺實戰(15)——霍夫變換詳解

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

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

相關文章

Coturn打洞服務器

* 概念理解&#xff1a;1. SDP協議&#xff1a;會話描述協議&#xff0c;視頻通話的雙方通過交換SDP信息進行媒體協商&#xff0c;從而選擇使用某一相同的媒體協議進行通信&#xff1b;TLS協議&#xff1a;基于TCP的安全層傳輸協議DTLS協議&#xff1a;基于UDP的安全層傳輸協議…

python flusk 監控

# 創建虛擬環境目錄 python3 -m venv /sda1/xunjian/venv # 激活虛擬環境 source /sda1/xunjian/venv/bin/activate # 激活后終端會顯示 (venv)創建虛擬環境&#xff08;在當前目錄&#xff09;&#xff1a;bashpython3 -m venv venv激活虛擬環境&#xff1a;bashsource venv/b…

VUE2 項目學習筆記 ? 語法 v-if/v-show

?語法頁面渲染的時候&#xff0c;需要服務器傳過來的對象中的一個屬性&#xff0c;然后根據這個屬性用v-for渲染標簽&#xff0c;這里寫的v-for".... in dataList.goodsList"但是當解析到這行語法的時候&#xff0c;dataList還沒返回&#xff0c;因此控制臺會報錯找…

使用qemu命令啟動虛擬機

1. 安裝相關軟件 yum install qemu edk2* libvirt -y 啟動libvirt服務 systemctl start libvirtd systemctl status libvirtd2. 創建虛擬機 2.1. qemu啟動命令示例 /usr/bin/qemu-system-loongarch64 \-machine virt,accelkvm \-nodefaults \-m 2048 \-smp 2,maxcpus4,co…

大模型系統化學習路線

人工智能大模型系統化學習路線一、基礎理論筑基&#xff08;1-2個月) 目標&#xff1a;建立大模型核心認知框架 核心內容&#xff1a; 深度學習基礎&#xff1a;神經網絡原理、CNN/RNN結構、梯度下降算法大模型本質&#xff1a;Transformer架構&#xff08;重點掌握注意力機制、…

LLaMA-Factory 微調可配置的模型基本參數

LLaMA-Factory 微調可配置的模型基本參數 flyfish 基本參數 一、模型加載與路徑配置參數名類型描述默認值model_name_or_pathOptional[str]模型路徑&#xff08;本地路徑或 Huggingface/ModelScope 路徑&#xff09;。Noneadapter_name_or_pathOptional[str]適配器路徑&#xf…

Ubuntu 22 安裝 ZooKeeper 3.9.3 記錄

Ubuntu 22 安裝 ZooKeeper 3.9.3 記錄 本文記錄在 Ubuntu 22.04 系統上安裝 ZooKeeper 3.9.3 的過程&#xff0c;包含 Java 環境準備、配置文件調整、啟動與停機操作、以及如何將 ZooKeeper 注冊為系統服務。 一、準備環境 ZooKeeper 3.9.x 要求 Java 11 或更高版本&#xff…

FreeSwitch通過Websocket(流式雙向語音)對接AI實時語音大模型技術方案(mod_ppy_aduio_stream)

FreeSwitch通過WebSocket對接AI實時語音大模型插件技術方案1. 方案概述 基于FreeSWITCH的實時通信能力&#xff0c;通過WebSocket協議橋接AI大模型服務&#xff0c;實現低延遲、高并發的智能語音交互系統。支持雙向語音流處理、實時ASR/TTS轉換和動態業務指令執行。 1753095153…

航班調度優化策略全局概覽

在機場關閉場景下的航班恢復工作&#xff0c;是將機場關閉期間所有的航班進行取消然后恢復還是將機場關閉期間航班全部延誤而后調整呢&#xff1f;簡單來說&#xff0c;在實際操作中&#xff0c;既不是無差別地全部取消&#xff0c;也不是無差別地全部延誤。這兩種“一刀切”的…

spring boot 異步線程@Async 傳遞 threadLocal數據

將父類的 threadLocal 的數據 在線程池時&#xff0c;可以轉給子線程使用。 Async 的使用。 第一步在啟動服務加上 EnableAsync 注解。 EnableAsync public class NetCoreApplication {... ... }第二步&#xff1a;導入阿里 線程工具類<dependency><groupId>com.a…

AI產品經理成長記《零號列車》第一集 邂逅0XAI列車

《零號列車》絕非傳統意義上的 AI 產品經理教程 —— 它是我沉淀二十多年跨行業數字化轉型與工業 4.0 實戰經驗后,首創的100集大型小說體培養指南。那些曾在千行百業驗證過的知識與經驗,不再是枯燥的文字堆砌,而是化作一場沉浸式的學習旅程。? 這里沒有生硬的理論灌輸,而…

[C++11]范圍for循環/using使用

范圍for循環 范圍for循環&#xff08;Range-based for loop&#xff09;是 C11 引入的一種簡潔的循環語法&#xff0c;用于遍歷容器中的元素或者其他支持迭代的數據結構。 范圍for循環可以讓代碼更加簡潔和易讀&#xff0c;避免了傳統for循環中索引的操作。 下面是范圍for循環的…

簡單了解下npm、yarn 和 pnpm 中 add 與 install(i) 命令的區別(附上兩圖帶你一目明了)

目錄 pnpm 中 add 和 i 的區別 npm 中 add 和 i 的區別 yarn 中 add 和 i 的區別 附上兩圖帶你一目明了&#xff1a; npm、yarn和pnpm的三者區別圖&#xff1a; i 和 add 的核心區別圖&#xff1a; 個人建議&#xff1a;在項目中保持命令使用的一致性&#xff0c;選擇一種…

ESP32-S3學習筆記<2>:GPIO的應用

ESP32-S3學習筆記&#xff1c;2&#xff1e;&#xff1a;GPIO的應用1. 頭文件包含2. GPIO的配置2.1 pin_bit_mask2.2 mode2.3 pull_up_en和pull_down_en2.4 intr_type3. 設置GPIO輸出/獲取GPIO輸入4. 中斷的使用4.1 gpio_install_isr_service4.2 gpio_isr_handler_add4.3 gpio_…

得物視覺算法面試30問全景精解

得物視覺算法面試30問全景精解 ——潮流電商 商品鑒別 視覺智能&#xff1a;得物視覺算法面試核心考點全覽 前言 得物App作為中國領先的潮流電商與鑒別平臺&#xff0c;持續推動商品識別、真假鑒別、圖像搜索、內容審核、智能推薦等視覺AI技術的創新與落地。得物視覺算法崗位…

[Linux入門] Linux 賬號和權限管理入門:從基礎到實踐

一、Linux 用戶賬號&#xff1a;誰能訪問系統&#xff1f; 1??超級用戶&#xff08;root&#xff09; 2??普通用戶 3??程序用戶 二、組賬號&#xff1a;讓用戶管理更高效 1??組的類型 2??特殊組 三、用戶與組的 “身份證”&#xff1a;UID 和 GID 四、配置文…

阿里云ssl證書自動安裝及續訂(acme)

目錄 一、shell命令安裝 二、docker run安裝 三、docker compose安裝 一、shell命令安裝 # 安裝acme curl https://get.acme.sh | sh -s emailfloxxx5163.com# 注冊zerossl .acme.sh/acme.sh --register-account -m flowxxx25163.com --server zerossl# 獲取證書 export Al…

@fullcalendar/vue 日歷組件

功能&#xff1a;日程安排&#xff0c;展示日歷&#xff0c;可以用來做會議日歷&#xff0c;可以跨日期顯示日程。 Fullcalendarvue3 日歷組件 參考文檔&#xff1a;【vue2】一個完整的日歷組件 fullcalendar&#xff0c;會議預約功能 中文說明文檔&#xff1a;https://www.he…

Dijkstra 算法求解多種操作

一、問題背景與核心需求 需要找到從a到b的最優操作序列&#xff0c;使得總花費最小。三種操作的規則為&#xff1a; 操作 1&#xff1a;x → x1&#xff0c;花費c1&#xff1b;操作 2&#xff1a;x → x-1&#xff0c;花費c2&#xff1b;操作 3&#xff1a;x → x*2&#xff0…

本地項目提交到git教程

創建遠程倉庫 登錄 GitHub&#xff0c;點擊右上角 New repository。 填寫倉庫名稱&#xff08;如 my-project&#xff09;、描述&#xff0c;選擇公開 / 私有。 不要初始化 README、.gitignore 或 LICENSE&#xff08;保持空倉庫&#xff09;&#xff0c;點擊 Create repositor…