2021年認證杯SPSSPRO杯數學建模A題(第二階段)醫學圖像的配準全過程文檔及程序

2021年認證杯SPSSPRO杯數學建模

A題 醫學圖像的配準

原題再現:

??圖像的配準是圖像處理領域中的一個典型問題和技術難點,其目的在于比較或融合同一對象在不同條件下獲取的圖像。例如為了更好地綜合多種信息來辨識不同組織或病變,醫生可能使用多種儀器對患者的同一部位進行成像。在綜合多幅圖像時,首先需要將它們嚴格對齊,使得圖上同一個坐標的位置對應的是真實對象的同一個點,這個過程稱之為配準。現在的許多醫學成像技術,包括 CT、MRI、PET 等,最終生成的是人體的斷層影像。在這里,我們主要關心的是斷層成像的配準問題。
??我們考慮對一個患者的腹部進行斷層成像。由于人體組織是柔軟的,所以即使使用同一臺成像設備,兩次成像的結果也并不完全一致。最終輸出時還會對圖像進行自動放縮,所以輸出圖片的大小也并不完全相同。想要精確配準,需要將其中一次的成像結果進行某種仿射變換(或非線性變換),以盡可能地匹配另一次的結果(或將兩次結果都映射到同一個標準模板中)。求得合適的變換就是圖像配準的核心任務。
??第二階段問題:多模態的配準是指對來自不同設備的圖像進行配準,例如對CT和MRI圖像進行配準。有的組織或病變部位在單一的成像技術下與周邊組織的區分不明顯,所以我們可以對多種成像技術得到的圖片進行融合處理,讓每個像素點的成像結果表現為一個多維向量(每個分量都是一種成像技術的成像結果),這樣可以更好地識別組織或病變的細節。多模態的配準則是圖像融合的第一步。
??現在我們有對患者同一身體部位(同一時間)的CT、MRI和PET成像結果。但在圖像融合處理時遇到了兩個問題:首先,每一種成像技術對不同組織的區分能力是不同的,例如有些不同的組織在CT下看起來區別不大,但在MRI下區分卻十分明顯;另外一些組織在MRI下區別不大,但在CT下區分卻十分明顯。所以對不同的成像設備而言,即使是同一個位置的成像結果,也并非完全相似,這給配準帶來了難度。第二,在進行斷層成像時,雖然對每個設備而言,我們能夠確切地知道每個斷層的位置,但不同設備掃描的斷層位置并不完全相同。請你設計一個有效的方法,對這樣的成像結果進行圖像的融合。

整體求解過程概述(摘要)

??一種基于多模態醫學圖像的圖像融合方法可以顯著提高融合圖像的質量。一種有效的圖像融合技術通過保留從源圖像中收集到的所有可行的和顯著的信息而不引入任何缺陷或不必要的扭曲來產生輸出圖像。
??大多數深度學習方法采用所謂的單流高到低、低到高的網絡結構,能夠獲得滿意的整體配準結果。然而,一些嚴重變形的局部區域的精確定位,這是精確定位手術目標的關鍵,卻經常被忽視。因此,這些方法對一些難以對齊的區域不敏感,例如畸形肝葉的圖像配準融合。針對這一問題,我們提出一種新的無監督配準網絡,即全分辨率殘差配準網絡(F3RNet),用于嚴重變形器官的變形配準。該方法以殘差學習的方式結合了兩個并行處理流。一個流利用全分辨率信息,促進準確的體素級注冊。另一個流學習深度多尺度殘差表示以獲得魯棒特征識別與提取。此外,我們還使用了提升小波變換,混合融合等方法對圖像特征進行精確分類。最后對三維卷積進行因式分解,得到圖像配準與融合結果。我們選用了腹部和肺部的CT-MRI數據集對所提方法進行驗證,實驗結果表明所提方法可以獲取更高質量的配準融合圖像,同時又能顯著提高配準融合效率。
??為了驗證我們提出方法的有效性,我們選用自備的醫學CT圖像和MRI圖像數據集進行了評估,本文配準模型在肺部圖像與腦部圖像的配準值有一定程度的提升。從模型的運行的結果可以看出,當AUC值為0.883時,得到Dice稀疏為0.575,準確率為0.884,靈敏度為0.647,特異性為0.929,F1得分為0.640。模型中還進行了病變程度與匹配程度的相關性分析,在保證快捷的同時方便簡潔地解決了問題,具有一定的推廣意義。

