C#处理医学图像(二):基于Hessian矩阵的医学图像增强与窗宽窗位

根据本系列教程文章上一篇说到,在完成C++和Opencv对Hessian矩阵滤波算法的实现和封装后,

再由C#调用C++ 的DLL,(参考:C#处理医学图像(一):基于Hessian矩阵的血管肺纹理骨骼增强对比)

功能虽然已经实现,但在实际应用中要考虑到性能和耦合,本篇将介绍性能方面的注意点以及和其他功能的联动。

我们将Demo里面的功能集成到正式工程中:

1.新建一个新窗体,用来显示结果和调整滤波参数:

其中滑块控件选择工具箱中的Slider,定义好控件样式,变化事件选择PreviewMouseLeftButtonUp,不要用ValueChanged,

考虑到性能问题,因为是base64转码和解码,所以不推荐用ValueChanged,它的触发频率要高得多,

而在图像大小比较大的时候 base64加解密的效率显得不是很高,会造成主线程UI卡顿,所以只要响应鼠标抬起时计算图像即可。

<Slider x:Name="SgStart" Style="{StaticResource Slider_CustomStyle}" Width="132" Height="19"  Value="1" IsMoveToPointEnabled="True"  PreviewMouseLeftButtonUp="SgStart_PreviewMouseLeftButtonUp" />

2.显示计算结果:

在Slider控件鼠标抬起的事件中,先将目标单元格内WPF图像转为base64,发送给我们生成的C++接口,再将返回的base64转为WPF图像

[DllImport(@"opencv\ET.Functions.dll", EntryPoint = "GetFrangiBase64Code", CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr GetFrangiBase64Code(string base64code, int SIGMA_START, int SIGMA_END, int SIGMA_STEP, float BETA_ONE, float BETA_TWO, bool BLACKWHITE);

      /// <summary>
        /// 获取滤波图像
        /// </summary>
        /// <param name="filterParm">滤波参数对象</param>
        public void GetFilterImg(FilterParm filterParm)
        {
            try
            {
                string base64 = WriteableBitmapToBase64(Wbp);
                IntPtr intPtr = GetFrangiBase64Code(base64,
                                    filterParm.Start,
                                    filterParm.End,
                                    filterParm.Step,
                                    filterParm.DenoiseNum,
                                    filterParm.BgArgs,
                                    filterParm.BgType);

                if (intPtr != IntPtr.Zero)
                {
                    string filterCode = Marshal.PtrToStringAnsi(intPtr);
                    ImgBox.Source = Base64ToWriteableBitmap(filterCode);
                }
            }
            catch (Exception e)
            {
                LogApi.WriteErrLog(e);
            }
        }


      /// <summary>
        /// base64转WriteableBitmap
        /// </summary>
        /// <param name="base64">base64字符串</param>
        public WriteableBitmap Base64ToWriteableBitmap(string base64)
        {
            byte[] streamBase = Convert.FromBase64String(base64);
            BitmapImage bi = new BitmapImage();
            bi.BeginInit();
            bi.StreamSource = new MemoryStream(streamBase);
            bi.EndInit();
            WriteableBitmap wbp = new WriteableBitmap(bi);
            return wbp;
        }


        /// <summary>
        /// WriteableBitmap转base64
        /// </summary>
        /// <param name="writeableBitmap">图像对象</param>
        public string WriteableBitmapToBase64(WriteableBitmap writeableBitmap)
        {
            MemoryStream memStream = new MemoryStream();
            JpegBitmapEncoder encoder = new JpegBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(writeableBitmap));
            encoder.Save(memStream);
            byte[] bytes = memStream.ToArray();
            string code = Convert.ToBase64String(bytes);
            return code;
        }

看效果:

乳腺影像由原始dcm显示的絮状腺体在图像增强下变成丝状,对于乳腺中存在肿瘤或其他病症的显示更为明显,亦可自由调整参数达到自己想要的效果。

但有的情况下,增强效果却很差,显示的结果对于提取有价值的病灶信息几乎没有意义:

根据Hessian矩阵部分概念:

由原理中得知,求得特征值和特征向量反应出的变化上的各向异性,在二维图像中,

圆(点)具有各向同性,线性强度与各向异性程度成正比,

而在窗宽与窗位个概念中,血管的CT值为30左右,将窗宽窗位调整至增强前肉眼可见的差别,

最大程度降低二维图像上的无用信息,再利用海森矩阵加强线性结构,过滤圆(点)和降噪。

综上总结:先调整窗宽窗位,再图像增强和调整参数,使得效果最大化:

 C#开发PACS、RIS、3D医学影像处理系统系列教程 目录整理:

菜鸟入门篇

C#开发PACS医学影像处理系统(一):开发背景和功能预览

C#开发PACS医学影像处理系统(二):界面布局之菜单栏

C#开发PACS医学影像处理系统(三):界面布局之工具栏

C#开发PACS医学影像处理系统(四):界面布局之状态栏

C#开发PACS医学影像处理系统(五):查询病人信息列表

C#开发PACS医学影像处理系统(六):加载Dicom影像

C#开发PACS医学影像处理系统(七):读取影像Dicom信息

C#开发PACS医学影像处理系统(八):单元格变换

C#开发PACS医学影像处理系统(九):序列控件与拖拽

C#开发PACS医学影像处理系统(十):Dicom影像下载策略与算法

C#开发PACS医学影像处理系统(十一):Dicom影像挂片协议

C#开发PACS医学影像处理系统(十二):绘图处理之图形标记

C#开发PACS医学影像处理系统(十三):绘图处理之病灶测量

C#开发PACS医学影像处理系统(十四):处理Dicom影像窗宽窗位

C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法

C#开发PACS医学影像处理系统(十六):2D处理之影像平移和缩放

C#开发PACS医学影像处理系统(十七):2D处理之影像旋转和翻转

C#开发PACS医学影像处理系统(十八):Dicom使用LUT色彩增强和反色

C#开发PACS医学影像处理系统(十九):Dicom影像放大镜

医学影像三维篇

C#开发PACS医学影像三维重建(一):使用VTK重建3D影像

C#开发PACS医学影像三维重建(二):使用VTK进行体绘制

C#开发PACS医学影像三维重建(三):纹理映射与颜色传输

C#开发PACS医学影像三维重建(四):3D网格平滑效果

C#开发PACS医学影像三维重建(五):基于梯度透明的组织漫游

C#开发PACS医学影像三维重建(六):三维光源与阴影效果

C#开发PACS医学影像三维重建(七):空间测量与标注

C#开发PACS医学影像三维重建(八):VR体绘制

C#开发PACS医学影像三维重建(九):MPR三视图切面重建

C#开发PACS医学影像三维重建(十):MIP最小密度投影

C#开发PACS医学影像三维重建(十一):CPR曲面重建

C#开发PACS医学影像三维重建(十二):VE虚拟内镜技术

C#开发PACS医学影像三维重建(十三):基于人体CT值从皮肤渐变到骨骼的梯度透明思路

C#开发PACS医学影像三维重建(十四):基于能量模型算法将曲面牙床展开至二维平面

熟手进阶篇

C#处理医学影像(一):基于Hessian矩阵的血管肺纹理骨骼增强对比

C#处理医学影像(二):基于Hessian矩阵的医学影像增强与窗宽窗位

C#处理医学影像(三):基于漫水边界自动选取病灶范围的实现思路

C#处理医学影像(四):基于Stitcher算法拼接人体全景脊柱骨骼影像

胶片打印:

C#开发医学影像胶片打印系统(一):万能花式布局的实现思路

C#开发医学影像胶片打印系统(二):胶片打印机通讯

C#开发医学影像胶片打印系统(三):Pacs二维功能在排版中的应用

登峰造极篇

C#开发基于Python人工智能的肺结节自动检测

C#开发基于Python人工智能的脊柱侧弯曲率算法

C#开发基于Python机器学习的医学影像骨骼仿真动画

C#开发基于Python机器学习的术后恢复模拟

C#开发基于U3D的VR眼镜设备虚拟人体三维重建

C#开发基于全息投影的裸眼3D医学影像显示技术

免费下载

免费下载使用本教程PACS软件

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值