teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

修正

2020/04/05 12:58

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -39,4 +39,19 @@
39
39
 
40
40
  b = np.frombuffer(a.tobytes(), np.int16)
41
41
  print(b) # [500 0 0 0]
42
+ ```
43
+
44
+ ビット幅の確認方法
45
+
46
+ ```python
47
+ import numpy as np
48
+ import pydicom
49
+
50
+ # 適当な dicom データを読み込み
51
+ (filename,) = pydicom.data.get_testdata_files("CT_small.dcm")
52
+ dcm = pydicom.dcmread(filename)
53
+
54
+ # ビット幅の確認方法
55
+ print(dcm.pixel_array.dtype) # int16
56
+ print(dcm.BitsAllocated) # 16
42
57
  ```

2

修正

2020/04/05 12:58

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -27,7 +27,7 @@
27
27
 
28
28
  > ビット幅の指定に関しまして、正直なところ最大信号値がどのくらいになるか分からない為特に指定はせずにいました。
29
29
 
30
- dicom のヘッダーに画像データを何ビットで表すかの情報 `Bits Allocated` が16のままなのに、配列を作成したときにそれとは異なるビット幅で作成し、それをビューアーで読み込むときに16bit幅として読み込まれたので (質問画像のウィンドウのタイトルバーを見ると16-bitとなっていることからもわかる)、縞々になってしまったのだと思います。
30
+ dicom のヘッダーに画像データを何ビットで表すかの情報 `Bits Allocated` があり、それが16のままなのに、配列を作成したときにそれとは異なるビット幅で作成し、それをビューアーで読み込むときに16bit幅として解釈したので (質問画像のウィンドウのタイトルバーを見ると16-bitとなっていることからもわかる)、縞々になってしまったのだと思います。
31
31
 
32
32
  [DICOMタグ/0028 - メディカルウェア](https://medicalware.org/wiki/DICOM%E3%82%BF%E3%82%B0/0028)
33
33
 

1

修正

2020/04/05 12:54

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -21,4 +21,22 @@
21
21
  dcm.PixelData = img.tobytes()
22
22
 
23
23
  dcm.save_as("output.dcm")
24
+ ```
25
+
26
+ ## 追記
27
+
28
+ > ビット幅の指定に関しまして、正直なところ最大信号値がどのくらいになるか分からない為特に指定はせずにいました。
29
+
30
+ dicom のヘッダーに画像データを何ビットで表すかの情報 `Bits Allocated` が16のままなのに、配列を作成したときにそれとは異なるビット幅で作成し、それをビューアーで読み込むときに16bit幅として読み込まれたので (質問画像のウィンドウのタイトルバーを見ると16-bitとなっていることからもわかる)、縞々になってしまったのだと思います。
31
+
32
+ [DICOMタグ/0028 - メディカルウェア](https://medicalware.org/wiki/DICOM%E3%82%BF%E3%82%B0/0028)
33
+
34
+ 例えば、np.int64 で500という値をnp.int16で解釈すると、[500 0 0 0] となり、結果として、白の500と黒の0が交互に現れるようになります。
35
+
36
+ ```python
37
+ a = np.array(500, np.int64)
38
+ print(a)
39
+
40
+ b = np.frombuffer(a.tobytes(), np.int16)
41
+ print(b) # [500 0 0 0]
24
42
  ```