我使用Imerba库来读取DICOM文件。 我需要访问像素,所以我可以在低级别修改它们。 文档说:"为了访问图像的像素,您必须检索数据处理程序" 还有一个例子:
imbxUint32 rowSize, channelPixelSize, channelsNumber;
ptr<imebra::handlers::dataHandlerNumericBase> myHandler = presentationImage->getDataHandler(true, &rowSize, &channelPixelSize, &channelsNumber);
// Retrieve the image's size in pixels
imbxUint32 sizeX, sizeY;
presentationImage->getSize(&sizeX, &sizeY);
// Scan all the rows
imbxUint32 index(0);
for(imbxUint32 scanY = 0; scanY < sizeY; ++scanY)
{
// Scan all the columns
for(imbxUint32 scanX = 0; scanX < sizeX; ++scanX)
{
// Scan all the channels
for(imbxUint32 scanChannel = 0; scanChannel < channelsNumber; ++scanChannel)
{
imbxInt32 channelValue = myHandler->getSignedLong(index++);
// Do something with the channel's value
//--------------------------------------
}
}
} 我需要更改presentationImage对象像素。我试图像以下那样改变它:
myHandler->setSignedLong(index,255);
但它并没有改变presentationImage对象,我现在肯定了。 Imebra文档只有三个示例,类和方法描述有点原始。谷歌一无所知。 如何更改此对象中的像素值?
答案 0 :(得分:1)
当你修改缓冲区时,你正在修改未压缩的图像:原始的dicom结构仍包含压缩的图像。
为了替换Dicom文件中的图像,您必须在dataset::setImage
超出范围后使用dataHandler
将图像放回数据集中(仅当数据写入图像时dataHandler
被销毁了)