根据本系列教程文章上一篇说到,在完成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左右,将窗宽窗位调整至增强前肉眼可见的差别,

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

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

最新文章

  1. java性能调优及问题追踪--Btrace的使用
  2. eclipse 项目显示红叉
  3. ssh(sturts2_spring_hibernate) 框架搭建之hibernate1
  4. wex5 开机图片时间长
  5. ytu 2558: 游起来吧!超妹!(水题,趣味数学题)
  6. laravel 加中间件的方法 防止直接打开后台
  7. centOS 6.x 版本安装 node.js 4.x 以上版本的方法
  8. javacc jjtree 写法 以及 jj写法 基本语法 以及应用
  9. 走迷宫(DFS)
  10. (转载)SQL Server 2005 日志文件过大处理
  11. scheme 阴阳谜题
  12. IntelliJ IDEA 14 注册码及注册码生成器
  13. ioctl函数详细说明
  14. cmusphinx格式问题
  15. HTML5仿微信聊天界面、微信朋友圈实例
  16. 【憩园】C#并发编程之异步编程(一)
  17. centos7之zabbix的监控H3C ER3200G2流量
  18. css选择器权重问题
  19. Sql 调优总结
  20. uname -r查询版本不是安装的版本的问题

热门文章

  1. 树的直径,LCA复习笔记
  2. CSP-S 初赛最后的复习
  3. 四、Zookeeper伪集群搭建
  4. MVC-采用Bundles方式引入css和js文件
  5. 在虚拟机中安装Linux系统CentOS7详细教程!!!超详细!!!!一看就会!!!手把手教学!!!
  6. Unity2D 人物移动切换人物图片
  7. Django 3.x 原生支持websocket 配置
  8. pandas的学习6-合并concat
  9. 拥抱云原生,如何将开源项目用k8s部署?
  10. BST和DST简单的matlab程序(图的广度和深度遍历)