热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

在医院实际环境中,经常遇到有问题的患者,对于一些特殊的场景,比如骨折,肺结节,心脑血管问题需要图像对比增强来更为清晰的显示病灶助于医生确诊,先看效果: 肺纹理增强:肺

在医院实际环境中,经常遇到有问题的患者,对于一些特殊的场景,比如骨折,肺结节,心脑血管问题

需要图像对比增强来更为清晰的显示病灶助于医生确诊,先看效果:

 

肺纹理增强:

肺结节增强:

 血管对比增强:

 

 骨骼对比增强:

 

根据参考资料:

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

#include
<string>
#include

#include

#include

#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
buf;
imencode(
".jpg", vesselness * 255, buf);
auto
*enc_msg = reinterpret_castchar
*>(buf.data());
string encoded = base64Encode(enc_msg, buf.size());
//返回base64编码
char *result = new char[encoded.length() + 1];
for (int i = 0; i i)
{
result[i] = encoded[i];
}
result[encoded.length()]
= '

#include "stdafx.h"
#include

#include
<string>
#include

#include

#include

#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
buf;
imencode(
".jpg", vesselness * 255, buf);
auto
*enc_msg = reinterpret_castchar
*>(buf.data());
string encoded = base64Encode(enc_msg, buf.size());
//返回base64编码
char *result = new char[encoded.length() + 1];
for (int i = 0; i i)
{
result[i] = encoded[i];
}
result[encoded.length()]
= '\0';
return result;
}
';
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#

 

通过调整各个参数来达到想要的效果:

 

 



推荐阅读
  • 本文深入探讨了Python中的高阶函数和Lambda表达式的使用方法,结合实际案例解析其应用场景,帮助开发者更好地理解和运用这些强大的工具。 ... [详细]
  • 本文探讨了在 ASP.NET MVC 5 中实现松耦合组件的方法。通过分离关注点,应用程序的各个组件可以更加独立且易于维护和测试。文中详细介绍了依赖项注入(DI)及其在实现松耦合中的作用。 ... [详细]
  • 本文介绍如何在华为CE交换机上配置M-LAG(多链路聚合组),以实现CE1和CE2设备作为VLAN 10网关的高可用性。通过详细的配置步骤,确保网络冗余和稳定性。 ... [详细]
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • 本文详细介绍了如何在C#程序运行期间防止系统进入休眠模式以及显示器关闭,提供了具体的实现代码示例,并解释了其应用场景。这不仅有助于提高程序的稳定性,还能优化能源管理。适合需要处理长时间任务(如下载或批处理)的开发者参考。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 编写了几个500行左右代码的程序,但基本上解决问题还是面向过程的思维,如何从问题中抽象出类,形成类的划分和设计,从而用面向对象的思维解决问题?有这方面的入门好书吗?最好是结合几个具体的案例分析的 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • 本文探讨了如何在C# WinForms应用程序中将带有格式(如粗体、下划线等)的RTF文本粘贴到RichTextBox控件中,并确保粘贴后的文本保持原始格式和着色。我们还将介绍一些优化方法,以提高处理效率。 ... [详细]
  • 本文介绍了如何在 C# 和 XNA 框架中实现一个自定义的 3x3 矩阵类(MMatrix33),旨在深入理解矩阵运算及其应用场景。该类参考了 AS3 Starling 和其他相关资源,以确保算法的准确性和高效性。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 本文介绍了解决在Windows操作系统或SQL Server Management Studio (SSMS) 中遇到的“microsoft.ACE.oledb.12.0”提供程序未注册问题的方法,特别针对Access Database Engine组件的安装。 ... [详细]
  • 本文介绍如何使用RFC 5545重复规则在C#中实现类似于Google日历中的事件安排功能,特别是针对每月特定工作日的事件。我们将探讨如何精确设置这些规则以确保事件按照预期频率和日期触发。 ... [详细]
  • 使用EmguCV 4.5.4实现LSD直线检测的C#示例
    欢迎关注“视觉与AI技术前沿”公众号,获取最新的计算机视觉和深度学习干货。本文将详细介绍如何使用EmguCV 4.5.4在C#中实现LSD(Line Segment Detector)直线检测,并提供完整的代码示例。 ... [详细]
  • MongoDB的核心特性与架构解析
    本文深入探讨了MongoDB的核心特性,包括其强大的查询语言、灵活的文档模型以及高效的索引机制。此外,还详细介绍了MongoDB的体系结构,解释了其文档、集合和数据库的层次关系,并对比了MongoDB与传统关系型数据库(如MySQL)的逻辑结构。 ... [详细]
author-avatar
手机用户2702932415_836
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有