回答編集履歴

3

修正

2020/04/05 12:58

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -81,3 +81,33 @@
81
81
  print(b) # [500 0 0 0]
82
82
 
83
83
  ```
84
+
85
+
86
+
87
+ ビット幅の確認方法
88
+
89
+
90
+
91
+ ```python
92
+
93
+ import numpy as np
94
+
95
+ import pydicom
96
+
97
+
98
+
99
+ # 適当な dicom データを読み込み
100
+
101
+ (filename,) = pydicom.data.get_testdata_files("CT_small.dcm")
102
+
103
+ dcm = pydicom.dcmread(filename)
104
+
105
+
106
+
107
+ # ビット幅の確認方法
108
+
109
+ print(dcm.pixel_array.dtype) # int16
110
+
111
+ print(dcm.BitsAllocated) # 16
112
+
113
+ ```

2

修正

2020/04/05 12:58

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -56,7 +56,7 @@
56
56
 
57
57
 
58
58
 
59
- dicom のヘッダーに画像データを何ビットで表すかの情報 `Bits Allocated` が16のままなのに、配列を作成したときにそれとは異なるビット幅で作成し、それをビューアーで読み込むときに16bit幅として読み込まれたので (質問画像のウィンドウのタイトルバーを見ると16-bitとなっていることからもわかる)、縞々になってしまったのだと思います。
59
+ dicom のヘッダーに画像データを何ビットで表すかの情報 `Bits Allocated` があり、それが16のままなのに、配列を作成したときにそれとは異なるビット幅で作成し、それをビューアーで読み込むときに16bit幅として解釈したので (質問画像のウィンドウのタイトルバーを見ると16-bitとなっていることからもわかる)、縞々になってしまったのだと思います。
60
60
 
61
61
 
62
62
 

1

修正

2020/04/05 12:54

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -45,3 +45,39 @@
45
45
  dcm.save_as("output.dcm")
46
46
 
47
47
  ```
48
+
49
+
50
+
51
+ ## 追記
52
+
53
+
54
+
55
+ > ビット幅の指定に関しまして、正直なところ最大信号値がどのくらいになるか分からない為特に指定はせずにいました。
56
+
57
+
58
+
59
+ dicom のヘッダーに画像データを何ビットで表すかの情報 `Bits Allocated` が16のままなのに、配列を作成したときにそれとは異なるビット幅で作成し、それをビューアーで読み込むときに16bit幅として読み込まれたので (質問画像のウィンドウのタイトルバーを見ると16-bitとなっていることからもわかる)、縞々になってしまったのだと思います。
60
+
61
+
62
+
63
+ [DICOMタグ/0028 - メディカルウェア](https://medicalware.org/wiki/DICOM%E3%82%BF%E3%82%B0/0028)
64
+
65
+
66
+
67
+ 例えば、np.int64 で500という値をnp.int16で解釈すると、[500 0 0 0] となり、結果として、白の500と黒の0が交互に現れるようになります。
68
+
69
+
70
+
71
+ ```python
72
+
73
+ a = np.array(500, np.int64)
74
+
75
+ print(a)
76
+
77
+
78
+
79
+ b = np.frombuffer(a.tobytes(), np.int16)
80
+
81
+ print(b) # [500 0 0 0]
82
+
83
+ ```