계속되는 시도와 오류 디버깅을 통해 알아냈는데 분명 발표 하실때 uint16으로 모두 통일 되어있다고 하셨는데요.
모든 dcm 파일을 불러올때 , 중간중간에 uint16이 아니라 float64로 된 파일이 존재하는거 같습니다.
혹시 확인 가능한가요 이거 때문에 돌아가질 않아서요 빠른 답변 부탁드립니다.
sitk 써서 read 함수하고 fromarray 한거 말고는 건드린거 없었습니다.
Created by sniperlkh1234 다이콤 영상은 많아봤자 실제 저장되는 공간 (Bits Stored)은 14bit인데요,
이는 음수가 존재한다하더라도 int16 range로 얼마든지 커버가 가능합니다.
그래도 혹시나 우려스러우시다면 float64로 하셔도 좋고,
64bit를 쓰시는 것이 효율적이지 않다고 생각하시다면 int16으로 부르시면 될 것 같습니다.
결론은 dicom의 image data는 int16을 넘지 않습니다.
아뇨
보내주신 이메일 코드에는
>>>import SimpleITK as sitk
>>>image = sitk.ReadImage(filePath)
>>>image = sitk.GetArrayFromImage(image).astype("int16")
이렇게 되어있는데 이렇게 이미지에 astype을 쓰는경우 매우 조심해야 합니다.
운좋게 int16안에 범위의 uint16의 경우 int16으로 변환되지만 여전히 uint16의 양수값을 같습니다. 따라서 min이 0 max가 30000이 됩니다.
그러나 기존의 float64의 경우 int16의 범위안에 없는값이면 이미지가 찌그러집니다.
따라서 제말은, 어떤 파일은 양수값만 갖고 있고, 어떤 파일은 음수와 양수 다 갖는 파일이 존재해서 훈련할때 에러가 발생하는것 같습니다.
float64에 해당하는 음수값이 있는건데 데이터 분포가 다릅니다. 어떤건 양수에서 놀고 어떤건 음수 양수 둘다 놉니다. 때문에 음수 양수 둘다 노는 파일의 min값 max값을 알고 싶은겁니다.
추가로,
코드예시는 저번에 구글드라이브 공유할때
보내드렸던 메일 참고하시면 됩니다. array로 변환하실때 dtype을 정해주지 않으면
어떤것은 uint16이 되거나 어떤것은 float64가 됩니다.
array를 만들때 dtype을 지정해서 선언을 해주시면 되겠습니다.
이때, dtype은 int16으로 해주시면 됩니다.
(참고로 mask는 uint8입니다.) dtype 찍어보면 float64 라고 나오던데 int16인가요???
그리고 대부분이 uint16이라고 나옵니다. int16이 아니구요 확인 가능한가요 안녕하세요,
질문이 혹시 cardiovascular borderline 주제시라면 제가 답변 드리겠습니다.
제가 발표때 dcm은 가공되지않은 16bit의 데이터라고 언급한바 있는데요,
dtype을 int16으로 해주시면 괜찮을듯합니다.
음수있습니다.
이가은 드림 dtype 으로 된거 샘플이 필요합니다.
dtype의 max, min 값도 알려주세요 (양수만 있는지, 음수,양수 다있는지 알아야합니다.)