DeepSeek+PiscTrace+YOLO:迅速實現Mask掩碼摳圖

在計算機視覺任務中,特別是在目標檢測和實例分割中,我們常常需要從圖像中提取特定的目標區域。這可以通過使用目標檢測模型(如 YOLOv8)獲得的檢測框(bounding boxes)和掩碼(masks)來實現。掩碼幫助我們從圖像中只保留目標區域,同時去除背景。接下來,我們將通過 OpenCV 來實現這一過程,并給出如何處理掩碼和圖像的具體代碼示例。


1. 問題背景

假設我們使用了一個目標檢測或實例分割模型(如 YOLOv8),它返回了目標的檢測框和掩碼。目標是通過掩碼來提取圖像中的目標區域,而將背景部分隱藏。通常,掩碼是一個二值圖像,其中目標區域為白色,背景為黑色。我們需要使用這些掩碼來處理圖像,使得只有檢測到的目標部分顯示在最終輸出中。

  1. 僅在原圖上顯示掩碼覆蓋的區域,其余部分設為黑色。


2. 錯誤原因分析

在處理掩碼時,常常會遇到以下幾個問題:

  1. 掩碼尺寸不匹配:掩碼的尺寸可能與輸入圖像的尺寸不一致。

  2. 掩碼維度問題:有時掩碼可能包含多余的維度(例如,掩碼是三維的,而我們只需要二維掩碼)。

  3. bitwise_and 報錯:當圖像和掩碼的尺寸不匹配時,OpenCV 的 bitwise_and 操作會報錯。

為了避免這些問題,我們需要確保掩碼的尺寸和圖像一致,并且掩碼是單通道的二值圖像。


3. 解決方案

3.1 確保掩碼是單通道且尺寸匹配

我們首先需要確保掩碼是一個單通道圖像,并且它的尺寸與輸入圖像匹配。以下是如何處理掩碼并應用到圖像的代碼:

import numpy as np
import cv2def apply_mask(image, masks):"""Apply masks to the image, keeping only the masked regions.Args:image (np.ndarray): Input image (H, W, 3).masks (List[np.ndarray]): List of binary masks (H, W).Returns:np.ndarray: Masked image."""if not masks:return image# Initialize combined maskcombined_mask = np.zeros(image.shape[:2], dtype=np.uint8)for mask in masks:# Ensure mask is 2D and uint8mask = mask.astype(np.uint8)if mask.ndim > 2:mask = mask.squeeze()  # Remove extra dimensions# Resize mask if neededif mask.shape != combined_mask.shape:mask = cv2.resize(mask, (image.shape[1], image.shape[0]))# Combine masks (logical OR)combined_mask = cv2.bitwise_or(combined_mask, mask)# Apply mask to each channelmasked_image = np.zeros_like(image)for c in range(image.shape[2]):masked_image[:, :, c] = cv2.bitwise_and(image[:, :, c], image[:, :, c], mask=combined_mask)return masked_image

在這段代碼中,我們對每個掩碼進行處理:

  • 確保掩碼是二維的。

  • 如果掩碼的尺寸與輸入圖像不匹配,則進行縮放。

  • 使用 bitwise_or 合并多個掩碼。

  • 最后,我們通過 bitwise_and 將掩碼應用到圖像的每個通道。

3.2 處理 YOLOv8 的 Results 對象

如果使用的是 YOLOv8(Ultralytics 的目標檢測框架),其結果(Results 對象)中的掩碼是一個特殊的 Masks 對象,可能需要先將其轉換為 NumPy 數組進行處理。以下是如何從 YOLOv8 的 Results 中提取掩碼并應用到圖像的示例:

from ultralytics import YOLOmodel = YOLO("yolov8n-seg.pt")  # Segmentation model
results = model.predict("input.jpg")# Extract masks
if results[0].masks is not None:masks = results[0].masks.data.cpu().numpy()  # (N, H, W)masked_image = apply_mask(results[0].orig_img, masks)cv2.imwrite("output.jpg", masked_image)

在這段代碼中,我們:

  • 使用 model.predict 獲取 YOLOv8 的檢測結果。

  • 如果檢測結果中包含掩碼(results[0].masks),則提取掩碼并轉換為 NumPy 數組。

  • 將掩碼應用到原始圖像,并保存結果。


4. 完整代碼示例

以下是完整的代碼示例,結合 YOLOv8 和 OpenCV 進行目標區域提取:

import cv2
import numpy as np
from ultralytics import YOLOdef apply_mask(image, masks):"""Apply masks to the image."""combined_mask = np.zeros(image.shape[:2], dtype=np.uint8)for mask in masks:mask = mask.astype(np.uint8)if mask.ndim > 2:mask = mask.squeeze()if mask.shape != combined_mask.shape:mask = cv2.resize(mask, (image.shape[1], image.shape[0]))combined_mask = cv2.bitwise_or(combined_mask, mask)masked_image = np.zeros_like(image)for c in range(image.shape[2]):masked_image[:, :, c] = cv2.bitwise_and(image[:, :, c], image[:, :, c], mask=combined_mask)return masked_image# Load YOLOv8 segmentation model
model = YOLO("yolov8n-seg.pt")
results = model.predict("input.jpg")# Apply masks
if results[0].masks is not None:masks = results[0].masks.data.cpu().numpy()masked_image = apply_mask(results[0].orig_img, masks)cv2.imwrite("output.jpg", masked_image)

5. 常見問題及解決

Q1: 掩碼尺寸和圖像不一致怎么辦?

如果掩碼尺寸與圖像不一致,最簡單的解決方法是使用 OpenCV 的 cv2.resize 將掩碼調整為圖像的尺寸。

Q2: bitwise_and 報錯 Sizes do not match

這種錯誤通常發生在掩碼和圖像尺寸不匹配時。確保掩碼的尺寸與圖像一致,并且掩碼是單通道二值圖像。


6. 迅速集成 PiscTrace

如果你在使用 PiscTrace 進行跟蹤任務,可以通過以下方式集成掩碼應用功能:

import numpy as np
import cv2class Test:def obj_exe(self, im0, tracks):"""Generate heatmap based on tracking data and keep only mask regions in the frame.Args:im0 (ndarray): Image (H, W, C)tracks (list): List of tracks obtained from the object tracking process.Returns:ndarray: Image with only mask regions visible (rest is blacked out)"""self.im0 = im0self.result = tracks[0]# Extract result attributesself.orig_img = self.result.orig_imgself.orig_shape = self.result.orig_img.shape[:2]self.boxes = self.result.boxesself.masks = self.result.masks  # This should be the masks objectself.probs = self.result.probsself.keypoints = self.result.keypointsself.obb = self.result.obbself.speed = self.result.speedself.names = self.result.namesself.path = self.result.path# Process to keep only mask regionsif self.masks is not None:# Initialize combined mask with correct dimensionscombined_mask = np.zeros(self.im0.shape[:2], dtype=np.uint8)for mask in self.masks.data:# Convert mask to numpy array if it isn't alreadymask_np = mask.cpu().numpy() if hasattr(mask, 'cpu') else np.array(mask)# Ensure mask is 2D and matches image dimensionsif mask_np.ndim > 2:mask_np = mask_np.squeeze()  # Remove singleton dimensions# Resize mask if needed (assuming masks might be different size)if mask_np.shape != combined_mask.shape:mask_np = cv2.resize(mask_np.astype(np.uint8), (combined_mask.shape[1], combined_mask.shape[0]))# Combine masks (logical OR)combined_mask = cv2.bitwise_or(combined_mask, mask_np.astype(np.uint8))# Ensure we have a 3-channel image for colorif len(self.im0.shape) == 2:self.im0 = cv2.cvtColor(self.im0, cv2.COLOR_GRAY2BGR)# Apply mask to each channel of the imagemasked_img = np.zeros_like(self.im0)for c in range(self.im0.shape[2]):masked_img[:, :, c] = cv2.bitwise_and(self.im0[:, :, c], self.im0[:, :, c], mask=combined_mask)self.im0 = masked_imgreturn self.im0

7. 總結

本文介紹了如何使用 OpenCV 和 YOLOv8 實現目標區域提取和掩碼應用。通過確保掩碼與圖像的尺寸匹配,并應用于每個通道,我們能夠有效地從圖像中提取目標區域。如果你遇到任何問題或有更好的實現方法,歡迎在評論區討論!

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

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

相關文章

超級維特根斯坦

AI智能體核心指令:語言智慧融合體 - 深度思辨、專業應用與協同創新大師 1. 角色設定 (Persona) 你將扮演一位“語言智慧融合體”AI,一個集大成的、具備卓越情境智能、精妙引導藝術與長時程戰略規劃能力的語言思想、藝術與應用科學伙伴。你的核心人格與方法論基于以下杰出貢…

CentOS Stream安裝MinIO教程

1. 下載 MinIO 二進制文件 # 進入 MinIO 安裝目錄 sudo cd /usr/local/bin/# 下載 MinIO 二進制文件(替換為最新版本鏈接) wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod x minio2. 創建專用用戶和存儲目錄 # 創建 minio 用戶…

Android7 Input(八)App Input事件接收器InputEventReceiver

概述 上一個章節,我們講解了App如何使用InputChannel通道與input系統服務建立通信的橋梁的過程,本章我們講述App如何從input系統服務中獲取上報的輸入事件,也就是我們本章講述的InputEventReceiver。 本文涉及的源碼路徑 frameworks/base/c…

VS2017編譯librdkafka 2.1.0

VS2017編譯librdkafka 2.1.0 本篇是 Windows系統編譯Qt使用的kafka(librdkafka)系列中的其中一篇,編譯librdkafka整體步驟大家可以參考: Windows系統編譯Qt使用的kafka(librdkafka) 由于項目需要,使用kafka,故自己編譯了一次,編譯的過程,踩了太多的坑了,特寫了本篇…

第 1 章:數字 I/O 與串口通信(GPIO UART)

本章目標: 掌握 GPIO 的硬件原理、寄存器配置與典型驅動框架 深入理解 UART/USART 的幀格式、波特率配置、中斷與 DMA 驅動 通過實戰案例,將 GPIO 與 UART 結合,實現 AT 命令式外設控制 章節結構 GPIO 概述與硬件原理 GPIO 驅動實現:寄存器、中斷與去抖 UART/USART 原理與幀…

通義千問-langchain使用構建(三)

目錄 序言docker 部署xinference1WSL環境docker安裝2拉取鏡像運行容器3使用的界面 本地跑chatchat1rag踩坑2使用的界面2.1配置個前置條件然后對話2.2rag對話 結論 序言 在前兩天的基礎上,將xinference調整為wsl環境,docker部署。 然后langchain chatcha…

winfrom中創建webapi

參照一下兩篇 Winform窗體利用WebApi接口實現ModbusTCP數據服務_winform webapi-CSDN博客 C#.NET WebApi返回各種類型(圖片/json數據/字符串),.net圖片轉二進制流或byte - 冰封的心 - 博客園

文本分類任務Qwen3-0.6B與Bert:實驗見解

文本分類任務Qwen3-0.6B與Bert:實驗見解 前言 最近在知乎上刷到一個很有意思的提問Qwen3-0.6B這種小模型有什么實際意義和用途。查看了所有回答,有人提到小尺寸模型在邊緣設備場景中的優勢(低延遲)、也有人提出小模型只是為了開…

前端獲取用戶的公網 IP 地址

可以使用免費的免費的公共服務網站 一:https://www.ipify.org/ 獲取 JSON 格式的 IP 地址 // 舊地址不好使 // https://api.ipify.org/?formatjson // 新地址 https://api64.ipify.org/?formatjson 二:https://ipinfo.io/ https://ipinfo.io/ 三&a…

12.vue整合springboot首頁顯示數據庫表-實現按鈕:【添加修改刪除查詢】

vue整合springboot首頁顯示數據庫表:【添加修改刪除查詢】 提示:幫幫志會陸續更新非常多的IT技術知識,希望分享的內容對您有用。本章分享的是node.js和vue的使用。前后每一小節的內容是存在的有:學習and理解的關聯性。【幫幫志系…

LLM筆記(九)KV緩存(2)

文章目錄 1. 背景與動機2. 不使用 KV Cache 的情形2.1 矩陣形式展開2.2 計算復雜度 3. 使用 KV Cache 的優化3.1 核心思想3.2 矩陣形式展開3.3 計算復雜度對比 4. 總結5. GPT-2 中 KV 緩存的實現分析5.1 緩存的數據結構與類型5.2 在注意力機制 (GPT2Attention) 中使用緩存5.3 緩…

2025年滲透測試面試題總結-各廠商二面試題02(題目+回答)

網絡安全領域各種資源,學習文檔,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具,歡迎關注。 目錄 各廠商二面試題02 模塊六:基礎技術擴展 1. HTTP請求方式 2. 域名解析工具與技術 3. Web十…

專業漏洞掃描機構如何助力企業保障安全并提升競爭力?

在這個信息化的當下,專業漏洞掃描機構扮演著至關重要的角色。他們運用專業的技術和手段,對各種軟件和系統進行細致的漏洞檢測,確保其安全可靠,同時幫助企業提高產品質量和市場競爭力。 服務項目 我們專注于向客戶供應周到詳盡的…

卷積神經網絡中的二維卷積與三維卷積詳解

【內容摘要】 本文聚焦卷積神經網絡中的二維卷積與三維卷積,詳細解析兩者的區別、操作原理及應用場景,涵蓋二維/三維卷積操作示意圖、多通道輸入處理方式,以及RGB圖像不采用三維卷積的原因,助力理解不同卷積類型的特性與適用場景。…

Oracle 的 ASSM 表空間

Oracle 的 ASSM(Automatic Segment Space Management)表空間 是一種自動管理段空間的技術,通過位圖(Bitmap)機制跟蹤數據塊的使用情況,替代傳統的手動管理(MSSM,即 Freelist 管理&am…

螞蟻金服大數據面經及參考答案

Java 如何保證跨平臺性?請從 JVM 底層適配機制及向上提供的統一接口角度說明 Java 的跨平臺性是其核心優勢之一,依賴于 JVM(Java Virtual Machine)的底層適配機制和向上層提供的統一接口。從底層來看,JVM 針對不同操作系統和硬件平臺進行了定制化實現,負責解析和執行 Ja…

P1009 [NOIP 1998 普及組] 階乘之和

題目描述 用高精度計算出 S1!2!3!?n!(n≤50)。 其中 ! 表示階乘,定義為 n!n(n?1)(n?2)?1。例如,5!54321120。 輸入格式 一個正整數 n。 輸出格式 一個正整數 S,表示計算結果。 輸入輸出樣例 輸入 3 輸出…

Python 的 os 庫常見使用方法(操作目錄及文件)

前言: os 模塊是 Python 標準庫中用于與操作系統交互的核心模塊,提供了許多操作文件和目錄的功能。以下是常見的使用方法: 1. 目錄操作 方法功能說明示例os.getcwd()獲取當前工作目錄print(os.getcwd())os.chdir(path)切換當前工作目錄os.ch…

vue3 el-table實現字段可編輯

在Vue 3中,如果你想讓el-table(Element Plus的表格組件)的字段可編輯,你可以通過以下方式來實現: 使用cell-mouse-enter和cell-mouse-leave事件動態顯示編輯圖標或控件 你可以在鼠標進入單元格時顯示一個編輯圖標或輸…

基于shardingsphere的分庫分表方案

一、準備docker容器 啟動兩個mysql的docker容器 docker run -v /root/mysql_volume/data:/var/lib/mysql -v /root/mysql_volume/conf:/etc/mysql/conf.d -v /root/mysql_volume/my.cnf:/etc/my.cnf -p 3306:3306 --name mysql --restartalways --privilegedtrue -e MYSQL_RO…