gpt4 book ai didi

c# - 如何使用 fo-DICOM 删除或更新私有(private)标签?

转载 作者:行者123 更新时间:2023-12-05 02:47:14 25 4
gpt4 key购买 nike

我有很多 DICOM 数据集,其中有一个私有(private)标签,其中包含我不想保留在标题中的信息。每个数据集的此标记值都会发生变化,因此我不知道该值。以下是我要更新或删除的 PRIVATE CREATOR 和私有(private)标签的示例。

0033,0010  ---: MITRA OBJECT UTF8 ATTRIBUTES 1.0
0033,1016 ---: Dummy^Data^G^

我希望能够完全删除 0033,1016 或使用新值更新它。我尝试过的一切要么什么都不做,要么会添加另一个 0033,1016 标签,从而创建两个 0033,1016 标签。一个是原始的,一个是我尝试更新原始时添加的。

0033,0010  ---: MITRA OBJECT UTF8 ATTRIBUTES 1.0
0033,1016 ---: Dummy^Data^G^
0033,1016 ---: FOO

如果我再次运行代码,我可以更新值为 FOO0033,1016,但我永远无法更改 0033,1016 标签的值为 Dummy^Data^G^

以下是我的代码:

string main_path = @"C:\Users\pthalken\Desktop\foo";

DirectoryInfo foo = new DirectoryInfo(main_path);
FileInfo[] dicomFiles = foo.GetFiles();

foreach(FileInfo files in dicomFiles)
{
DicomFile openedDicom = DicomFile.Open(files.FullName, FileReadOption.ReadAll);

//getting the private tag that I want to change or remove
var remove = DicomTag.Parse("0033,1016");
var test = DicomTag.Parse("0010,0010");

//this method will work for public tags as expected, but with private tags it will juist add another tag
//it will not update the orignial tag. If ran again it will change the recently inputted tag but still not touch the original
openedDicom.Dataset.AddOrUpdate(remove, "FOO");

//Does not update original tag, will add another 0033,1016 tag with value HOT
openedDicom.Dataset.AddOrUpdate(new DicomCodeString(openedDicom.Dataset.GetPrivateTag(new DicomTag(0x0033, 0x1016)), "HOT"));

//Does not update original tag, will add another 0033,1016 tag with value HOT CHEETO
openedDicom.Dataset.AddOrUpdate(new DicomCodeString(openedDicom.Dataset.GetPrivateTag(remove), "HOT CHEETO"));

//does not remove the orignial tag
openedDicom.Dataset.Remove(remove);
openedDicom.Save(files.FullName);
}

最佳答案

对于 fo-DICOM 的 4.0.7 版,以下代码可以正确地从数据集中删除和更新私有(private)标签:

string dirPath = @"C:\.....";
string filePath = Path.Combine(dirPath, "Test.dcm");
DicomFile openedDicom = DicomFile.Open(filePath, FileReadOption.ReadAll);

var remove = DicomTag.Parse("0019,0010");
openedDicom.Dataset.Remove(remove);
openedDicom.Save(Path.Combine(dirPath, "Removed.dcm"));

var edit = DicomTag.Parse("0043,0010");
openedDicom.Dataset.AddOrUpdate(edit, "EDITED");
openedDicom.Save(Path.Combine(dirPath, "Edited.dcm"));

我没有包含您提到的私有(private)标签的数据集;我使用的标签不同,但这无关紧要。

但是,有一个陷阱。如果私有(private)标签的 VR[UN - Unknown],则 RemoveAddOrUpdate 都不起作用。这似乎与未知值表示有关。

我尝试读取 VRUN 的元素的值,如下所示:

var read = DicomTag.Parse("0019,1002");
string value = openedDicom.Dataset.GetString(read);

GetString 失败,出现以下异常:

Tag: (0019,1002) not found in dataset

在 Visual Studio 中,如果您快速查看 openedDicom.Dataset 以查找带有 UN VR 的元素,您将观察到奇怪的结果。

似乎 fo-DICOM 在使用 UN VR 读取元素时出现问题。


你在问题​​中说:

Everything I have tried either does nothing or will add another 0033,1016 tag, creating two 0033,1016 tag.

它会创建新标签,因为它无法找到现有标签。查看新建标签的VR;我猜它会是 UN 以外的东西。这就是为什么您可以编辑新创建的标签但不能编辑原始标签的原因。

关于c# - 如何使用 fo-DICOM 删除或更新私有(private)标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65116887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com