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交流。