C#處理醫學圖像(一):基於Hessian矩陣的血管肺紋理骨骼加強對比

在醫院實際環境中,常常遇到有問題的患者,對於一些特殊的場景,好比骨折,肺結節,心腦血管問題html

須要圖像對比加強來更爲清晰的顯示病竈助於醫生確診,先看效果:ios

 

肺紋理加強:算法

肺結節加強:微信

 血管對比加強:架構

 

 骨骼對比加強:併發

 

根據參考資料:機器學習

MATLAB版本:函數

https://ww2.mathworks.cn/matlabcentral/fileexchange/24409-hessian-based-frangi-vesselness-filter高併發

算法原理:工具

https://baike.baidu.com/item/%E9%BB%91%E5%A1%9E%E7%9F%A9%E9%98%B5/2248782?fr=aladdin

 

 

將其原理翻譯寫成C++類庫,在C++中使用Opencv對於矩陣操做比較方便,導出dll後再由C#調用,

新建C++類庫工程:

#include "stdafx.h" #include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <vector> #include "MatBase64.h" #include "frangi.h" #include "ET.Functions.h"
using namespace std; using namespace cv; char* GetFrangiBase64Code(char* base64code, int SIGMA_START, int SIGMA_END, int SIGMA_STEP, float BETA_ONE, float BETA_TWO, bool BLACKWHITE){ //初始化矩陣參數
 frangi2d_opts_t opts; frangi2d_createopts(&opts, SIGMA_START, SIGMA_END, SIGMA_STEP, BETA_ONE, BETA_TWO, BLACKWHITE); //處理傳入的base64編碼轉爲Mat對象
    string imgcode =base64code; string s_mat; s_mat = base64Decode(imgcode.data(), imgcode.size()); vector<char> base64_img(s_mat.begin(), s_mat.end()); Mat input_img = cv::imdecode(Mat(base64_img), CV_LOAD_IMAGE_GRAYSCALE); //進行frangi算法處理
 Mat input_img_fl; input_img.convertTo(input_img_fl, CV_32FC1); Mat vesselness, scale, angles; frangi2d(input_img_fl, vesselness, scale, angles, opts); vector<uchar> buf; imencode(".jpg", vesselness * 255, buf); auto *enc_msg = reinterpret_cast<unsigned char*>(buf.data()); string encoded = base64Encode(enc_msg, buf.size()); //返回base64編碼
    char *result = new char[encoded.length() + 1]; for (int i = 0; i < encoded.length(); ++i) { result[i] = encoded[i]; } result[encoded.length()] = '\0'; return result; }

 

導出函數:

extern "C" _declspec(dllexport) char* GetFrangiBase64Code(char * base64code, int SIGMA_START, int SIGMA_END, int SIGMA_STEP, float BETA_ONE, float BETA_TWO, bool BLACKWHITE);

 

建立模塊定義文件:

LIBRARY "ET.Functions" EXPORTS GetFrangiBase64Code @ 1,

 

導出32位dll,複製到C#debug目錄下,C#調用:將目標圖像轉爲base64,發送給C++,返回處理後的base64,在轉爲圖像

        [DllImport(@"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); private void ckcbw_CheckedChanged(object sender, EventArgs e) { getimg(); } private void trabarStart_ValueChanged(object sender, EventArgs e) { getimg(); } void getimg() { int start = trabarStart.Value; int end = trabarEnd.Value; int step = trabarStep.Value; float zaosheng = (float)trabarZaosheng.Value / 10; float bg = (float)trabarBG.Value / 10; IntPtr pRet = GetFrangiBase64Code(ToBase64(b), start, end, step, zaosheng, bg, ckcbw.Checked); string strRet = Marshal.PtrToStringAnsi(pRet); pictureBox1.BackgroundImage = Base64StringToImage(strRet); }

 

若是不想用C++,直接用C#裏面的opencv庫也能夠,直接用nuget搜索EmguCV,須要本身將MatLab代碼或C++代碼翻譯成C#

 

經過調整各個參數來達到想要的效果:

 

 

C#開發PACS、RIS、3D醫學影像處理系統系列教程目錄整理:

菜鳥入門篇:

PACS客戶端:

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影像放大鏡

 

PACS三維處理醫學圖像:

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#處理醫學圖像(一):基於Hessian矩陣的血管肺紋理骨骼加強對比

C#處理醫學圖像(二):圖像銳化加強對比

 

PACS網頁端 開發Web版本的PACS:

C#開發Web端PACS(一):基於PACS客戶端思想重寫Web端

C#開發Web端PACS(二):使用 .Net MVC 開發手機端PACS服務端

C#開發Web端PACS(三):使用HTML5和CSS3開發PACS手機端頁面

C#開發Web端PACS(四):Web端與服務端的DICOM傳輸

C#開發Web端PACS(五):Web端的平移縮放旋轉2D操做

C#開發Web端PACS(六):Web端的窗寬窗位調整

C#開發Web端PACS(七):將移動端接入微信公衆號實現醫院雲膠片

 

登峯造極篇:

C#開發基於Python人工智能的肺結節自動檢測

C#開發基於Python人工智能的脊柱側彎曲率算法

C#開發基於Python機器學習的醫學影像骨骼仿真動畫

C#開發基於Python機器學習的術後恢復模擬

C#開發基於U3D的VR眼鏡設備虛擬人體三維重建

C#開發基於全息投影的裸眼3D醫學影像顯示技術

 

周邊附加篇:

膠片打印:

C#開發醫學影像膠片打印系統(一):功能與膠片排版

C#開發醫學影像膠片打印系統(二):膠片打印機通信

C#開發醫學影像膠片打印系統(三):不規則排版打印

 

PACS服務端:

C#開發PACS醫學影像處理系統服務端(一):醫療設備的鏈接與收圖

C#開發PACS醫學影像處理系統服務端(二):高併發架構

 

PACS與RIS系統的通訊與集成

在RIS系統中調起PACS並打開Dicom影像

 

雲PACS與遠程會診

C#開發PACS醫學影像處理系統之雲PACS(區域PACS)(一):架構概述

C#開發PACS醫學影像處理系統之雲PACS(區域PACS)(二):遠程會診與雙向轉診

 

科幻級視頻特效:

使用Adobe After Effects 製做PACS影像處理系統宣傳視頻

 

QQ:1850969244

近10年開發經驗,主攻C#、ASP MVC,HTML5,

B/S C/S 皆可,目前研究醫療領域醫學影像相關技術,

任何技術問題歡迎加QQ交流。

相關文章
相關標籤/搜索