在醫院實際環境中,經常遇到有問題的患者,對於一些特殊的場景,比如骨折,肺結節,心腦血管問題
需要影像對比增強來更為清晰的顯示病灶助於醫生確診,先看效果:
肺紋理增強:
肺結節增強:
血管對比增強:
骨骼對比增強:
根據參考資料:
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醫學影像處理系統(七):讀取影像Dicom資訊
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交流。 |