掩膜合并代碼

def ensure_dir(path):"""若目錄不存在則創建"""if not os.path.exists(path): #判斷路徑是否存在os.makedirs(path) #創建路徑def read_and_resize(img_path, size):"""讀取并縮放圖像到指定尺寸,返回 numpy 數組"""img = Image.open(img_path).convert("RGB") #Image.open 讀取圖片文件 .convert將數據改為所需的格式img = img.resize(size, Image.BILINEAR) #.resize(size, Image.BILINEAR) 縮放圖片的大小 保證格式相同return np.array(img) #np.array 將數據的格式改為數組
#插值(interpolation):縮放圖像時需要“估算”新像素值的方法。常見方式有:最近鄰 (NEAREST),雙線性插值 (BILINEAR),雙三次插值 (BICUBIC)def merge_instance_masks(mask_folder, size):"""將一個病例下的所有 instance-mask 合并成一張二值 mask"""final = np.zeros(size[::-1], dtype=np.uint8)  # (H, W) 創建空的掩膜for fname in os.listdir(mask_folder): #os.listdir(...) 遍歷文件 讀取所有的mask圖片if not fname.lower().endswith((".png", ".jpg", ".tif")): #跳過非圖片文件 .endswith判斷文件格式continuem = Image.open(os.path.join(mask_folder, fname)).convert("L") #.convert 將數據改為單通道數據 黑白圖片m = m.resize(size, Image.NEAREST)          # 保持 label 不插值m = np.array(m)m = (m > 0).astype(np.uint8)               # 轉成 0/1 二值化 (m > 0)布爾判斷 生成一個和m形同形狀的數組 并比較比0大的就是1 其他的就是0final = np.maximum(final, m)   #將符合條件的masks合并             # 像素級取最大值return final * 255      #最后輸出的值為255\0 方便保存                       # 保存成 0/255def process_one_case(case_dir, out_img_dir, out_mask_dir, size):"""處理單個病例,輸出 image.png & mask.png"""# 1. 讀取原圖(每個 images 文件夾只含一張)img_folder = os.path.join(case_dir, "images")#拼接路徑,得到某病例的“images”文件夾路徑img_name   = os.listdir(img_folder)[0]img        = read_and_resize(os.path.join(img_folder, img_name), size)# 2. 合并 maskmask_folder = os.path.join(case_dir, "masks")mask        = merge_instance_masks(mask_folder, size)# 3. 生成保存路徑case_id = os.path.basename(case_dir)img_out_path  = os.path.join(out_img_dir,  f"{case_id}.png")mask_out_path = os.path.join(out_mask_dir, f"{case_id}.png")# 4. 保存Image.fromarray(img).save(img_out_path)Image.fromarray(mask).save(mask_out_path)def main():ensure_dir(OUT_IMG_DIR)ensure_dir(OUT_MASK_DIR)case_dirs = [os.path.join(SRC_ROOT, d) for d in os.listdir(SRC_ROOT)if os.path.isdir(os.path.join(SRC_ROOT, d))]for c in tqdm(case_dirs, desc="Processing cases"):process_one_case(c, OUT_IMG_DIR, OUT_MASK_DIR, TARGET_SIZE)print(f"? 處理完成!{len(case_dirs)} 張圖像已保存到 {OUT_IMG_DIR} / {OUT_MASK_DIR}")if __name__ == "__main__":main()

這是比較完整的掩膜合并代碼

掩膜(mask), 通俗易懂來說就是對圖片中重要內容做的標簽,一般的掩膜都是二值型的,背景的像素是0,而掩膜的像素是255。

為什么要進行掩膜合并:模型在處理文件時,一般是一張圖片只能對應一個mask,但是有些圖片中的特征比較多,需要多個mask標記,這些mask又是單獨的文件,所以要將他們合并,方便后面模型處理

掩膜合并的過程簡單來說就是:先確認文件的路徑存在,再將圖片提取出來,將圖片的格式通過插值的方法統一格式像素大小方便后面進行處理。提取出mask,進行與圖片相同的處理步驟后,通過二值化的方法提取出mask,最后在進行合并。

簡潔的二值化掩膜合并代碼

def merge_instance_masks(mask_folder, size):final_mask = np.zeros(size[::-1], dtype=np.uint8)for fname in os.listdir(mask_folder):if not fname.endswith('.png'):continuemask = Image.open(os.path.join(mask_folder, fname)).convert('L')mask = mask.resize(size, Image.NEAREST)mask = np.array(mask)mask = (mask > 0).astype(np.uint8)final_mask = np.maximum(final_mask, mask)return final_mask * 255

?

