5

matlab で dicom ファイルを読み取り、そのデータを変更して別のファイルに保存しようとしていますが、その間にプライベート dicom データがまったく書き込まれない (「WritePrivate」が 0 に設定されている場合) または理解不能で役に立たなくなるUINT8配列として書かれています。元の dicom ファイルから取得したデータを新しい構造にコピーして、新しい dicom ファイルに書き込もうとしましたが、プライベート データは新しい構造で問題なく残っていても、新しい dicom ファイルには残りません。matlab dicom ディクショナリを変更せずに新しい dicom ファイルにコピーするときに、このプライベート データをそのまま保持する方法はありますか?

私がやろうとしていることを示すために、次のコードを提供しました。

X=dicomread('Bad011_4CH_01.dcm');
metadata = dicominfo('Bad011_4CH_01.dcm');
metadata.PatientName.FamilyName='LastName';
metadata.PatientName.GivenName='FirstName';
birthday=metadata.PatientBirthDate;
year=birthday(1,1:4);
newyear=strcat(year,'0101');
metadata.PatientBirthDate=newyear;
names=fieldnames(metadata);

h=metadata;

dicomwrite(X,'example.dcm',h,'CreateMode','copy');

newh=dicominfo('example.dcm');

ここで、newh のデータにはプライベート データは含まれていません。コードを次のように変更すると

dicomwrite(X,'example.dcm',h,'CreateMode','copy','WritePrivate',1);

この場合、プライベート データは UIN8 配列に完全に変更され、役に立たなくなります。私の仕事の理想的な解決策は、matlab dicom ディクショナリを変更せずに、新しく作成された dicom ファイルにプライベート データを保持できるようにすることです。

4

2 に答える 2

1

次のようなことを試しましたか:

dicomwrite(uint16(image), fileName, 'ObjectType', 'MR Image Storage', ...
    'WritePrivate', true, header);

ここで、「ヘッダー」は、MATLAB の dicominfo 関数から取得するヘッダー データと同じ形式を使用する、名前と値のペアで構成される構造体です。MATLAB でのイメージ作成に対する私の一般的なアプローチは、CreateMode 'copy' の使用を避け、代わりに、コピーすることが理にかなっている属性を明示的にコピーし、新しい値を持つべき属性に対して独自の値を生成することによって、独自の DICOM ヘッダーを構築することです。

プライベート タグを記述するには、次のようにします。

header.Private_0045_10xx_Creator = 'MY_PRIVATE_BLOCK';
header.Private_0045_1001 = int32(65535);

その後、 dicomwrite を使用してこれを書き出し、 を使用して読み戻すと、残念ながら、 が常にデータを uint8 のベクトルとして読み取るhdr = dicominfo('mynewimg');場合でも、値が実際に 32 ビット整数として書き込まれたことがわかります。値。

>> hdr.Private_0045_1001

ans =

  255
  255
    0
    0

どの型が期待されるかを知っている限り、ヘッダーを読み取った後、データを目的の型に型キャストできるはずです。例えば:

>> typecast(hdr.Private_0045_1001, 'int32')

ans =

   65535
于 2012-12-13T22:38:20.757 に答える