使用ClearCanvas将JPG图像文件编码为DICOM PixelData
本文关键字:编码 DICOM PixelData 文件 图像 ClearCanvas JPG 使用 | 更新日期: 2023-09-27 18:19:34
我有一组JPG图像,这些图像实际上是CT扫描的切片,我想将其重建为DICOM图像文件并导入PACS。
我正在使用ClearCanvas,并且已经设置了所有必要的标签(并通过使用专有应用程序将我的一个JPG文件转换为DICOM来确认它们,以确保它们是相同的)。我只是不确定我应该如何处理我的JPG文件以将其放入PixelData标签?
根据ClearCanvas论坛的建议,目前我正在将其转换为Byte数组,但DICOM查看器中的图像只是混乱的。我应该如何处理图像数据以使其成为可读格式?
public DicomFile CreateFileFromImage(Image image)
{
int height = image.Height;
int width = image.Width;
short bitsPerPixel = (short)Image.GetPixelFormatSize(image.PixelFormat);
byte[] imageBuffer = ImageToByteArray(image);
DicomFile dicomFile = new DicomFile();
dicomFile.DataSet[DicomTags.Columns].SetInt32(0, width);
dicomFile.DataSet[DicomTags.Rows].SetInt32(0, height);
dicomFile.DataSet[DicomTags.BitsStored].SetInt16(0, bitsPerPixel);
dicomFile.DataSet[DicomTags.BitsAllocated].SetInt16(0, bitsPerPixel);
dicomFile.DataSet[DicomTags.HighBit].SetInt16(0, 7);
//other tags not shown
dicomFile.DataSet[DicomTags.PixelData].Values = imageBuffer;
return dicomFile;
}
public static byte[] ImageToByteArray(Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
return ms.ToArray();
}
ClearCanvas库作为两个辅助类,使DicomFile
中的像素数据更容易编码和解码。它们是DicomCompressedPixelData
类和DicomUncompressedPixelData
类。您可以使用这些设置图像的参数,并将它们编码到DicomFile
对象中。
在您的情况下,由于您正在对压缩对象进行编码,因此应该使用DicomCompressedPixelData
类。类上存在可以设置的属性。调用UpdateMessage
方法将把这些属性值复制到DicomFile
对象上。此外,这个类有一个AddFrameFragment
方法,可以正确地对像素数据进行编码。请注意,压缩的像素数据必须在每帧数据周围有一些特定的二进制包装器。这是您以前的代码中缺少的部分。下面的代码显示了如何设置。
short bitsPerPixel = (short)Image.GetPixelFormatSize(image.PixelFormat);
var dicomFile = new DicomFile();
var pd = new DicomCompressedPixelData(dicomFile);
pd.ImageWidth = (ushort)image.Width;
pd.ImageHeight = (ushort) image.Height;
pd.BitsStored = (ushort)bitsPerPixel;
pd.BitsAllocated = (ushort) bitsPerPixel;
pd.HighBit = 7;
pd.SamplesPerPixel = 3;
pd.PlanarConfiguration = 0;
pd.PhotometricInterpretation = "YBR_FULL_422";
byte[] imageBuffer = ImageToByteArray(image);
pd.AddFrameFragment(imageBuffer);
pd.UpdateMessage(dicomFile);
return dicomFile;
我最终手动处理了位图,并在图像中的红色通道中创建了一个数组,下面是插件中的一些代码:
int size = rows * columns;
byte[] pData = new byte[size];
int i = 0;
for (int row = 0; row < rows; ++row)
{
for (int column = 0; column < columns; column++)
{
pData[i++] = image.GetPixel(column, row).R;
}
}
它确实有效,但速度非常慢,并且会创建臃肿的DICOM文件。我很想让内置的DicomCompressedPixelData类正常工作。
欢迎提出任何进一步的建议。
在插入DICOM数据集之前,了解JPEG CT图像的位深度和颜色成分非常重要。它可以是8位有损的(JPEG压缩过程2)或12位有损(JPEG压缩进程4)或8、12或16位无损灰度JPEG(JPEG压缩处理14-无损、非分层)。此信息对于更新像素数据相关信息至关重要,例如光度解释、每像素采样、平面配置、分配的位、高位到传输语法。