掩膜合并寫代碼的思路框架

  1. 明確掩膜格式和組織結構

    • 是多張單通道小掩膜文件,還是一張帶類別標簽的整圖?

    • 是灰度圖、RGB圖還是三維數組(如 .npy, .nii)?

    • 是實例掩膜(每個對象單獨一個文件)還是語義掩膜(每個像素分類標簽)?

  2. 確定目標掩膜格式

    • 是要把多個實例掩膜合成一張二值掩膜?

    • 還是轉換成語義分割標簽圖?

    • 還是保留多通道結構?(例如多類別多通道)

  3. 選擇對應處理方法

    • 對文件夾內的多個二值掩膜做像素級“或”運算(np.maximum)

    • 對語義標簽圖做像素級直接使用

    • 對多通道數組用數組操作疊加/轉換

  4. 寫對應的代碼模塊,保證流程:讀掩膜→處理→保存

其他mask類型的掩膜合并代碼?

語義分割標簽圖(單文件,類別標簽編碼)?

def process_semantic_mask(mask_path, size):mask = Image.open(mask_path)mask = mask.resize(size, Image.NEAREST)mask = np.array(mask)# 假設原始mask是類別編碼,如0-background,1-腫瘤,2-器官# 這里直接返回,不合并return mask

多類別掩膜存為多通道 npy 文件,轉換為單通道標簽圖?

def multi_channel_npy_to_label(mask_npy_path, size):mask_3d = np.load(mask_npy_path)  # shape: (C, H, W)mask_3d_resized = np.zeros((mask_3d.shape[0], size[1], size[0]), dtype=np.uint8)for i in range(mask_3d.shape[0]):channel = cv2.resize(mask_3d[i], size, interpolation=cv2.INTER_NEAREST)mask_3d_resized[i] = channel# 逐像素最大類別索引作為標簽label_mask = np.argmax(mask_3d_resized, axis=0).astype(np.uint8)return label_mask

掩膜合并中常用的函數方法?

  • Image.open() 讀取圖片

  • img.resize() 縮放圖片

  • np.array() 轉成數組

  • np.maximum() 進行掩膜合并

  • Image.fromarray() + .save() 保存圖片

  • os.listdir() 遍歷目錄

  • os.path.join() 拼接路徑

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

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

相關文章

藍橋杯5130 健身

問題描述 小藍要去健身,他可以在接下來的 1~n 天中選擇一些日子去健身。 他有 m 個健身計劃,對于第 i 個健身計劃,需要連續的 天,如果成功完成,可以獲得健身增益 si? ,如果中斷,得不到任何…

auto關鍵字解析

前言 在11標準之前,auto在c中是聲明存儲器類型的關鍵字。而在11標準中它的功能變為了類型推導。 對此, 在這里引入Cprimer中的原句: 編程時常常需要把表達式的值賦給變量,這就要求在聲明變量的時候清楚的知道表達式的類型。然而…

嵌入式STM32學習——串口USART 2.0(printf重定義及串口發送)

printf重定義: C語言里面的printf函數默認輸出設備是顯示器,如果要實現printf函數輸出正在串口或者LCD顯示屏上,必須要重定義標準庫函數里調用的與輸出設備相關的函數,比如printf輸出到串口,需要將fputc里面的輸出指向…

信號量機制:操作系統中的同步與互斥利器

在計算機操作系統中,信號量機制是一種重要的進程同步與互斥工具。它廣泛應用于多進程或多線程環境中,用于解決并發訪問共享資源時可能出現的競態條件問題。本文將從信號量的基本概念出發,逐步深入探討其工作原理、實現方式以及實際應用&#…

LeetCode 1004. 最大連續1的個數 III

LeetCode 1004題 “最大連續1的個數 III” 是一道關于數組和滑動窗口的問題。題目描述如下: 題目描述 給定一個由若干 0 和 1 組成的數組 nums,以及一個整數 k。你可以將最多 k 個 0 翻轉為 1。返回經過翻轉操作后,數組中連續 1 的最大個數…

digitalworld.local: FALL靶場

digitalworld.local: FALL 來自 <digitalworld.local: FALL ~ VulnHub> 1&#xff0c;將兩臺虛擬機網絡連接都改為NAT模式 2&#xff0c;攻擊機上做namp局域網掃描發現靶機 nmap -sn 192.168.23.0/24 那么攻擊機IP為192.168.23.182&#xff0c;靶場IP192.168.23.4 3&…

經典Java面試題的答案——Java 基礎

大家好&#xff0c;我是九神。這是互聯網技術崗的分享專題&#xff0c;廢話少說&#xff0c;進入正題&#xff1a; 1.JDK 和 JRE 有什么區別&#xff1f; JDK&#xff1a;Java Development Kit 的簡稱&#xff0c;java 開發工具包&#xff0c;提供了 java 的開發環境和運行環境…

LabVIEW風機狀態實時監測

在當今電子設備高度集成化的時代&#xff0c;設備散熱成為關鍵問題。許多大型設備機箱常采用多個風機協同散熱&#xff0c;確保系統穩定運行。一旦風機出現故障&#xff0c;若不能及時察覺&#xff0c;可能導致設備損壞&#xff0c;造成巨大損失。為滿足對機箱內風機狀態實時監…

