【问题标题】:How to save compressed pixels (compressed with my own encoder) back into DICOM image file using Imebra library?如何使用 Imebra 库将压缩像素(用我自己的编码器压缩)保存回 DICOM 图像文件?
【发布时间】:2017-09-22 15:16:30
【问题描述】:

我有自己的图像编码器和解码器。我想要的是读取 DICOM 图像,提取未压缩的图像像素,使用我的编码器对其进行压缩,然后将这些压缩的像素写回到 DICOM 文件中以代替未压缩的像素。解码器会做相反的事情。这可以在 Imebra 中进行吗?我可以读取标签和像素,但是在压缩它们之后,我不确定如何将它们放回去(它们当前位于 char* 缓冲区中),或者这是否可能。我在 C++ 中使用 Imebra。

或者,我可以创建全新的 DICOM 文件,但在这种情况下,我需要轻松地从旧文件中传输所有 DICOM 标签。

如果这在 Imebra 中是不可能的,是否有其他 C++ 库允许这样做?

编辑: 谢谢你的回答,保罗。但是,原始 DICOM 图像仍然保持不变(使用第二个选项)。你能说我在这里做错了什么吗?

std::unique_ptr<imebra::DataSet> loadedDataSet(imebra::CodecFactory::load(imgNameM));
imebra::WritingDataHandlerNumeric* dataHandler = loadedDataSet->getWritingDataHandlerRaw(imebra::TagId(imebra::tagId_t::PixelData_7FE0_0010), 0); 
dataHandler->assign(buffer, size); 
delete dataHandler;  

loadedDataSet 不为空,我用 bufferExists 检查过。

编辑 2: 是的,我没有保存。现在我添加了该行并设法修改解决了我原来的问题的 PixelData 元素。谢谢。但是,文件的其他一些部分现在也会自动更改。在文件的开头添加了 100 多个空字节,尽管这并没有给我带来太多困扰。困扰我的是,现在添加了 (0008,0005) 特定字符集标记,并且未设置其值(它为空),然后在尝试读取该修改文件的标记时导致 CharsetConversionNoTableError 。如果我手动删除该标签并修复组长度,我可以正常读取标签。有没有可能避免这种行为?

【问题讨论】:

  • 您保存文件了吗? imebra::CodecFactory::save(*loadedDataSet, "test.dcm", imebra::codecType_d::dicom)。请注意,更改图像原始数据可能需要更改其他标签才能正确解释,包括 DataSet 的传输语法
  • @Paolo Brandoli 是的,跳过了。我添加了它,现在可以修改 PixelData。

标签: c++ image dicom imebra


【解决方案1】:

Imebra 已经为无损 jpeg、基线和扩展 jpeg、RLE 提供了编码器/解码器。

有几种方法可以将您自己的编解码器添加到 Imebra:

  • 从 imebra::implementation::codecs::imageCodec 派生一个类
  • 或将图像编码到字符缓冲区中,然后使用imebra::DataSet::getWritingDataHandlerRaw 将其作为原始内容添加,这允许您写入标记原始内容。 getWritingDataHandlerRaw 返回一个 WritingDataHandlerNumeric。使用WritingDataHandlerNumeric::assign 将字节缓冲区移动到数据处理程序中,然后删除数据处理程序以使其将其内容提交到数据集中。
  • 库附带的示例 changeTransferSyntax 展示了如何使用源数据集中的所有相同标签但使用不同的传输语法(包括不同的图像压缩)创建一个新数据集

【讨论】:

  • 感谢您的回答。这是我的任务的一部分,所以不能使用现有的编码器。请检查已编辑的问题好吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多