C#處理醫學圖像(二):基於Hessian矩陣的醫學圖像增強與窗寬窗位
- 2021 年 1 月 14 日
- 筆記
- c#, Dicom, PACS醫學影像, PACS影像處理系統
根據本系列教程文章上一篇說到,在完成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左右,將窗寬窗位調整至增強前肉眼可見的差別,
最大程度降低二維圖像上的無用信息,再利用海森矩陣加強線性結構,過濾圓(點)和降噪。
綜上總結:先調整窗寬窗位,再圖像增強和調整參數,使得效果最大化: