質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
STL

STL(Standard Template Library)は、ジェネティックコンテイナー、イテレーター、アルゴリズム、そして関数オブジェクトのC++ライブラリーです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1690閲覧

手持ちのSTLファイルを用いて、radiomicsの特徴量を解析するコードを完遂したいです

S_Suzuki2021

総合スコア0

STL

STL(Standard Template Library)は、ジェネティックコンテイナー、イテレーター、アルゴリズム、そして関数オブジェクトのC++ライブラリーです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/08/11 09:51

前提・実現したいこと

宜しくお願い致します。
私のPCはWindows10
Google Colaboratoryを使用中です。
私自身は、Pythonのかなりの初心者です。
(初心者ではありますが、以前にRandom Forestによるデータ解析を見よう見まねで行い、論文を書いた経験はあります)
(その次が、いきなりこんな課題に取り組んでいて自分ながらに愚かだとは思っております)

医療関係の研究を行っております。
CTで撮影した構造物に対して、radiomicsの特徴数値を、
https://en.wikipedia.org/wiki/Radiomics)
pythonで解析したいと思っています。
https://www.radiomics.io/)
https://www.radiomics.io/pyradiomics.html)

基本的にはDICOMファイルにラベルをつけた状態のファイルを準備する必要があります。
サンプルコードは下記に紹介されています。
https://qiita.com/tatsunidas/items/7e0bee8c63c2bf2f2428

しかし、私の手元にはすでにSTLファイルとして出力されたデータが500個あり、
できればこれを活用したいのです。
このファイルは、ラベルの対象となる構造物を、DICOMファイルを扱うアプリケーションの中で
半自動的にラベリングできるため、そのままボタンを押せばSTLファイルとして出力して
くれるという機能を利用したものになります。

下記のようなイメージです。
イメージ説明

参考までに。
上記のpngファイルは、Google Laboratoryの環境で、下記のコードで表示させました。
(radiomicsのコードも冒頭に中途半端に混ざっている状態で失礼します)。

========================================

!pip install pyradiomics
import os
from radiomics import featureextractor
import radiomics
from radiomics import firstorder, getTestCase, glcm, glrlm, glszm, imageoperations, shape, shape2D

import numpy as np
import six
import SimpleITK as sitk
import matplotlib.pyplot as plt
!pip install numpy-stl
from stl import mesh
from mpl_toolkits import mplot3d

figure = pyplot.figure()
axes = mplot3d.Axes3D(figure)
your_mesh = mesh.Mesh.from_file('/content/drive/MyDrive/Colab Notebooks/20210811PVICT_STL/20191002-66694.stl')

def mesh_location_zero(your_mesh):
midPosRel = (your_mesh.max_ - your_mesh.min_)/2
your_mesh.x = your_mesh.x - (midPosRel[0] + your_mesh.min_[0])
your_mesh.y = your_mesh.y - (midPosRel[1] + your_mesh.min_[1])
your_mesh.z = your_mesh.z - (midPosRel[2] + your_mesh.min_[2])
return your_mesh

mesh_location_zero(your_mesh)
axes.add_collection3d(mplot3d.art3d.Poly3DCollection(your_mesh.vectors))

scale = your_mesh.points.flatten()
axes.auto_scale_xyz(scale, scale, scale)

pyplot.show()

========================================

発生している問題・エラーメッセージ

https://qiita.com/tatsunidas/items/7e0bee8c63c2bf2f2428
このページで紹介されているコードをなぞっていく中で、

上記のSTLファイルを使おうとすると、下記のメッセージが出ます。

RuntimeError: Exception thrown in SimpleITK ImageFileReader_Execute: /tmp/SimpleITK/Code/IO/src/sitkImageReaderBase.cxx:105:
sitk::ERROR: Unable to determine ImageIO reader for "/content/drive/MyDrive/Colab Notebooks/20210811PVICT_STL/20191002-66694.stl"

該当のソースコード

もともとは、

