国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Python VTK】讀取二維序列醫(yī)學(xué)圖像分割結(jié)果并進(jìn)行三維重建

這篇具有很好參考價(jià)值的文章主要介紹了【Python VTK】讀取二維序列醫(yī)學(xué)圖像分割結(jié)果并進(jìn)行三維重建。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、問題描述

最近在開發(fā)過程中遇到了這樣的問題:

在醫(yī)學(xué)圖像開發(fā)過程中,我們將醫(yī)學(xué)圖像通過深度學(xué)習(xí)算法進(jìn)行分割,現(xiàn)在想要通過這一套二維圖像進(jìn)行三維重構(gòu)。

以下是分割結(jié)果:

【Python VTK】讀取二維序列醫(yī)學(xué)圖像分割結(jié)果并進(jìn)行三維重建

圖一:前列腺核磁圖像分割結(jié)果 圖一:前列腺核磁圖像分割結(jié)果 圖一:前列腺核磁圖像分割結(jié)果

以下是讀取的遮罩mask:

【Python VTK】讀取二維序列醫(yī)學(xué)圖像分割結(jié)果并進(jìn)行三維重建

圖二:圖像分割遮罩 圖二:圖像分割遮罩 圖二:圖像分割遮罩
如何將這些二維圖像進(jìn)行三維重建,是個(gè)棘手問題,筆者通過vtk進(jìn)行建模操作。

二、解決方案

0. 寫在前面

醫(yī)學(xué)圖像的三維重建本身就是熱點(diǎn)技術(shù),這項(xiàng)技術(shù)也并非新鮮技術(shù),筆者調(diào)研多份前者的博客與其余資料,整理出了自己的解決方案,旨在與大家共同交流,如果您有更好的建模方案,歡迎隨時(shí)與我交流!

1. 準(zhǔn)備工作

進(jìn)行醫(yī)學(xué)圖像的三維重建,首先需要提供清晰可見的輪廓與遮罩。(如圖二所示)

所用到的庫:

  • vtk,您可以通過 pip install vtk 直接安裝

2. 文件結(jié)構(gòu)

  • mask文件夾 (用于存放分割結(jié)果遮罩,圖片名為 mask_0.png, mask_1.png , mask_2.png 等20張圖片)
  • vtk_gaussian.py (python腳本,用于執(zhí)行并進(jìn)行三維重建)

如圖所示:

【Python VTK】讀取二維序列醫(yī)學(xué)圖像分割結(jié)果并進(jìn)行三維重建

圖三:項(xiàng)目采用的文件結(jié)構(gòu) 圖三:項(xiàng)目采用的文件結(jié)構(gòu) 圖三:項(xiàng)目采用的文件結(jié)構(gòu)

3. 代碼講解

3.0 完整代碼

我知道有的朋友比較急,這里先給出完整代碼:

import vtk

# 定義渲染窗口、交互模式
aRender = vtk.vtkRenderer()
Renwin = vtk.vtkRenderWindow()
Renwin.AddRenderer(aRender)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(Renwin)

# 定義個(gè)圖片讀取接口
# 讀取PNG圖片就換成PNG_Reader = vtk.vtkPNGReader()
PNG_Reader = vtk.vtkPNGReader()
PNG_Reader.SetNumberOfScalarComponents(1)
PNG_Reader.SetFileDimensionality(2)  # 說明圖像是三維的

# 定義圖像大小,本行表示圖像大小為(512*512*240)
PNG_Reader.SetDataExtent(0, 256, 0, 256, 0, 19)
# 設(shè)置圖像的存放位置
name_prefix = ['mask/mask_']
PNG_Reader.SetFilePrefix(name_prefix[0])

# 設(shè)置圖像前綴名字
# 表示圖像前綴為數(shù)字(如:0.jpg)
PNG_Reader.SetFilePattern("%s%d.png")
PNG_Reader.Update()
PNG_Reader.SetDataByteOrderToLittleEndian()
spacing = [1.0, 1.0, 2.5]  # x, y 方向上的間距為 2 像素,z 方向上的間距為 2.5 像素
PNG_Reader.GetOutput().SetSpacing(spacing)

# 高斯平滑
gauss = vtk.vtkImageGaussianSmooth()
gauss.SetInputConnection(PNG_Reader.GetOutputPort())
gauss.SetStandardDeviations(1.0, 1.0, 1.0)
gauss.SetRadiusFactors(1.0, 1.0, 1.0)
gauss.Update()

# 計(jì)算輪廓的方法
contour = vtk.vtkMarchingCubes()
gauss.GetOutput().SetSpacing(spacing)
contour.SetInputConnection(gauss.GetOutputPort())
contour.ComputeNormalsOn()
contour.SetValue(0, 100)

mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(contour.GetOutputPort())
mapper.ScalarVisibilityOff()

actor = vtk.vtkActor()
actor.SetMapper(mapper)

renderer = vtk.vtkRenderer()
renderer.SetBackground([1.0, 1.0, 1.0])
renderer.AddActor(actor)

window = vtk.vtkRenderWindow()
window.SetSize(512, 512)
window.AddRenderer(renderer)

interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(window)

# 開始顯示
if __name__ == '__main__':
    window.Render()
    interactor.Initialize()
    interactor.Start()

3.1 定義渲染窗口、交互模式

import vtk

# 定義渲染窗口、交互模式
aRender = vtk.vtkRenderer()
Renwin = vtk.vtkRenderWindow()
Renwin.AddRenderer(aRender)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(Renwin)

本人的所有三維重建腳本中幾乎都包含這一塊內(nèi)容,同時(shí)這也是進(jìn)行vtk交互窗口初始化的部分,更多信息您可以查閱vtk官方文檔或者其他技術(shù)博客。

3.2 讀取二維圖像序列 - 定義讀取接口

要將mask_0.pngmask_19.png的圖像全部讀取,需要先定義個(gè)圖片讀取接口 (vtk.vtkXxxReader)。

筆者的圖像為.png格式,因此使用vtk.vtkPNGReader() 進(jìn)行圖像讀取。

PNG_Reader = vtk.vtkPNGReader()
PNG_Reader.SetNumberOfScalarComponents(1)
PNG_Reader.SetFileDimensionality(2)  # 說明圖像是二維的

在這里,可以根據(jù)不同的圖片格式選取不同的vtkReader,如果是 .jpg 格式的圖像,可以有如下更改:

JPG_Reader = vtk.vtkJPEGReader()
# your code here...

3.3 讀取二維圖像序列 - 前置設(shè)置 & 圖像讀取

# 定義圖像大小,本人表示圖像大小為(256*256)
# 后兩個(gè)參數(shù)是圖片的數(shù)目,本人這里所用的圖像共20張,所以就輸入0, 19
# 在后續(xù)讀取的時(shí)候,會(huì)根據(jù)這個(gè)序列進(jìn)行讀取
PNG_Reader.SetDataExtent(0, 256, 0, 256, 0, 19)
# 設(shè)置圖像的存放位置
name_prefix = ['mask/mask_']
PNG_Reader.SetFilePrefix(name_prefix[0])

# 表示圖像前綴為數(shù)字(如:0.jpg)
PNG_Reader.SetFilePattern("%s%d.png")
PNG_Reader.Update()
PNG_Reader.SetDataByteOrderToLittleEndian()

這段代碼是進(jìn)行圖像讀取的一些前置設(shè)置。SetDataExtent()函數(shù)的參數(shù)設(shè)置會(huì)對(duì)后續(xù)圖像的處理會(huì)有一定影響,請(qǐng)正確填寫您所使用的圖片的大小和數(shù)目!

SetFilePrefix() 函數(shù)會(huì)根據(jù)傳入的字符串進(jìn)行鎖定。在這里一定要特別注意

  • 本人的圖像存放在mask文件夾下,每張圖片的名字為:mask_0.png, mask_1.png
  • 在這里設(shè)置Prefix時(shí),就要輸入 mask/mask_
  • 后面的SetFilePattern() 函數(shù)會(huì)自動(dòng)讀取數(shù)字,因?yàn)榍熬Y已經(jīng)設(shè)置好,不需要再在此處進(jìn)行一些正則運(yùn)算符操作

3.4 圖像數(shù)據(jù)量少,三維建模的結(jié)果很扁平

解決方案:您可以增大圖像之間的間距來解決這個(gè)問題,緊接著上面的代碼:

PNG_Reader.SetDataByteOrderToLittleEndian()
spacing = [1.0, 1.0, 2.5]  # x, y 方向上的間距為 2 像素,z 方向上的間距為 2.5 像素
PNG_Reader.GetOutput().SetSpacing(spacing)

在讀取好圖片之后,可以設(shè)置圖像之間的 spacing 這個(gè)列表,分別代表x, y, z 三個(gè)維度的間距,其中我將z維度的間距增大為2.5, 這樣的操作在后面的建模中有顯著效果。具體內(nèi)容如下:

【Python VTK】讀取二維序列醫(yī)學(xué)圖像分割結(jié)果并進(jìn)行三維重建【Python VTK】讀取二維序列醫(yī)學(xué)圖像分割結(jié)果并進(jìn)行三維重建

圖四:兩種不同間距的建模結(jié)果,左圖為 z = 1.0 ,右圖為 z = 2.5 圖四:兩種不同間距的建模結(jié)果,左圖為z=1.0,右圖為z=2.5 圖四:兩種不同間距的建模結(jié)果,左圖為z=1.0,右圖為z=2.5

為了使建模結(jié)果更接近與器官的形狀,我建議設(shè)置好二維圖像之間的間距。

3.5 三維重建結(jié)果的平滑—高斯平滑

原本建模的結(jié)果“層次分明”,并不是特別美觀。筆者采用高斯平滑的方案對(duì)圖像進(jìn)行平滑。

如果您有更好的平滑方案,歡迎您與我交流!

# 高斯平滑
gauss = vtk.vtkImageGaussianSmooth()
gauss.SetInputConnection(PNG_Reader.GetOutputPort())
gauss.SetStandardDeviations(1.0, 1.0, 1.0)
gauss.SetRadiusFactors(1.0, 1.0, 1.0)
gauss.Update()
【Python VTK】讀取二維序列醫(yī)學(xué)圖像分割結(jié)果并進(jìn)行三維重建【Python VTK】讀取二維序列醫(yī)學(xué)圖像分割結(jié)果并進(jìn)行三維重建

圖五:兩種不同間距的平滑結(jié)果,左圖為未平滑,右圖為使用高斯平滑 圖五:兩種不同間距的平滑結(jié)果,左圖為未平滑,右圖為使用高斯平滑 圖五:兩種不同間距的平滑結(jié)果,左圖為未平滑,右圖為使用高斯平滑

3.6 計(jì)算輪廓與邊緣提取

在進(jìn)行高斯平滑之后,進(jìn)行邊緣提取。

# 計(jì)算輪廓的方法
contour = vtk.vtkMarchingCubes()
gauss.GetOutput().SetSpacing(spacing)
contour.SetInputConnection(gauss.GetOutputPort())
contour.ComputeNormalsOn()
contour.SetValue(0, 100)

3.7 管道操作與可視化展示

后面這段代碼是vtk的顯示部分,筆者一般不去動(dòng)它,也是每一份腳本中的固有內(nèi)容,如果您對(duì)該部分感興趣,您應(yīng)該查閱vtk官方文檔。

mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(contour.GetOutputPort())
mapper.ScalarVisibilityOff()

actor = vtk.vtkActor()
actor.SetMapper(mapper)

renderer = vtk.vtkRenderer()
renderer.SetBackground([1.0, 1.0, 1.0])
renderer.AddActor(actor)

window = vtk.vtkRenderWindow()
window.SetSize(512, 512)
window.AddRenderer(renderer)

interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(window)

# 開始顯示
if __name__ == '__main__':
    window.Render()
    interactor.Initialize()
    interactor.Start()

三、一些vtk庫的使用經(jīng)驗(yàn)分享

1. python vtk

個(gè)人感覺python vtk的開發(fā)并沒有pythonic風(fēng)格,開發(fā)者有一些將cpp的開發(fā)思路帶入python庫/接口的設(shè)計(jì),讓我寫起來味如嚼蠟,從上面的代碼亦可以看出,具有濃厚的cpp風(fēng)格。

不過代碼能跑就行,不得不說vtk仍然是很強(qiáng)大的三維重建工具!

2. 數(shù)據(jù)傳入的兩種方式

2.1 .GetOutputPort().SetInputConnection()

您會(huì)看見諸如 contour.SetInputConnection(gauss.GetOutputPort()) 的句子。

這兩個(gè)函數(shù)一般是成對(duì)出現(xiàn),上下傳遞的。

2.1 .GetOutput().SetInputData()

筆者在參閱其他博主的博客時(shí),同樣看見這樣的寫法,例如:

contour.SetInputData(gauss.GetOutput())

這兩個(gè)函數(shù)一般是成對(duì)出現(xiàn)的,進(jìn)行上下傳遞處理結(jié)果。

3. vtkImageData 和 vtkPolyData

在開發(fā)過程中,您可能會(huì)遇到不少報(bào)錯(cuò),其中肯定會(huì)有vtk數(shù)據(jù)類型報(bào)錯(cuò)的問題。我整理了一份表格:

Name Input Type Return Type Variable
vtk.vtkPNGReader() ? vtkImageData PNG_Reader
vtk.vtkImageGaussianSmooth() vtkImageData vtkImageData gauss
vtk.vtkMarchingCubes() vtkImageData vtkPolyData contour
vtk.vtkPolyDataNormals() vtkImageData vtkPolyData normfilter

希望能夠幫助您解決開發(fā)過程中的一些疑惑。

后記

醫(yī)學(xué)圖像的三維重建工作部分博客較少,筆者希望提供一些星星之火,大家共同進(jìn)步!

筆者采用的重建代碼已經(jīng)打包至百度云盤,您可以通過下面的鏈接下載:

下載鏈接

提取碼:jpt3文章來源地址http://www.zghlxwxcb.cn/news/detail-428536.html

到了這里,關(guān)于【Python VTK】讀取二維序列醫(yī)學(xué)圖像分割結(jié)果并進(jìn)行三維重建的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • UNet深度學(xué)習(xí)模型在醫(yī)學(xué)圖像分割中的應(yīng)用及其Python實(shí)現(xiàn)細(xì)節(jié)

    第一部分:引言和UNet架構(gòu)簡(jiǎn)介 引言 : 醫(yī)學(xué)圖像分割是醫(yī)療圖像處理的重要領(lǐng)域,它涉及將圖像劃分為多個(gè)區(qū)域,以標(biāo)識(shí)和隔離感興趣的區(qū)域(如器官、腫瘤等)。近年來,隨著深度學(xué)習(xí)技術(shù)的發(fā)展,多種神經(jīng)網(wǎng)絡(luò)模型被應(yīng)用于這一領(lǐng)域。其中,UNet模型因其出色的表現(xiàn)而受

    2024年02月12日
    瀏覽(89)
  • 【醫(yī)學(xué)圖像】圖像分割系列.2 (diffusion)

    【醫(yī)學(xué)圖像】圖像分割系列.2 (diffusion)

    介紹幾篇使用diffusion來實(shí)現(xiàn)醫(yī)學(xué)圖像分割的論文:DARL(ICLR2023),MedSegDiff(MIDL2023) MedSegDiff-V2(arXiv2023),ImgX-DiffSeg(arXiv2023) 基礎(chǔ)概念: 一文弄懂 Diffusion Model (qq.com)。 表示學(xué)習(xí)(representation learning)初印象 - 知乎 (zhihu.com)。 10分鐘快速入門PyTorch (10) - 知乎 (zhihu.com)。 解讀

    2024年02月07日
    瀏覽(44)
  • 醫(yī)學(xué)圖像分割之MedNeXt

    醫(yī)學(xué)圖像分割之MedNeXt

    論文: MedNeXt: Transformer-driven Scaling of ConvNets for Medical Image Segmentation ConvNeXt 網(wǎng)絡(luò)是一種借鑒 Transformer 的思想進(jìn)行了改進(jìn)實(shí)現(xiàn)的全卷積網(wǎng)絡(luò),其通過全卷積網(wǎng)絡(luò)和逆向殘差瓶頸單元的設(shè)計(jì),可以實(shí)現(xiàn)比較大的空間感受野。本文在此基礎(chǔ)上提出了新的可伸縮,標(biāo)準(zhǔn)化的網(wǎng)絡(luò)結(jié)構(gòu)

    2023年04月08日
    瀏覽(20)
  • 醫(yī)學(xué)圖像分割

    醫(yī)學(xué)圖像分割

    方法 內(nèi)容 監(jiān)督學(xué)習(xí) 骨干網(wǎng)絡(luò)的選擇、網(wǎng)絡(luò)塊的設(shè)計(jì)、損失函數(shù)的改進(jìn) 弱監(jiān)督學(xué)習(xí) 數(shù)據(jù)增強(qiáng)、遷移學(xué)習(xí)、交互式分割研究 醫(yī)學(xué)圖像分割的難點(diǎn): 醫(yī)學(xué)圖像的特征提取,因?yàn)獒t(yī)學(xué)影像中存在模糊、噪聲、對(duì)比度低等問題。–CNN 醫(yī)學(xué)圖像通常含有噪聲且邊界模糊。–U-Net 目標(biāo)

    2024年02月04日
    瀏覽(20)
  • 深度學(xué)習(xí)實(shí)驗(yàn)-3d醫(yī)學(xué)圖像分割

    實(shí)驗(yàn)四 基于nnU-Net模型的3D醫(yī)學(xué)圖像分割實(shí)驗(yàn) 腹部多器官分割一直是醫(yī)學(xué)圖像分析領(lǐng)域最活躍的研究領(lǐng)域之一,其作為一項(xiàng)基礎(chǔ)技術(shù),在支持疾病診斷,治療規(guī)劃等計(jì)算機(jī)輔助技術(shù)發(fā)揮著重要作用。近年來,基于深度學(xué)習(xí)的方法在該領(lǐng)域中獲得了巨大成功。本實(shí)驗(yàn)數(shù)據(jù)集為多

    2024年02月07日
    瀏覽(99)
  • 通用醫(yī)學(xué)圖像分割模型UniverSeg

    通用醫(yī)學(xué)圖像分割模型UniverSeg

    雖然深度學(xué)習(xí)模型已經(jīng)成為醫(yī)學(xué)圖像分割的主要方法,但它們通常無法推廣到涉及新解剖結(jié)構(gòu)、圖像模態(tài)或標(biāo)簽的unseen分割任務(wù)。給定一個(gè)新的分割任務(wù),研究人員通常必須訓(xùn)練或微調(diào)模型,這很耗時(shí),并對(duì)臨床研究人員構(gòu)成了巨大障礙,因?yàn)樗麄兺狈τ?xùn)練神經(jīng)網(wǎng)絡(luò)的資

    2024年02月04日
    瀏覽(22)
  • 醫(yī)學(xué)圖像分割常用的評(píng)價(jià)指標(biāo)

    ????在醫(yī)學(xué)圖像分割的論文中,常常看到Dice、VOE、RVD、MSD等指標(biāo),但是具體這些指標(biāo)是什么意思呢,我們進(jìn)行相應(yīng)的簡(jiǎn)單說明。 V s e g text V_{s e g} V s e g ? :代表預(yù)測(cè)的分割結(jié)果 V g t text V_{g t} V g t ? :代表ground truth的分割結(jié)果 ????Dice 系數(shù)是一種評(píng)估相似度的函

    2024年02月08日
    瀏覽(27)
  • 醫(yī)學(xué)圖像的圖像處理、分割、分類和定位-1

    醫(yī)學(xué)圖像的圖像處理、分割、分類和定位-1

    ????????本報(bào)告全面探討了應(yīng)用于醫(yī)學(xué)圖像的圖像處理和分類技術(shù)。開展了四項(xiàng)不同的任務(wù)來展示這些方法的多功能性和有效性。任務(wù) 1 涉及讀取、寫入和顯示 PNG、JPG 和 DICOM 圖像。任務(wù) 2 涉及基于定向變化的多類圖像分類。此外,我們?cè)谌蝿?wù) 3 中包括了胸部 X 光圖像的性

    2024年01月19日
    瀏覽(27)
  • CVPR 2023 醫(yī)學(xué)圖像分割論文大盤點(diǎn)

    CVPR 2023 醫(yī)學(xué)圖像分割論文大盤點(diǎn)

    點(diǎn)擊下方 卡片 ,關(guān)注“ CVer ”公眾號(hào) AI/CV重磅干貨,第一時(shí)間送達(dá) 點(diǎn)擊進(jìn)入— 【醫(yī)學(xué)圖像分割】微信交流群 被催了很久,CVer 正式開啟 CVPR 2023 論文大盤點(diǎn)系列 ! Amusi?一共搜集了13篇醫(yī)學(xué)圖像分割論文 ,這應(yīng)該是目前各平臺(tái)上 最新最全面的CVPR 2023?醫(yī)學(xué)圖像分割盤點(diǎn)資料

    2024年02月14日
    瀏覽(46)
  • 醫(yī)學(xué)圖像分割的全卷積transformer

    醫(yī)學(xué)圖像分割的全卷積transformer

    我們提出了一種新的Transformer ,能夠分割不同模式的醫(yī)學(xué)圖像。醫(yī)學(xué)圖像分析的細(xì)粒度特性所帶來的挑戰(zhàn)意味著Transformer 對(duì)其分析的適應(yīng)仍處于初級(jí)階段。UNet的巨大成功在于它能夠理解分割任務(wù)的細(xì)粒度性質(zhì),這是現(xiàn)有的基于變壓器的模型目前所不具備的能力。為了解決這個(gè)

    2024年02月12日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包