問題分析:

??考慮到在進行疾病診斷時,不同的醫學圖像在進行疾病診斷時所發揮的作用時不同的,為更全面的了解病人的病情,往往需要多種醫學圖像提供不同的信息,通過這些信息的綜合分析,能夠為臨床診斷治療提供全面的信息。深度學習的發展為多模態醫學配準和圖像融合提供了新的思路,利用深度學習的模型尋找待配準圖像對像素點間的空間對應關系,使固定圖像與浮動圖像的像素點在空間解剖結構上對齊,根據對齊關系進行利用融合特性對這些提取的特征進行融合,能夠更清晰的反應病變的情況。該方案的具體解決措施如下:
??首先,提出一種全分辨率殘差配準網絡用于配準不同醫學圖像中的相關特征,通過設計全分辨率和多尺度殘差塊這兩個并行的網絡,全分辨率網絡在密集網絡表現較好,能夠通過常規殘差塊提取不同醫學圖像中的低階特征。多尺度殘差塊利用連續池化和卷積操作來增加識別范圍,善于捕捉高級特征,從而提高識別性能。這兩個并行網絡能夠全面提取不同醫學圖像的特征,不會因為醫學圖像分辨率不同導致特征提取不全面的情況。
??其次,在提取完全特征的基礎上,使用小波變換融合和混合圖像融合相結合的方法進行醫學圖像的融合。小波變換融合利用小波變換對源參考的醫學圖像進行分解,利用定量度量度量技術的性能,并比較技術的效率,以找到合適的融合規則。再使用混合圖像融合技術可以從有噪聲、失真的圖像中提取原始圖像特征,從而獲得改進和增強的圖像質量。

模型假設:

??在數學建模的過程中,為了使模型簡單明確,簡化運算過程,在不影響模型意義與計算精度的前提下,建立了如下假設:
??(1)假設同一組的醫學圖像來自于同一位患者。
??(2)假設用來采集每一張醫學圖像的設備都能正常采集醫學圖像。
??(3)假設采集到的醫學圖像沒有人為修改與損壞,并且能夠直接使用。
??(4)假設同一組診斷圖像為患者同一部位的醫學圖像。
??(5)假設患者在兩次成像之間身體沒有發生其他部分的病變,或者存在導致成像偏差的身體異狀。
??(6)假設每臺計算機輔助醫療系統的參數設定與配置都保持一致。

論文縮略圖:

在這里插入圖片描述

程序代碼:

from typing import Union, Optional, List, Tuple, Text, BinaryIO
import pathlib
import torch
import math
import warnings
import numpy as np
from PIL import Image, ImageDraw, ImageFont, ImageColor
__all__=["make_grid","save_image", "draw_bounding_boxes", "draw_segmentation_masks"]
def make_grid(tensor: Union[torch.Tensor, List[torch.Tensor]],nrow: int = 8,padding: int = 2,normalize: bool = False,value_range: Optional[Tuple[int, int]] = None,scale_each: bool = False,pad_value: int = 0,**kwargs
) -> torch.Tensor:if not (torch.is_tensor(tensor) or(isinstance(tensor, list) and all(torch.is_tensor(t) for t in tensor))):raise TypeError(f'tensor or list of tensors expected, got {type(tensor)}')if "range" in kwargs.keys():warning = "range will be deprecated, please use value_range instead."warnings.warn(warning)value_range = kwargs["range"]# if list of tensors, convert to a 4D mini-batch Tensorif isinstance(tensor, list):tensor = torch.stack(tensor, dim=0)if tensor.dim() == 2:  # single image H x Wtensor = tensor.unsqueeze(0)if tensor.dim() == 3:  # single imageif tensor.size(0) == 1:  # if single-channel, convert to 3-channeltensor = torch.cat((tensor, tensor, tensor), 0)tensor = tensor.unsqueeze(0)if tensor.dim() == 4 and tensor.size(1) == 1:  # single-channel imagestensor = torch.cat((tensor, tensor, tensor), 1)if normalize is True:tensor = tensor.clone()  # avoid modifying tensor in-placeif value_range is not None:assert isinstance(value_range, tuple), \"value_range has to be a tuple (min, max) if specified. min and max are numbers"def norm_ip(img, low, high):img.clamp_(min=low, max=high)img.sub_(low).div_(max(high - low, 1e-5))def norm_range(t, value_range):if value_range is not None:norm_ip(t, value_range[0], value_range[1])else:norm_ip(t, float(t.min()), float(t.max()))if scale_each is True:for t in tensor:  # loop over mini-batch dimensionnorm_range(t, value_range)else:norm_range(tensor, value_range)if tensor.size(0) == 1:return tensor.squeeze(0)# make the mini-batch of images into a gridnmaps = tensor.size(0)xmaps = min(nrow, nmaps)ymaps = int(math.ceil(float(nmaps) / xmaps))height, width = int(tensor.size(2) + padding), int(tensor.size(3) + padding)num_channels = tensor.size(1)grid = tensor.new_full((num_channels, height * ymaps + padding, width * xmaps + padding), pad_value)k = 0for y in range(ymaps):for x in range(xmaps):if k >= nmaps:break# Tensor.copy_() is a valid method but seems to be missing from the stubs# https://pytorch.org/docs/stable/tensors.html#torch.Tensor.copy_grid.narrow(1, y * height + padding, height - padding).narrow(  # type: ignore[attr-defined]2, x * width + padding, width - padding).copy_(tensor[k])k = k + 1return grid
@torch.no_grad()
def save_image(tensor: Union[torch.Tensor, List[torch.Tensor]],fp: Union[Text, pathlib.Path, BinaryIO],format: Optional[str] = None,**kwargs
) -> None:grid = make_grid(tensor, **kwargs)# Add 0.5 after unnormalizing to [0, 255] to round to nearest integerndarr = grid.mul(255).add_(0.5).clamp_(0, 255).permute(1, 2, 0).to('cpu', torch.uint8).numpy()im = Image.fromarray(ndarr)im.save(fp, format=format)
def draw_bounding_boxes(image: torch.Tensor,boxes: torch.Tensor,labels: Optional[List[str]] = None,colors: Optional[List[Union[str, Tuple[int, int, int]]]] = None,fill: Optional[bool] = False,width: int = 1,font: Optional[str] = None,font_size: int = 10
) -> torch.Tensor:if not isinstance(image, torch.Tensor):raise TypeError(f"Tensor expected, got {type(image)}")elif image.dtype != torch.uint8:raise ValueError(f"Tensor uint8 expected, got {image.dtype}")elif image.dim() != 3:raise ValueError("Pass individual images, not batches")ndarr = image.permute(1, 2, 0).numpy()img_to_draw = Image.fromarray(ndarr)img_boxes = boxes.to(torch.int64).tolist()if fill:draw = ImageDraw.Draw(img_to_draw, "RGBA")else:draw = ImageDraw.Draw(img_to_draw)txt_font = ImageFont.load_default() if font is None else ImageFont.truetype(font=font, size=font_size)for i, bbox in enumerate(img_boxes):if colors is None:color = Noneelse:color = colors[i]if fill:if color is None:fill_color = (255, 255, 255, 100)elif isinstance(color, str):# This will automatically raise Error if rgb cannot be parsed.fill_color = ImageColor.getrgb(color) + (100,)elif isinstance(color, tuple):fill_color = color + (100,)draw.rectangle(bbox, width=width, outline=color, fill=fill_color)else:draw.rectangle(bbox, width=width, outline=color)if labels is not None:draw.text((bbox[0], bbox[1]), labels[i], fill=color, font=txt_font)return torch.from_numpy(np.array(img_to_draw)).permute(2, 0, 1).to(dtype=torch.uint8)
def draw_segmentation_masks(image: torch.Tensor,masks: torch.Tensor,alpha: float = 0.2,colors: Optional[List[Union[str, Tuple[int, int, int]]]] = None,
) -> torch.Tensor:if not isinstance(image, torch.Tensor):raise TypeError(f"Tensor expected, got {type(image)}")elif image.dtype != torch.uint8:raise ValueError(f"Tensor uint8 expected, got {image.dtype}")elif image.dim() != 3:raise ValueError("Pass individual images, not batches")elif image.size()[0] != 3:raise ValueError("Pass an RGB image. Other Image formats are not supported")num_masks = masks.size()[0]masks = masks.argmax(0)if colors is None:palette = torch.tensor([2 ** 25 - 1, 2 ** 15 - 1, 2 ** 21 - 1])colors_t = torch.as_tensor([i for i in range(num_masks)])[:, None] * palettecolor_arr = (colors_t % 255).numpy().astype("uint8")else:color_list = []for color in colors:if isinstance(color, str):# This will automatically raise Error if rgb cannot be parsed.fill_color = ImageColor.getrgb(color)color_list.append(fill_color)elif isinstance(color, tuple):color_list.append(color)color_arr = np.array(color_list).astype("uint8")_, h, w = image.size()img_to_draw = Image.fromarray(masks.byte().cpu().numpy()).resize((w, h))img_to_draw.putpalette(color_arr)img_to_draw = torch.from_numpy(np.array(img_to_draw.convert('RGB')))img_to_draw = img_to_draw.permute((2, 0, 1))return (image.float() * alpha + img_to_draw.float() * (1.0 - alpha)).to(dtype=torch.uint8)
全部論文及程序請見下方“ 只會建模 QQ名片” 點擊QQ名片即可

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

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