imageName, maskName = getTestCase('lung2')
image = sitk.ReadImage(imageName)
mask = sitk.ReadImage(maskName)

というコードが使用されている部分ですが、
ここに、

imagePath = "/content/drive/MyDrive/Colab Notebooks/20210811PVICT_STL/20191002-66694.stl"
maskPath = "/content/drive/MyDrive/Colab Notebooks/20210811PVICT_STL/20191002-66694copy.stl"
image = sitk.ReadImage(imagePath)
mask = sitk.ReadImage(maskPath)

というコードを代用して入れてみた結果です。

上記のエラーコードは、
image = sitk.ReadImage(imageName)
に対して出ているようです。

試したこと

試したことは上記になります。
現在の問題点は2つあると考えています。

1)image = sitk.ReadImage(imageName)というコマンドによって、
stlファイルを読み込むことができない。
つまり、
sitk.ReadImage(ファイル名)
というコマンドで取り扱えるファイル形式がわからない、という問題に直面していると
考えております。

2)上記の「代用コード」は、同じファイルをコピーして「image」と「label」の
両方に適用することで、該当する構造物が解析対象であることを認識させられないか、
と愚考した試みでした。
果たして、このまま前に進んで、radiomicsの解析が行えるのか、そこの勝算もない状況です。

補足情報(FW/ツールのバージョンなど)

Google Colaboratoryの環境で作業しております。
pyradiomics
numpy-stl
はとくにバージョンを指定せずにインストールしています。

https://qiita.com/tatsunidas/items/7e0bee8c63c2bf2f2428
このページで紹介されているコードを、一通り以下に転記致します。

========================================

!pip install pyradiomics==2.1.0

import os # needed navigate the system to get the input data
from radiomics import featureextractor # This module is used for interaction with pyradiomics
import radiomics
from radiomics import firstorder, getTestCase, glcm, glrlm, glszm, imageoperations, shape, shape2D
import numpy as np
import six

http://simpleitk.github.io/SimpleITK-Notebooks/01_Image_Basics.html

import SimpleITK as sitk
import matplotlib.pyplot as plt

brain1, brain2, breast1, lung1,lung2,(prostate_phantom)
imageName, maskName = getTestCase('lung2')
image = sitk.ReadImage(imageName)
mask = sitk.ReadImage(maskName)

ndImg = sitk.GetArrayFromImage(image)
ndLbl = sitk.GetArrayFromImage(mask)

plt.imshow(ndImg[24])
plt.show()
plt.imshow(ndLbl[24])
plt.show()

settings = {}
settings['binWidth'] = 25
If enabled, resample image (resampled image is automatically cropped.
settings['resampledPixelSpacing'] = None # [3,3,3] is an example for defining resampling (voxels with size 3x3x3mm)
settings['interpolator'] = sitk.sitkBSpline
settings['label'] = 1

bb, correctedMask = imageoperations.checkMask(image, mask)
if correctedMask is not None:
mask = correctedMask
image, mask = imageoperations.cropToTumorMask(image, mask, bb)

firstOrderFeatures = firstorder.RadiomicsFirstOrder(image, mask, **settings)
firstOrderFeatures.enableFeatureByName('Mean', True)
firstOrderFeatures.enableAllFeatures()
print('Will calculate the following first order features: ')
for f in firstOrderFeatures.enabledFeatures.keys():
print(' ', f)
print(getattr(firstOrderFeatures, 'get%sFeatureValue' % f).doc)
print('Calculating first order features...')
results = firstOrderFeatures.execute()
print('done')
print('Calculated first order features: ')
for (key, val) in six.iteritems(results):
print(' ', key, ':', val)

========================================

このコードの冒頭の
brain1, brain2, breast1, lung1,lung2,(prostate_phantom)
imageName, maskName = getTestCase('lung2')
image = sitk.ReadImage(imageName)
mask = sitk.ReadImage(maskName)
でつまづいている状況になります。

私の手持ちのデータファイル(STL形式)を用いて進めていけるかについて、
アドバイスをいただけましたら幸いです。
宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問