18 C 語言算術、關系、邏輯運算符及 VS Code 警告配置詳解

1 運算符與表達式核心概念 1.1 什么是運算符 運算符是編程和數學中具有特定功能的符號&#xff0c;用于對數據進行運算、賦值、比較及邏輯處理等操作。它們能夠改變、組合或比較操作數的值&#xff0c;進而生成新值或觸發特定動作。 1.2 什么是表達式 表達式是編程和數學中用…

shell腳本之函數詳細解釋及運用

什么是函數 通俗地講&#xff0c;所謂函數就是將一組功能相對獨立的代碼集中起來&#xff0c;形成一個代碼塊&#xff0c;這個代碼可 以完成某個具體的功能。從上面的定義可以看出&#xff0c;Shell中的函數的概念與其他語言的函數的 概念并沒有太大的區別。從本質上講&#…

86.評論日記

再談小米SU7高速爆燃事件_嗶哩嗶哩_bilibili 2025年5月21日14:00:45

Babylon.js學習之路《七、用戶交互:鼠標點擊、拖拽與射線檢測》

文章目錄 1. 引言&#xff1a;用戶交互的核心作用1.1 材質與紋理的核心作用 2. 基礎交互&#xff1a;鼠標與觸摸事件2.1 綁定鼠標點擊事件2.2 觸摸事件適配 3. 射線檢測&#xff08;Ray Casting&#xff09;3.1 射線檢測的原理3.2 高級射線檢測技巧 4. 拖拽物體的實現4.1 拖拽基…

adb抓包

目錄 抓包步驟 步驟 1: 獲取應用的包名 步驟 2: 查看單個應用的日志 步驟 3: 使用日志級別過濾器 步驟 4: 高級日志過濾 可能的原因&#xff1a; 解決方案&#xff1a; 額外提示&#xff1a; 日志保存 抓包步驟 連接設備 adb devices 步驟 1: 獲取應用的包名 首先…

什么是實時流數據?核心概念與應用場景解析

在當今數字經濟時代&#xff0c;實時流數據正成為企業核心競爭力。金融機構需要實時風控系統在欺詐交易發生的瞬間進行攔截&#xff1b;電商平臺需要根據用戶實時行為提供個性化推薦&#xff1b;工業物聯網需要監控設備狀態預防故障。這些場景都要求系統能夠“即時感知、即時分…

百度飛槳OCR(PP-OCRv4_server_det|PP-OCRv4_server_rec_doc)文本識別-Java項目實踐

什么是OCR? OCR&#xff08;Optical Character Recognition&#xff0c;光學字符識別&#xff09;是一種通過技術手段將圖像或掃描件中的文字內容轉換為可編輯、可搜索的文本格式&#xff08;如TXT、Word、PDF等&#xff09;的技術。它廣泛應用于文檔數字化、信息提取、自動化…

Pytorch實現常用代碼筆記

Pytorch實現常用代碼筆記 基礎實現代碼其他代碼示例Networks or ProjectsNetwork ModulesLossUtils 基礎實現代碼 參考 深度學習手寫代碼 其他代碼示例 Networks or Projects SENet學習筆記 SKNet——SENet孿生兄弟篇 GCNet&#xff1a;當Non-local遇見SENet YOLOv1到YOLO…

word通配符表

目錄 一、word查找欄代碼&通配符一覽表二、word替換欄代碼&通配符一覽表三、參考文獻 一、word查找欄代碼&通配符一覽表 序號清除使用通配符復選框勾選使用通配符復選框特殊字符代碼特殊字符代碼or通配符1任意單個字符^?一個任意字符?2任意數字^#任意數字&#…

TYUT-企業級開發教程-第6章

這一章 考點不多 什么是緩存&#xff1f;為什么要設計出緩存&#xff1f; 企業級應用為了避免讀取數據時受限于數據庫的訪問效率而導致整體系統性能偏低&#xff0c;通 常會在應用程序與數據庫之間建立一種臨時的數據存儲機制&#xff0c;該臨時存儲數據的區域稱 為緩存。緩存…

雙檢鎖(Double-Checked Locking)單例模式

在項目中使用雙檢鎖&#xff08;Double-Checked Locking&#xff09;單例模式來管理 JSON 格式化處理對象&#xff08;如 ObjectMapper 在 Jackson 庫中&#xff0c;或 JsonParser 在 Gson 庫中&#xff09;是一種常見的做法。這種模式確保了對象只被創建一次&#xff0c;同時在…

華為網路設備學習-22(路由器OSPF-LSA及特殊詳解)

一、基本概念 OSPF協議的基本概念 OSPF是一種內部網關協議&#xff08;IGP&#xff09;&#xff0c;主要用于在自治系統&#xff08;AS&#xff09;內部使路由器獲得遠端網絡的路由信息。OSPF是一種鏈路狀態路由協議&#xff0c;不直接傳遞路由表&#xff0c;而是通過交換鏈路…