我们现在所遇到的问题有4个:
1、Dicom图像进行3D重建后能否显示注释的问题
详细描述:我有一组Dicom图像,医生对该图像的每一层上都标记了癌部区域的轮廓,当对这组图像进行3D重建的时候,能否把标记的癌部区域轮廓也重建到该3D图像中,以便医生查看。
我自己当时弄了一种变通的方法,不知道该方法是否合适,代码如下:
第一步:在Cell中通过LoadAnnotations方法加载了该图像的注释信息
- string annFile = @"C:\Users\Public\Documents\DICOM Store\L18_WS_SERVER64\999-12-9795\Study0\Series0\Ann1_1.2.840.113619.2.1.1.2703222953.509.953036679.194.ann";
- cell.LoadAnnotations(annFile );
复制代码
第二步:给3Dobject加载对象的时候修改原图,把Annotation转换为相应形状的区域,然后利用FillCommand填充区域的颜色
- created = control3D.ObjectsContainer.Objects[0].MemoryEfficientInit(count);
- DicomDataSet ds = new DicomDataSet();
- for (index = 0; index < count; index++)
- {
- ds.Load(data.FileNames[index], DicomDataSetLoadFlags.None);
- image = ds.GetImage(null, data.FrameIndex - 1, 0, RasterByteOrder.Romm, DicomGetImageFlags.AutoApplyVoiLut | DicomGetImageFlags.AutoApplyModalityLut | DicomGetImageFlags.AllowRangeExpansion);
- LeadRect rc;
- if (cell.SubCells[index].AnnotationContainer.Objects.Count > 0)
- {
- switch (cell.SubCells[index].AnnotationContainer.Objects[0].GetType().Name)
- {
- case "AnnEllipseObject":
- Leadtools.Annotations.AnnEllipseObject eObj = cell.SubCells[index].AnnotationContainer.Objects[0] as Leadtools.Annotations.AnnEllipseObject;
- rc = new LeadRect(Convert.ToInt32(eObj.Bounds.Left), Convert.ToInt32(eObj.Bounds.Top), Convert.ToInt32(eObj.Bounds.Width), Convert.ToInt32(eObj.Bounds.Height));
- image.AddEllipseToRegion(null, rc, RasterRegionCombineMode.Set);
- break;
- default:
- Leadtools.Annotations.AnnRectangleObject rObj = cell.SubCells[index].AnnotationContainer.Objects[0] as Leadtools.Annotations.AnnRectangleObject;
- rc = new LeadRect(Convert.ToInt32(rObj.Bounds.Left), Convert.ToInt32(rObj.Bounds.Top), Convert.ToInt32(rObj.Bounds.Width), Convert.ToInt32(rObj.Bounds.Height));
- image.AddEllipseToRegion(null, rc, RasterRegionCombineMode.Set);
- break;
- }
- }
- FillCommand command = new FillCommand();
- command.Color = RasterColor.FromKnownColor(RasterKnownColor.Red);
- command.Run(image);
- control3D.ObjectsContainer.Objects[0].MemoryEfficientSetFrame(image, index, data.ImagePositions[index], false);
- image.Dispose();
- image = null;
- }
- ds.Dispose();
- }
- control3D.ObjectsContainer.Objects[0].MemoryEfficientEnd(cell.ImageOrientation, cell.PixelSpacing);
复制代码
出来的结果是,图像里面确实把癌部轮廓的3D显示出来了,但不是彩色的,是灰度图像。不知道该做法是否正确,正确的方法是什么?
2、Dicom图像中对注释剥离后进行3D重建的问题
详细描述:我有一组Dicom图像,医生对该图像的每一层上都标记了癌部区域的轮廓,当对这组图像进行3D重建的时候,能否只是把标记的癌部区域轮廓重建到该3D图像中,以便医生查看。
如果是我自己做,思路就是按照每个图的大小生成一张新的Image,然后用上面第一个问题的解决方法只在新Image中放Region,然后3D重建,出来的图像就只有标记注释的区域。
后来我又换了一种方法,就是利用RasterImage的GetOverlayImage方法得到新建的OverlayImage,对该图进行3D重建,结果也能得到,但还是不是彩色的,具体做法如下:
第一步:在Cell中通过LoadAnnotations方法加载了该图像的注释信息
- string annFile = @"C:\Users\Public\Documents\DICOM Store\L18_WS_SERVER64\999-12-9795\Study0\Series0\Ann1_1.2.840.113619.2.1.1.2703222953.509.953036679.194.ann";
- cell.LoadAnnotations(annFile );
复制代码 第二步:给3Dobject加载对象的时候修改原图,把Annotation转换为相应形状的区域,然后利用RasterImage的CreateMaskFromRegion创建覆盖,然后把区域改变为新图层,对该图层进行填色,最后用GetOverlayImage得到的图像进行3D重建
- created = control3D.ObjectsContainer.Objects[0].MemoryEfficientInit(count);
- DicomDataSet ds = new DicomDataSet();
- for (index = 0; index < count; index++)
- {
- ds.Load(data.FileNames[index], DicomDataSetLoadFlags.None);
- image = ds.GetImage(null, data.FrameIndex - 1, 0, RasterByteOrder.Romm, DicomGetImageFlags.AutoApplyVoiLut | DicomGetImageFlags.AutoApplyModalityLut | DicomGetImageFlags.AllowRangeExpansion);
- LeadRect rc;
- if (cell.SubCells[index].AnnotationContainer.Objects.Count > 0)
- {
- switch (cell.SubCells[index].AnnotationContainer.Objects[0].GetType().Name)
- {
- case "AnnEllipseObject":
- Leadtools.Annotations.AnnEllipseObject eObj = cell.SubCells[index].AnnotationContainer.Objects[0] as Leadtools.Annotations.AnnEllipseObject;
- rc = new LeadRect(Convert.ToInt32(eObj.Bounds.Left), Convert.ToInt32(eObj.Bounds.Top), Convert.ToInt32(eObj.Bounds.Width), Convert.ToInt32(eObj.Bounds.Height));
- image.AddEllipseToRegion(null, rc, RasterRegionCombineMode.Set);
- break;
- default:
- Leadtools.Annotations.AnnRectangleObject rObj = cell.SubCells[index].AnnotationContainer.Objects[0] as Leadtools.Annotations.AnnRectangleObject;
- rc = new LeadRect(Convert.ToInt32(rObj.Bounds.Left), Convert.ToInt32(rObj.Bounds.Top), Convert.ToInt32(rObj.Bounds.Width), Convert.ToInt32(rObj.Bounds.Height));
- image.AddEllipseToRegion(null, rc, RasterRegionCombineMode.Set);
- break;
- }
- }
- if (image.HasRegion)
- {
- RasterImage mask = image.CreateMaskFromRegion();
- image.MakeRegionEmpty();
- image.SetOverlayImage(1, mask, RasterGetSetOverlayImageMode.Copy);
- RasterOverlayAttributes attributes;
- attributes = image.GetOverlayAttributes(1, RasterGetSetOverlayAttributesFlags.Flags | RasterGetSetOverlayAttributesFlags.Color | RasterGetSetOverlayAttributesFlags.Origin);
- attributes.Color = new RasterColor(255, 0, 0);
- attributes.AutoPaint = true;
- attributes.Origin = new LeadPoint(0, 0);
- attributes.AutoProcess = true;
- image.UpdateOverlayAttributes(1, attributes, RasterGetSetOverlayAttributesFlags.Flags | RasterGetSetOverlayAttributesFlags.Color | RasterGetSetOverlayAttributesFlags.Origin);
- }
- control3D.ObjectsContainer.Objects[0].MemoryEfficientSetFrame(image.GetOverlayImage(1, RasterGetSetOverlayImageMode.Copy), index, data.ImagePositions[index], false);
- image.Dispose();
- image = null;
- }
- ds.Dispose();
- }
复制代码
出来的结果是,图像里面确实把癌部轮廓的3D显示出来了,但不是彩色的,是灰度图像。不知道该做法是否正确,正确的方法是什么?
3、我的图像是彩色的,3D重建后在MedicalViewer中呈现时能不能以彩色的方式显示3D图像,如果可以,应该如何去做。
4、切片的问题
这个问题很难描述,回头传代码,直接看实例再整. |
|