前提・実現したいこと
プログラミング初心者です。
現在、spyderでコードを組んでおり、学習の入力画像はmhd形式、出力画像がnpy形式となっています。
出力画像をmhd形式に指定して保存するにはどのようにコードを書けばよいでしょうか。
発生している問題・エラーメッセージ
TypeError: Wrong number or type of arguments for overloaded function 'new_Image'. Possible C/C++ prototypes are: itk::simple::Image::Image() itk::simple::Image::Image(itk::simple::Image const &) itk::simple::Image::Image(unsigned int,unsigned int,itk::simple::PixelIDValueEnum) itk::simple::Image::Image(unsigned int,unsigned int,unsigned int,itk::simple::PixelIDValueEnum) itk::simple::Image::Image(std::vector< unsigned int,std::allocator< unsigned int > > const &,itk::simple::PixelIDValueEnum,unsigned int)
###使用言語
python
該当のソースコード
import os import glob import numpy as np import pandas as pd import SimpleITK as sitk import matplotlib.pyplot as plt from keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, BatchNormalization from keras.layers.merge import concatenate from keras.models import Model from keras.callbacks import EarlyStopping #%% # パラメータ設定 EPOCHS = 10 BATCH_SIZE = 40 IMAGE_SIZE = 208 #%% # .mhd読み込み def load_itk(filename): itkimage = sitk.ReadImage(filename) raw_image = sitk.GetArrayFromImage(itkimage) return raw_image def load_images(inputpath, type_hospital,type_image): imglist = [] filenamelist = [] spacinglist = [] df_PETCT = pd.read_csv('dataset/PETCT_slice/df_top_z_point.csv') for path in glob.glob("{}\{}*\{}".format(inputpath, type_hospital,type_image)): for root, dirs, files in os.walk(path): name = os.path.split(os.path.split(root)[0])[1] top_lung = int(df_PETCT[(df_PETCT['name']==name)]['lung']) top_diap = int(df_PETCT[(df_PETCT['name']==name)]['diap']) for i in range(top_lung, top_diap): for filepath in glob.glob("{}*k={}.mhd".format(root, i)): filenamelist.append(os.path.splitext(os.path.split(filepath)[1])[0]) itkimage = sitk.ReadImage(filepath) raw_image = sitk.GetArrayFromImage(itkimage) raw_array = np.asarray(raw_image, dtype=np.float64) raw_array = raw_array.transpose(1, 2, 0) imglist.append(raw_array) raw_spacing = itkimage.GetSpacing() spacinglist.append(raw_spacing) imgdatas = np.asarray(imglist) return imgdatas, filenamelist, spacinglist def save_data(savepath, filenamelist, datalist): for i, fn in enumerate(filenamelist): filename = os.path.join(savepath, fn) testdata = np.asarray(datalist[i]) np.save(filename, testdata) def save_mhd_data(savepath, filenamelist, datalist, spacinglist): for i, fn in enumerate(filenamelist): filename = os.path.join(savepath, fn)+'.mhd' raw_array = datalist[i].transpose(2, 0, 1) tmp_itkimg = sitk.Image(raw_array) tmp_itkimg.SetSpacing(spacinglist[i]) sitk.WriteImage(tmp_itkimg, filename) save_data("dataset\result\", test_label_filenames, results) save_mhd_data("dataset\result\", test_label_filenames, results,spacinglist)
試したこと
def save_mhd_data(savepath, filenamelist, datalist, spacinglist):とコードを作成してみたのですが、mhdで保存されていませんでした。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
こちらにDICOM画像をmhdに変換するコードがありますが、
https://github.com/hfarhidzadeh/DicomToMhd/blob/master/convert.py
このコードではファイルに書き出す直前に置かれている
sitk_img.SetOrigin(Origin)
というコードが、質問者さんのコードにはありません。これが原因ということはあるでしょうか。
ところで質問文を読んでいくつか疑問があるのですが、
「発生している問題・エラーメッセージ」の箇所に記載されているエラーメッセージは、「出力画像をmhd形式で保存したい」という質問とどういう関係にあるのでしょうか。「試したこと」に記載されている「コードを作成してみたのですが、mhdで保存されていませんでした」という文章からは、保存はされていたけれどmhdファイルとしては不完全なファイルでmhdファイルとしては認識されなかった、といったようなニュアンスに感じられます(エラーが出て保存自体に失敗した、とは読めない。それともエラーは出たけどファイルは保存されていたということでしょうか)。
「mhdで保存されていなかった」とのことですが、そのことはどのように確認されたのでしょうか(言い換えると、何をもってmhdではないと判断したのか、もし保存されたファイルの状態を調べてそう判断したのなら、その内容を知りたい)。
「学習の入力画像はmhd形式、出力画像がnpy形式」とのことですが、入力画像と出力画像にはどのような違いがあるのでしょうか。「学習」という言葉とkerasをインポートしていることから、入力と出力の間で何か機械学習をしているのだろうと想像するのですが、画像データ自体にどういう変更や加工が施されているのかは質問文からは分かりません(つまり保存前の画像データの状態を知りたい)。
(上と関連する疑問ですが)save_data() もしくは save_mhd_data() に渡される直前の画像データはどのような状態になっているのでしょうか(データ型など)。load_images() 関数の結果が save_mhd_data() に渡されるデータかとも思ったのですが、それだと画像をload_images() 関数の中でmhdファイルから読み込んでいるように読めます。入力画像をmhdファイルから読み込んだらあとは機械学習を経て何らかの加工をしてmhdファイルとして保存、という流れかと思っていたので、途中でまたmhdファイルから読み込んでいるのは不可解に感じられます。
①「sitk_img.SetOrigin(Origin)
というコードが、質問者さんのコードにはありません。これが原因ということはあるでしょうか。」
→試してみたのですが、以下のようなエラーが出ました。
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
②「「発生している問題・エラーメッセージ」の箇所に記載されているエラーメッセージは~」
→申し訳ございません、このエラーが直接関係しているのか定かではありません。とりあえず、実行したらこのエラーが出たといった感じです。
③「mhdで保存されていなかった」とのことですが、そのことはどのように確認されたのでしょうか(言い換えると、何をもってmhdではないと判断したのか、もし保存されたファイルの状態を調べてそう判断したのなら、その内容を知りたい)。
→save_mhd_dataの最初の引数にセーブしたファイルのパスを入れているので、そのファイルの中身を確認し、.mhdのファイルが一つもなかったため、そう判断させて頂きました。
④「学習の入力画像はmhd形式、出力画像がnpy形式」とのことですが、入力画像と出力画像にはどのような違いがあるのでしょうか。「学習」という言葉とkerasをインポートしていることから、入力と出力の間で何か機械学習をしているのだろうと想像するのですが、画像データ自体にどういう変更や加工が施されているのかは質問文からは分かりません(つまり保存前の画像データの状態を知りたい)。
→大変申し訳ございません。入力したmhdをnpy形式で出力し、保存しています。保存前の画像データは0-1の正規化処理を行ったものでfloat型となります。
⑤(上と関連する疑問ですが)save_data() もしくは save_mhd_data() に渡される直前の画像データはどのような状態になっているのでしょうか(データ型など)。load_images() 関数の結果が save_mhd_data() に渡されるデータかとも思ったのですが、それだと画像をload_images() 関数の中でmhdファイルから読み込んでいるように読めます。入力画像をmhdファイルから読み込んだらあとは機械学習を経て何らかの加工をしてmhdファイルとして保存、という流れかと思っていたので、途中でまたmhdファイルから読み込んでいるのは不可解に感じられます。
→「入力画像をmhdファイルから読み込んだらあとは機械学習を経て何らかの加工をしてmhdファイルとして保存、という流れ」であっております。そもそも自分が作成したコードが間違えている可能性があります。申し訳ございません。
詳しくお返事ありがとうございます。
申し訳ありませんが急遽、パソコンの前にゆっくり座っている時間がしばらくの間取れなくなってしまいました。
落ち着いたらまたゆっくり拝見させていただきます。
回答1件
あなたの回答
tips
プレビュー