์์ ์๋ "MacOS์์ ๊ทธ๋ฃจ๋ฐ ์ธ๊ทธ๋ฉํ ์ด์ ์ผ๋ก ์์ํ๋ ๋ ธํธ๋ถ ์ถฉ๋"์ด์์ง๋ง ๋ง์ ์กฐ์ฌ๋ฅผ ํตํด ํธํ๋์ง ์๋ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ธํด ์ค์ ๋ฌธ์ ๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค.
๊นจ๋ํ ์์คํ , ๊นจ๋ํ ์ฝ๋ค.
์ด๊ฒ์ ์ถฉ๋ํ๋ ์ ์ ๋๋ค.
shapeSeg = shapeSegList[10]
itkw.view( image = sw2vtkImage(shapeSeg),
slicing_planes = True,
axes = True,
rotate = True,
interpolation = True)
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x000000014b76fff3
Exception Note: EXC_CORPSE_NOTIFY
Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL, Code 0xb
Terminating Process: exc handler [0]
VM Regions Near 0x14b76fff3:
MALLOC_LARGE 000000014b50a000-000000014b769000 [ 2428K] rw-/rwx SM=PRV
-->
MALLOC_LARGE 000000014b770000-000000014d863000 [ 32.9M] rw-/rwx SM=PRV
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libsystem_platform.dylib 0x00007fff564c85e6 _platform_memmove$VARIANT$Nehalem + 486
1 libvnl.dylib 0x000000010ae40e6b vnl_vector<double>::operator=(vnl_vector<double> const&) + 139
2 _ITKCommonPython.so 0x000000014ec0d18b vnl_vector<double>::operator=(vnl_vector<double>&&) + 65
3 _ITKCommonPython.so 0x000000014eadec9d 0x14de03000 + 13483165
4 _ITKCommonPython.so 0x000000014e869165 0x14de03000 + 10903909
5 _ITKCommonPython.so 0x000000014ec611a7 itk::ProcessObject::UpdateOutputInformation() + 339
6 _ITKCommonPython.so 0x000000014e47d8fe 0x14de03000 + 6793470
7 _ITKImageGridPython.so 0x00000001538b5619 itk::ProcessObject::UpdateOutputInformation() + 117
8 _ITKImageGridPython.so 0x00000001538b5ebc itk::ProcessObject::UpdateLargestPossibleRegion() + 18
9 _ITKCommonPython.so 0x000000014e10726b 0x14de03000 + 3162731
10 python 0x00000001044c8843 _PyMethodDef_RawFastCallKeywords + 131
11 python 0x00000001044c81d6 _PyObject_FastCallKeywords + 598
12 python 0x0000000104600bb7 call_function + 455
...
๊ทธ๋, ๋๋ ์ง๊ธ ๊ทธ๊ฒ์ ์คํํ๋ ค๊ณ ๋
ธ๋ ฅํ๊ณ ์๊ณ , ๋ฐ๋ก ์ฌ๊ธฐ์์ ๊ฐ์ ์ถฉ๋์ ์ณค๋ค.
```shapeSeg = shapeSegList [10]
itkw.view (์ด๋ฏธ์ง = sw2vtkImage (shapeSeg),
slicing_planes = True,
์ถ = True,
rotate = True,
๋ณด๊ฐ = True)
๋ฌธ์ ๋ฅผ ๋จ์ํํ์ผ๋ฉฐ Image :: resample์ด ์ฌ๊ธฐ์ ๋ฒ์ธ ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ฆฌ์ํ๋ง ํ ellipsoid_05๋ ๋ทฐ์ด๋ฅผ๋ก๋ํ๊ณ ellipsoid_00์ itk.view ()๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ์ปค๋์ด ์ถฉ๋ํ๋๋กํฉ๋๋ค.
์ด๊ฒ์ผ๋ก ํ
์คํธ ํ ํ Image :: resample wrt itkwidgets.view ์์ ๋ญ๊ฐ _may_ ์๋ชป ๋ ์ ์์ต๋๋ค.
์๋ํ ์ด๋ฏธ์ง : ellipsoid_1mode / segmentations / ellipsoid_00.nrrd ๋ฐ ellipsoid_1mode / segmentations / ellipsoid_05.nrrd
-> ๋ฆฌ์ํ๋ง ํ vtk ์ด๋ฏธ์ง์์ pyvista๋ก ๋ํ ํ ๋ 00์ด ํ๋กฏ๋์ง ์์ต๋๋ค.
-> 05๋ ์ ์๋ํฉ๋๋ค.
=> _both_ pyvista๊ฐ ํ๋กํ
ํ ๋ ์ ์๋ํฉ๋๋ค.
๋๋ Image :: resample์ ์ฝ๊ฐ์ ๋๋ฒ๊ทธ๋ฅผ ๋์ก๊ณ ์ง๊ธ๊น์ง ํ๋ฒํ ๊ฒ์ ๋ณด์ง ๋ชปํ์ต๋๋ค).
์คํํ๊ณ ์ถ๋ค๋ฉด ๊ฐ๋จํ ๋
ธํธ๋ถ์ด ์์ต๋๋ค.
wishy_washy_resample.ipynb.zip
... ๊ทธ๋ฆฌ๊ณ ๋ก๋ ํ ๋ ๋น์ด์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ :
... ๊ทธ๋ฆฌ๊ณ ์คํํ์ ๋์ ๋ชจ์ต. 05๋ฅผ 00์ผ๋ก ๋ณ๊ฒฝํ๊ณ itkw๊ฐ ๋ ๋๋ง์ ์๋ ํ ๋ ์ถฉ๋ํ๋๋ก ๋ค์ ์คํํ์ญ์์ค.
์ ์น ๋๋ ... ๋ ๋๋ง ๋ ์์๋ ๋ฐฐ์ด
๊ธฐ์ตํ๋ค๋ฉด itkwidgets๋ numpy ๋ฐฐ์ด์ ์ง์ ๋ ๋๋ง ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๊ทธ ๋ฐฐ์ด์ ์ ๋ฌ ๋ ๊ฒ์ ์ ์น๋ก ํด์ํฉ๋๋ค. vtk ๋ฐฐ์ด์ด ์ฌ์ฉ๋ ๋ _not_ํ๋ ์ผ์
๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฏธ์ง์์ ์ป์ ๊ฒ์ vtk ๋ฐฐ์ด๋ก ๋ํํ๊ธฐ ์ ์ ์ ์นํ๊ณ ๊ฐ๋จํ๊ฒ ์ ์งํ๊ธฐ ์ํด itkwidget๊ณผ ํจ๊ป vtk ๋ฐฐ์ด์ ์ฌ์ฉํฉ๋๋ค.
๋๋ ์ค๋ ์์นจ์ ์๋ํ์ง๋ง ์ํ๊น๊ฒ๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ ์น ์ฌ๋ถ, numpy ๋๋ vtk ๋ฐฐ์ด, Image.resample ํ itkwidget์ ์ฌ์ฉํ์ฌ ๋ ๋๋งํ๋ ค๊ณ ํ ๋ ๋ชจ๋ ์ถฉ๋ํฉ๋๋ค.
๋ณต์ฌ ๋๋ ... ๋ด๊ฐ ๋ฐ๋ณตํ๊ณ ์์ต๋๊น?
์ด๋ฏธ์ง์์ ์ค๋ ๋ฐฐ์ด์ด ๋ฌธ์ ์ผ ์ ์์ต๋๋ค. ์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ผ ์ ์์ต๋๋ค. ๊ทธ๋ผ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด ๋ด
์๋ค!
๋ฐฐ์ด์ ๋ณต์ฌ ํ ํ- order='C'
๋ฐ order='F'
, ์ ์น, ์์ , ํจ์๋ฅผ ๊ตฌ์ฑํ๋ ๋์ ๋ด ๋จธ๋ฆฟ์์ ์์ ์ํ๋๋๋ก ๋ชจ๋ ๊ฒ์ ์๊ฐํ๋ฉด _ ๋งค๋ฒ ์ถฉ๋ํฉ๋๋ค _.
์ด๊ฒ์ ์ด๋ ์ด ์์ฒด์ ํฌ๊ธฐ๊ฐ ๋ฌธ์ ๊ฐ ๋ ์ ์์์ ์์ฌํ์ต๋๋ค. ์ด๋ฅผ ํ์ธํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋์ผํ ๊ฐ๊ฒฉ ( [1,1,2]
)์ผ๋ก resample์ ํธ์ถํ๋ ๊ฒ์ด ์์ต๋๋ค. ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์์ฌ์ค๋ฌ์ด ํฌ๊ธฐ์ ๊ฐ์ง numpy ๋ฐฐ์ด์ ๋ง๋๋ ๊ฒ์
๋๋ค. ๊ณผ...
๋๋ผ ๋กค์ฃผ์ธ์ ...
๋ฐํ ์ค ...
์ฒ์์ผ๋ก ... (GitHub์์)
_shapeworks-free_ ์ฌํ!
array = np.ndarray([109, 77, 204])
itkw.view(image = array)
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ ธํธ๋ถ์ ๋ฃ๊ณ ์ฐ๊ธฐ *ํ์ญ์์ค.
* ์ถฉ๋์ ์์ํ๋ ์ฐ๊ธฐ, ์ค์ ํก์ ์ ์นํธํ๋ ๊ฒ์ ์๋๋๋ค.์ด ์์ค์ ๊ธ์ฐ ์์ค์ด๋ฉฐ ๋ค๋ฅธ ์ ์๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. ... ์ด์จ๋ ๋๊ตฐ๊ฐ ์๊ณ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. '์ด๊ฑด ์ฐ๋ฆฌ ๋ฌธ์ ๊ฐ ์๋์์! ๊ทธ๊ฒ ์๋๋ผ๋ฉด. ๐
array = np.ndarray([109, 77, 204])
itkw.view(image = array)
array = np.ndarray([109, 109, 204])
itkw.view(image = array)
md5-4cc2d721c025590189ee5dc5f8b003ee
array = np.ndarray([109, 109, 109])
itkw.view(image = array)
์ด ๋ชจ๋ ์์ ๋ shapeworks๋ฅผ ๊ฐ์ ธ ์ค์ง ์์ ๋ itk ๋ทฐ์ด๋ฅผ ๋ ๋๋งํฉ๋๋ค.
shapeworks๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์ถฉ๋ํฉ๋๋ค.
ํ , conda itk / vtk ๋ shapeworks itk / vtk ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํธ ์์ฉ์ด ์งํ๋๊ณ ์์ต๋๊น?
itkwidgets๊ฐ ๋ค๋ฅธ ๋ฒ์ ์ itk๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์์ ์์๋ ์ค์ํ์ง ์์ง๋ง ์ฌ์ฉ ์์๋ ์ค์ํฉ๋๋ค. ์ฆ, ๋ชจ๋ ๊ฒ์ ๊ฐ์ ธ ์ค์ง๋ง shapeworks ์ ์ itkwidget์ ์ฌ์ฉํ๋ฉด shapeworks๋ฅผ ์ฌ์ฉํ ๋ ์ถฉ๋์ด ๋ฐ์ํ๊ณ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
# 1179์ ๋ํ ํด๊ฒฐ์ฑ ์ ๋จ์ํ "itk๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค"์์ผ๋ฏ๋ก์ด ๋ฌธ์ ๋ฅผ ๋์ผํ๊ฒ ํด๊ฒฐํ ๊ฒ์ ์ ์ํฉ๋๋ค. ํ์ฌ ๋ ๋์ ์ต์ ์ด์๋ ํ ๋ ธํธ๋ถ์์ itkwidget์ ์ ๊ฑฐํ๊ฒ ์ต๋๋ค.
ํ์ฌ๋ก์๋ ์ข์ ๊ณํ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋ ธํธ๋ถ์์ itkwidget์ ์ ๊ฑฐํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๊น? ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ฌด์์ ์ํด ์ฌ์ฉํ๊ณ ์์ต๋๊น?
์ฐ๋ฆฌ๋ ์ธ๋ถํ๋ฅผ๋ณด๊ธฐ ์ํด ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋์ pyvista๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค
pyvista (๋ด๊ฐ ์๋ ํ)๋ ์ด๋ฏธ์ง ๋ฉํ ์ ๋ณด (์์ , ๋ณต์ ๊ฐ๊ฒฉ, ์ถ ๋ฐฉํฅ)๋ฅผ ์กด์คํ์ง ์์ง๋ง itkwidget์ ๊ทธ๋ ์ต๋๋ค.
pyvista (๋ด๊ฐ ์๋ ํ)๋ ์ด๋ฏธ์ง ๋ฉํ ์ ๋ณด (์์ , ๋ณต์ ๊ฐ๊ฒฉ, ์ถ ๋ฐฉํฅ)๋ฅผ ์กด์คํ์ง ์์ง๋ง itkwidget์ ๊ทธ๋ ์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด๊ฒ์ ํํค์น ๊ฒ์ด์ง๋ง, ์ฌ๋ฌ ๋ณผ๋ฅจ์ด ๋ค๋ฅธ ์์น์ ๋์์ ํ๋กํ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์์ฐ์ง์ ๋ํ ์ด๋ ์ ๋์ ์กด์ค์ด ์์ด์ผํ๋ฉฐ,์ด ์ด๋ฏธ์ง๋ ํ๋กํ ์ ๊ฐ๊ฒฉ์ด ์ฌ์ฉ๋จ์ ๋ณด์ฌ์ค๋๋ค. ์ฐ๋ฆฌ์ sw2vtkImage ํจ์๋ ๋จ์ํ ๊ทธ๊ฒ์ ์ ์งํ์ง ์์์ต๋๋ค (์ผ๋ถ์์๋ ์ด๊ฒ์ ๋ณ๊ฒฝํ์ง๋ง ์๋ง๋ ์๋ก์ด pybind ๋ธ๋์น์์์ ๊ฒ์ ๋๋ค).
๋๋ ๋ค๋ฅธ ๋ง์ ํ์ด์ฌ ๋ฐ ๋ ธํธ๋ถ ๊ฐ์ ์ฌํญ์ด ์์ผ๋ฉฐ ๋ณธ์ง์ ์ผ๋ก ๋ค์ ์์ฑํด์ผ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฆด๋ฆฌ์คํ๊ณ ๋ค์ ๋ฆด๋ฆฌ์ค๋ก ํธ์ํ๋๋ก ์ ์ํ๊ณ ์ถ์ต๋๋ค. ์ด์ฉ๋ฉด ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ ๊นจ๋จ๋ฆด ์ ์์ต๋๋ค. ๊ณต๊ฐ ์ ์ฅ์์ ์๋ ค์ง ๋ฌธ์ ์ด๋ฉฐ ์ฌ์ฉ์๊ฐ์ด ๋ฌธ์ ์ ๋ถ๋ช ํ ๊ฒฝ์ฐ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
(์ฐ๋ฆฌ๋ ์ฌ์ ํ ์ถฉ๋์์ด ์๋ฃ๋๋๋ก ์ธ๊ทธ๋จผํธ๋ก ์์ํ๊ธฐ ๋ ธํธ๋ถ์ ์์ ํด์ผํฉ๋๋ค. ์ฆ, ๋ ๋๋ง์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ค๋ฅธ ์์์ ์ด๋ฏธ์ง๋ฅผ ์ ํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.)
๋๋ ๋์ํ๋ค. ์ด๊ฒ์ 6.1 ๋ฆด๋ฆฌ์ค๋ก ํธ์ํ๊ณ ๋ฆด๋ฆฌ์ค ๋ ธํธ์ ๊ทธ๋ํฝ ์์ฝ์ ์ ๋ฐ์ดํธํ์ฌ ํ์ด์ฌ ๊ด๋ จ ๋ด์ฉ์ ๋ ๊ฐ์กฐํ๊ฒ ์ต๋๋ค.
๋ทฐ์ด๋ฅผ ์ถฉ๋์ํค์ง ์๋ ์์์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ํ์๋ ํ๊ท ๋ชจ์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ 3 ๊ฐ ์์น์์ ์ฌ์ ํ ์ถฉ๋ํฉ๋๋ค.
๋ฟก๋ฟก
๋ฌธ์๋ฅผ ์ ์ธํ๊ณ ๋ฆด๋ฆฌ์ค์์์ด ๋ ธํธ๋ถ์ ์ ์ธ ํ ๊ฒ์ ์ ์ํฉ๋๋ค.
๋๋ฅผ ์ํด ์๋ํฉ๋๋ค. ํธ์ ๋ด์ ๊ฐ๊ธฐ
๋
ผ๋ฆฌ ์ขํ๋ฅผ ๋ณด์ฌ์ฃผ๋ pyvista
https://sci.utah.edu/~shapeworks/doc-resources/mp4s/nb-groom-resample.mp4
๋ฌผ๋ฆฌ์ ์ขํ๋ฅผ ๋ณด์ฌ์ฃผ๋ itkwidget๊ณผ ๋น๊ต
https://sci.utah.edu/~shapeworks/doc-resources/mp4s/nb-groom-resample-iso.mp4
๋ ผ๋ฆฌ ์ขํ๋ฅผ ๋ณด์ฌ์ฃผ๋ pyvista
๋ฌผ๋ฆฌ์ ์ขํ๋ฅผ ๋ณด์ฌ์ฃผ๋ itkwidget๊ณผ ๋น๊ต
๋ฌธ์ # 900์ด ์ฃผ์ด์ง๋ฉด itk๊ฐ ๋ฌผ๋ฆฌ์ ์ขํ๋ฅผ ๋ณด์ฌ์ค ์ ์ด ์๋ค๊ณ ์์ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
์ด ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ (z-spacing = 2) :
{
dims: [93, 87, 94],
origin: [-24, -19, -21],
size: [93, 87, 188],
spacing: [1, 1, 2]
}
itk ๋ทฐ์ด๋ ํ์ฅ๋์ง ์์ ๋ฒ์ ๋ง ํ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค.
๋ค์์ ์ค์ผ์ผ๋์ง ์์ ํ์์ฒด์ ์ค์ผ์ผ๋ง ๋ ๋ฒ์ ์ ๋ชจ๋ ๋ณด์ฌ์ฃผ๋ ๋จ์ผ pyvista ๋ณผ๋ฅจ์
๋๋ค.
๋๋ pyvista ๋ทฐ์ด๊ฐ itk ๋ทฐ์ด์ ๋นํด ๊ฒฝ๊ณ๋ฅผ ํ์ํ๋ ๋ฐฉ์์ด ์ ๋ง ๋ง์์ ๋ค์ง ์์ต๋๋ค.
ํ์ง๋ง ์ ํํ๊ณ ๋ฌผ๋ฆฌ์ ์ธ ์ขํ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค.