You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:10:35