“阅读本文大概需要 4 分钟,今天小编就来聊一聊关于mtk平台都有什么测试模式?接下来我们就一起去研究一下吧!
mtk平台都有什么测试模式
“
阅读本文大概需要 4 分钟
传输语法表示了某个dicom在传输过程中的一些状态封装,有三种形式
如果是压缩文件,则需要先进行解压操作
官方Demo
压缩文件
DJEncoderRegistration::registerCodecs(); // register JPEG codecs
DcmFileFormat fileformat;
if (fileformat.loadFile("test.dcm").good())
{
DcmDataset *dataset = fileformat.getDataset();
DcmItem *MetaInfo = fileformat.getMetaInfo();
DJ_RPLossless params; // codec parameters, we use the defaults
// this causes the lossless JPEG version of the dataset to be created
if (dataset->chooseRepresentation(EXS_JPEGProcess14SV1, ¶ms).good() &&
dataset->canWriteXfer(EXS_JPEGProcess14SV1))
{
// store in lossless JPEG format
fileformat.saveFile("test_jpeg.dcm", EXS_JPEGProcess14SV1);
}
}
DJEncoderRegistration::cleanup(); // deregister JPEG codecs
压缩的时候示例采用的是默认参数,这个有多个
默认
DJ_RPLossless params;
常用的
D2RepresentationParameter(
double compressionRatio = 1,
Uint32 compressedSize = 0,
OFBool losslessProcess = OFTrue,
const OFString &imageComment = "")
这个类有三个参数
压缩某个dicom文件可能会出现这样的错误
Pixel representation cannot be changed
查看源码后得知错误原因可能有
......
if (resultStack.top()->ident() == EVR_PixelData)
{
DcmPixelData *pixelData = OFstatic_cast(DcmPixelData *, resultStack.top());
if (!pixelData->canChooseRepresentation(repType, repParam))
l_error = EC_CannotChangeRepresentation;
pixelStack.push(resultStack);
}
else
l_error = EC_CannotChangeRepresentation;
......
错误类型正是这个
makeOFConditionConst(EC_CannotChangeRepresentation, OFM_dcmdata, 14, OF_error, "Pixel representation cannot be changed" );
DJDecoderRegistration::registerCodecs(); // register JPEG codecs
DcmFileFormat fileformat;
if (fileformat.loadFile("test_jpeg.dcm").good())
{
DcmDataset *dataset = fileformat.getDataset();
// decompress data set if compressed
if (dataset->chooseRepresentation(EXS_LittleEndianExplicit, NULL).good() &&
dataset->canWriteXfer(EXS_LittleEndianExplicit))
{
fileformat.saveFile("test_decompressed.dcm", EXS_LittleEndianExplicit);
}
}
DJDecoderRegistration::cleanup(); // deregister JPEG codecs
dcmtk内部初始化时,枚举了所有的压缩类型对应的属性,下面这个是基本数据结构,每个压缩类型对应一个结构体对象
typedef struct
{
const char *xferID;
const char *xferName;
E_TransferSyntax xfer;
E_ByteOrder byteOrder;
E_VRType vrType;
E_JPEGEncapsulated encapsulated;
Uint32 JPEGProcess8;
Uint32 JPEGProcess12;
OFBool lossy;
OFBool retired;
E_StreamCompression streamCompression;
} S_XferNames;
DJ_RPLossless params; // codec parameters, we use the defaultsE_TransferSyntax xfer = EXS_JPEGProcess2_4;OFCondition ofResult = dataset->chooseRepresentation(xfer, ¶ms);if (ofResult.good() && dataset->canWriteXfer(xfer)){// store in lossless JPEG formatOFCondition ofResult = fileformat.saveFile("G:/dicomFile/8_test_jpeg.dcm", xfer);}
可以很明显看到图像被压缩的太狠,查看文件大小仅有大概 5KB,原始文件大小288KB
这种方式几乎不会用,因为图像被压缩的太狠,很多关键信息都丢失了
int nQuality = 50;
// this causes the lossless JPEG version of the dataset to be created
D2RepresentationParameter rpp( nQuality*0.01, OFstatic_cast(Uint32, 1), OFFalse, "");
OFCondition ofResult = dataset->chooseRepresentation(xfer, &rpp);
这种情况下,压缩后文件大小为 33KB左右,显示效果比上一个好点
常见图像压缩方式一般默认可以采用 EXS_JPEGProcess2_4进行压缩,如果图像包含Overlay层,则要使用 EXS_JPEG2000协议,对于常见的CT,MR,NM,PET等,如果图像宽高小于 1024 情况下可以采用 EXS_JPEGProcess14SV1协议