使用EmguCV(C#)调整Dicom像素数据时遇Cv2.Resize使用问题
解决EmguCV Cv2.Resize处理Dicom像素数据的错误
问题核心错误
你当前代码的关键问题有两个:
- 错误地将
pixelData_.Length(数值类型)传给了Cv2.Resize的输入参数,该方法要求输入的是代表图像的InputArray类型(比如Mat),而非数值。 - 没有把从Dicom读取的一维byte数组转换成对应尺寸的Mat,EmguCV无法直接识别一维数组为图像数据。
InputArray与OutputArray简单说明
- InputArray:EmguCV封装的输入抽象类型,支持Mat、VectorOfByte等多种图像数据载体,你只需要把图像数据包装成正确的Mat传入即可。
- OutputArray:用于接收处理后的输出数据,通常传入一个空的Mat,
Resize会根据目标尺寸自动为其分配内存空间。
修正后的完整代码
DicomFile dicomFile_ = DicomFile.Open(pathOfFileList[0], FileReadOption.ReadAll); var pixelData_ = dicomFile_.Dataset.GetValues<byte>(DicomTag.PixelData); // 1. 将一维byte数组转为原尺寸(1024x1024)的单通道Mat // 注:如果是16位深度的Dicom影像(如CT),需改用DepthType.Cv16U,同时用ushort类型读取像素数据 Mat inputMat = new Mat(1024, 1024, DepthType.Cv8U, 1); inputMat.SetTo(pixelData_); // 2. 调用Resize完成缩放 Mat outputMat = new Mat(); // 直接指定目标尺寸即可,缩小图像推荐用InterpolationFlags.Area避免锯齿 Cv2.Resize(inputMat, outputMat, new Size(512, 512), interpolation: InterpolationFlags.Area); // 3. 提取缩放后的像素数据 var resizedPixelData = outputMat.ToBytes(); // 此时resizedPixelData长度应为512*512=262144字节,符合预期
额外注意事项
- 如果你的Dicom影像为16位像素深度,需调整代码:
var pixelData_ = dicomFile_.Dataset.GetValues<ushort>(DicomTag.PixelData); Mat inputMat = new Mat(1024, 1024, DepthType.Cv16U, 1); inputMat.SetTo(pixelData_); - 插值方法选择:
InterpolationFlags.Area是缩小图像的最优选择,能有效避免边缘锯齿;放大图像可选用InterpolationFlags.Linear或InterpolationFlags.Cubic。
内容的提问来源于stack exchange,提问作者Anasse
相关产品推荐
相关产品推荐

