热门标签 | 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#

 

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

 

 



推荐阅读
  • Go 中的 init 函数 ... [详细]
  • 文章目录验证性实验求1~n的连续整数和说明放码结果常见算法时间函数的增长趋势分析说明放码结果设计性实验求素数个数说明放码结果求连续整数阶乘的和说明放码结果验证性实验求1~n的连续 ... [详细]
  • C#制作TextBox水印提示
    前言在使用C#的TextBox控件时,有时候会有以下需求:在用户没有输入文字时,TextBox有提示文字,如下图所示 ... [详细]
  • 【小Y学算法】⚡️每日LeetCode打卡⚡️——27.对称二叉树
    📢前言🌲原题样例🌻C#方法:递归🌻Java方法一:递归🌻Java方法二& ... [详细]
  • 来搞C#开发半个月了。cloudServer项目先停一停。是RD的项目 ... [详细]
  • 为了找工作做了个例子,做了一半了,想再网上找点别人的创意点的东西,看到了一个叫桌面台球游戏源码的程序.我打开便玩了两盘.结果他的内存占用下我一跳.先看看我载的几张图吧占了快占了560M内存了. ... [详细]
  • 工作以来接触到的技术流
    2019独角兽企业重金招聘Python工程师标准下面是工作以来接触到的技术平台,以及技术方案。部分在项目中深入过,部分仅选型、实践过。不断补充中. ... [详细]
  • Visual Studio 2015 开发 ASP.NET 5 有何变化?
    Visual Studio 2015 开发 ASP.NET 5 有何变化? ... [详细]
  • WarensoftUnity3dCommunicationLibthisisahighperformancecommunicationlibraryfor Unity3d,incl ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • 测绘程序设计Excel度分秒转换模板附代码超实用版
    本文介绍了测绘程序设计Excel度分秒转换模板附代码超实用版的相关知识,包括准备工作、编写表达式和注意事项。在实际工作中,将GPS实测的经纬度度转换为度分秒是常见需求,本文提供了在Excel中快速进行转换的方法,以提高工作效率。 ... [详细]
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社区 版权所有