相關文章

RPM之(1)基礎使用

RPM之(1)基礎使用 Author: Once Day Date: 2025年5月26日 一位熱衷于Linux學習和開發的菜鳥,試圖譜寫一場冒險之旅,也許終點只是一場白日夢… 漫漫長路,有人對你微笑過嘛… 全系列文章可參考專欄: Linux實踐記錄_Once-Day的博客-CSDN博客 …

國內可做大批量pcb的工廠有哪些?

在電子產業升級浪潮中,PCB作為電子設備的基礎載體,其批量生產能力直接決定著終端產品的市場響應速度與品質穩定性。本文精選五家具備核心競爭力的廠商,從工藝深度、產能規模到服務模式展開剖析,為采購決策提供專業參考。 獵板PCB…

【視頻】使用海康SDK保存的MP4無法在瀏覽器(html5)中播放

1、問題描述 在使用海康 SDK 的 NET_DVR_SaveRealData 接口,將視頻流保存成MP4文件后,通過瀏覽器無法播放MP4,播放其它的MP4正常。 2、原因分析 對比可以正常播放的MP4 和 無法播放的MP4文件,比較它們的詳細信息,發…

AI時代新詞-生成對抗網絡(GAN)

一、什么是生成對抗網絡(GAN)? 生成對抗網絡(Generative Adversarial Network,簡稱GAN)是一種由生成器(Generator)和判別器(Discriminator)組成的深度學習模…

使用AutoKeras2.0的AutoModel進行結構化數據回歸預測

1、First of All: Read The Fucking Source Code import autokeras as ak import numpy as np from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error# 生成數據集 np.random.seed(42) x np.random.rand(1000, 10) # 生成1…

實戰設計模式之訪問者模式

概述 訪問者模式允許我們在不改變類的前提下,向已有類添加新的功能。簡單來說,就是將算法與對象的數據結構進行分離的一種方法。在實際應用中,當我們需要對一組對象執行一些操作,而這些操作又需要隨著需求的變化而不斷變化時&…

centos7.9使用docker-compose安裝kafka

docker-compose配置文件 services:zookeeper:image: confluentinc/cp-zookeeper:7.0.1hostname: zookeepercontainer_name: zookeeperports:- "2181:2181"environment:ZOOKEEPER_CLIENT_PORT: 2181ZOOKEEPER_TICK_TIME: 2000kafka:image: confluentinc/cp-kafka:7.0…

STM32:Modbus通信協議核心解析:關鍵通信技術

知識點1【 Modbus通信】 1、Modbus的概述 Modbus是OSI模型第七層的應用層報文傳輸協議 協議:說明有組包和解包的過程 2、通信機制 Modelbus是一個請求/應答協議 通信機制:主機輪詢,從機應答的機制。每個從設備有唯一的地址,主…

LeetCode 3362.零數組變換 III:貪心+優先隊列+差分數組——清晰題解

【LetMeFly】3362.零數組變換 III:貪心優先隊列差分數組——清晰題解 力扣題目鏈接:https://leetcode.cn/problems/zero-array-transformation-iii/ 給你一個長度為 n 的整數數組 nums 和一個二維數組 queries ,其中 queries[i] [li, ri] …

ORM++ 封裝實戰指南:安全高效的 C++ MySQL 數據庫操作

ORM 封裝實戰指南:安全高效的 C MySQL 數據庫操作 一、環境準備 1.1 依賴安裝 # Ubuntu/Debian sudo apt-get install libmysqlclient-dev # CentOS sudo yum install mysql-devel# 編譯時鏈接庫 (-I 指定頭文件路徑 -L 指定庫路徑) g main.cpp -stdc17 -I/usr/i…

JESD204B 協議介紹

一、協議概述 JESD204B是由JEDEC(固態技術協會)制定的高速串行接口標準,專為模數轉換器(ADC)、數模轉換器(DAC)與邏輯器件(如FPGA、ASIC)之間的數據傳輸設計。其核心目標…

yolov8,c++案例匯總

文章目錄 引言多目標追蹤案例人體姿態估計算法手勢姿態估計算法目標分割算法 引言 以下案例,基于c,ncnn,yolov8既可以在windows10/11上部署, 也可以在安卓端部署, 也可以在嵌入式端部署, 服務器端可支持部署封裝為DLL,支持c/c#/java端調用 多目標追蹤案例 基于yolov8, ncnn,…

運動規劃實戰案例 | 圖解基于狀態晶格(State Lattice)的路徑規劃(附ROS C++/Python仿真)

目錄 1 控制采樣 vs 狀態采樣2 State Lattice路徑規劃2.1 算法流程2.2 Lattice運動基元生成2.3 幾何代價函數2.4 運動學約束啟發式 3 算法仿真3.1 ROS C仿真3.2 Python仿真 1 控制采樣 vs 狀態采樣 控制采樣的技術路線源自經典的運動學建模思想。這種方法將機器人的控制指令空…

BERT框架:自然語言處理的革命性突破

引言 在自然語言處理(NLP)領域,2018年Google推出的BERT(Bidirectional Encoder Representations from Transformers)框架無疑是一場革命。作為基于Transformer架構的雙向編碼器表示模型,BERT通過預訓練學習…

【Fifty Project - D31】

結束了一個超級消耗周末,滿安排之健身梅溪湖游泳做飯喝酒羽毛球賽 完全力竭了,久久不能恢復過來,暫停健身安排了 端午后再繼續 今日完成記錄 TimePlan完成情況7:30 - 8:10有氧爬坡√9:00 - 11:…

信息學奧賽一本通 1547:【 例 1】區間和

【題目鏈接】 ybt 1547:【 例 1】區間和 【題目考點】 1. 線段樹 2. 樹狀數組 【解題思路】 本題要求維護區間和,實現單點修改、區間查詢。 解法1:線段樹 線段樹原理,及實現方法見:洛谷 P3374 【模板】樹狀數組…

力扣面試150題--求根節點到葉節點數字之和

Day 48 題目描述 思路 我們利用sum這個全局變量來保存總和值,遞歸函數sum來計算每個根到葉子節點路徑所代表的數,由于我們需要遍歷到每條根到葉子節點的路徑,所有我采取了前序遍歷,如果不是葉子節點,就計算到該節點代…

DJI上云API官方demo學習

1、websocket,所在位置如下圖,調用的可以用//websocket搜索 2、用到的http客戶端,axios 3、很多和后端交互都是走的http請求

uniapp開發小程序,如何根據權限動態配置按鈕或頁面內容

前言 寫了好幾個項目,發現小程序對權限控制非常麻煩,于是有了這個想法,但是網上找了一圈沒有一個比較完善的講解,因為小程序不支持自定義指令,所以不能像后臺那樣方便,于是就將幾個博主的想法結合。 思路就…

LSTM+Transformer混合模型架構文檔

LSTMTransformer混合模型架構文檔 模型概述 本項目實現了一個LSTMTransformer混合模型,用于超臨界機組協調控制系統的數據驅動建模。該模型結合了LSTM的時序建模能力和Transformer的自注意力機制,能夠有效捕捉時間序列數據中的長期依賴關系和變量間的復…