6

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

 3 years ago
source link: https://www.cnblogs.com/Uncle-Joker/p/14262455.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

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

肺纹理增强:

1083581-20210111155004508-642834058.png

肺结节增强:

1083581-20210111155112129-1790026006.png

 血管对比增强:

 1083581-20210111160104650-768949031.png

 骨骼对比增强:

1083581-20210111160258889-1596595767.png

根据参考资料:

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

1083581-20210111161237095-242866725.png

将其原理翻译写成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;
}

导出函数:

1083581-20210111162721004-1252339128.png

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);

创建模块定义文件:

1083581-20210111162851234-2146343970.png

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医学影像处理系统系列教程 目录整理:

菜鸟入门篇

熟手进阶篇

医学图像算法:

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

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影像处理系统宣传视频

本文作者: 乔克灬叔叔

本文链接:https://www.cnblogs.com/Uncle-Joker/p/14262455.html

版权声明:没版权,欢迎转载,欢迎搬运,注明来源,谢谢。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK