#include "stdafx.h"
#include "LPEAWrapper.h"
#include "hedyErrHandler.h"
#include "hedyDebug.h"
// Calibration
#include "HEDYCalibration.h"
// Enhancement
#include "HEDYDMPLstruct.h"
#include "LPEAlgoriAPI.h"
// 乳腺图像增强算法默认方式
// @param pInImg[in] 原始图像
// @param pOutImg[out] 增强图像
// @param strDMConfigFilePath[in] 增强参数文件路径
// @return
// 返回SUCCESS,增强成功。否则返回错误代码。
ERRTYPE mgEnExcute(
PWORD pInImg, PWORD pOutImg,
INT nWid, INT nHei,
CString strDMConfigFilePath)
{
if(pInImg == NULL || pOutImg == NULL){
HEDYERRHANDLER_logFile("pInImg / pOutImg is NULL.");
return PARAM_ERR;
}
if(strDMConfigFilePath.Compare(_T("")) == 0){
HEDYERRHANDLER_logFile("Empty config file path.");
return PARAM_ERR;
}
DMConfig dmConfig;
if(!GetAllDataString(strDMConfigFilePath, dmConfig)){
HEDYERRHANDLER_logFile("Load config file failed.");
return PARAM_ERR;
}
INT dataLen = nWid * nHei;
if(dataLen == 0){
HEDYERRHANDLER_logFile("Load image failed, incorrect image size.");
return PARAM_ERR;
}
ERRTYPE errHandler = SUCCESS;
// 需要在服务中开放接口
INT nDetailLev = dmConfig.modulatePara.nDetailLev;
INT nDepthLev = dmConfig.modulatePara.nDepthLev;
INT nMicroCaLev = dmConfig.modulatePara.nMicroCaLev;
errHandler = mgEnAlgori(
pInImg, pOutImg, nWid, nHei,
dmConfig, nDetailLev, nDepthLev, nMicroCaLev);
return SUCCESS;
}
// 乳腺图像增强算法调整方式
// @param pInImg[in] 原始图像
// @param pOutImg[out] 增强图像
// @param strDMConfigFilePath[in] 增强参数文件路径
// @param nDetailLev[in] 细节增强权重
// @param nDepthLev[in] 层次增强权重
// @param nMicroCaLev[in] 钙化点增强权重
// @return
// 返回SUCCESS,增强成功。否则返回错误代码。
ERRTYPE mgEnAdjust(
PWORD pInImg, PWORD pOutImg,
INT nWid, INT nHei,
CString strDMConfigFilePath,
INT nDetailLev, INT nDepthLev, INT nMicroCaLev)
{
if(pInImg == NULL || pOutImg == NULL){
HEDYERRHANDLER_logFile("pInImg / pOutImg is NULL.");
return PARAM_ERR;
}
if(strDMConfigFilePath.Compare(_T("")) == 0){
HEDYERRHANDLER_logFile("Empty config file path.");
return PARAM_ERR;
}
DMConfig dmConfig;
if(!GetAllDataString(strDMConfigFilePath, dmConfig)){
HEDYERRHANDLER_logFile("Load config file failed.");
return PARAM_ERR;
}
INT dataLen = nWid * nHei;
if(dataLen == 0){
HEDYERRHANDLER_logFile("Load image failed, incorrect image size.");
return PARAM_ERR;
}
ERRTYPE errHandler = SUCCESS;
errHandler = mgEnAlgori(
pInImg, pOutImg, nWid, nHei,
dmConfig, nDetailLev, nDepthLev, nMicroCaLev);
return SUCCESS;
}
// 乳腺图像增强算法调整方式
// @param pInImg[in] 原始图像
// @param pOutImg[out] 增强图像
// @param dmConfig[in] 增强参数列表
// @param nDetailLev[in] 细节增强权重
// @param nDepthLev[in] 层次增强权重
// @param nMicroCaLev[in] 钙化点增强权重
// @return
// 返回SUCCESS,增强成功。否则返回错误代码。
ERRTYPE mgEnAlgori(
PWORD pInImg, PWORD pOutImg,
INT nWid, INT nHei, DMConfig dmConfig,
INT nDetailLev, INT nDepthLev, INT nMicroCaLev)
{
INT dataLen = nWid * nHei;
ERRTYPE errHandler = SUCCESS;
/// 0. 若需要对碳纤维板上的杂质进行校正:
if (dmConfig.caliConfig.isCFiberPlate){
/// 0.1. 读入碳纤维板中杂质模板
if (dmConfig.caliConfig.strCFiberPlateMask.Compare(_T("")) == 0){
HEDYERRHANDLER_errLogFile(
PARAM_ERR, "Load CarbonFibreCaliMask file failed.");
return PARAM_ERR;
}
PWORD pnCaliMaskLUT = new WORD [dataLen]();
if(!HEDYDEBUG_readRaw(dmConfig.caliConfig.strCFiberPlateMask,
pnCaliMaskLUT, nWid, nHei)){
delete [] pnCaliMaskLUT;
pnCaliMaskLUT = NULL;
HEDYERRHANDLER_errLogFile(INNER_ERR, "HEDYDEBUG_readRaw");
return INNER_ERR;
}
/// 调用CarbonFibreCaliMask,生成杂质模板
errHandler = carbonFibreCaliMask(
pnCaliMaskLUT, pnCaliMaskLUT, nWid, nHei);
if(errHandler){
delete [] pnCaliMaskLUT;
pnCaliMaskLUT = NULL;
HEDYERRHANDLER_errLogFile(INNER_ERR, "CarbonFibreCaliMask");
#ifdef _DEBUG
MessageBox(
NULL,
_T("INNER_ERR:\n Error in CarbonFibreCaliMask."),
_T("Error Handler"),
MB_OK);
#endif // _DEBUG
return INNER_ERR;
}
/// 0.2. 对碳纤维模板中有杂质的部分实施双线性插值
errHandler = neighbor8Interpolation(
pInImg, pnCaliMaskLUT, nWid, nHei);
delete [] pnCaliMaskLUT;
pnCaliMaskLUT = NULL;
if(errHandler){
HEDYERRHANDLER_errLogFile(
INNER_ERR, "neighbor8Interpolation");
#ifdef _DEBUG
MessageBox(
NULL,
_T("INNER_ERR:\n Error in neighbor8Interpolation."),
_T("Error Handler"),
MB_OK);
#endif // _DEBUG
return INNER_ERR;
}
}
/// 1. 载入算法相关数据,调用API: ImportAlgoriInfo
errHandler = ImportAlgoriInfo(
pInImg, nWid, nHei,
dmConfig.algoriInfo.strVersion,
dmConfig.algoriInfo.nLevelNum,
dmConfig.algoriInfo.fDESpacing,
dmConfig.algoriInfo.fAECThres,
dmConfig.algoriInfo.fPreBkg,
dmConfig.algoriInfo.fNewBkg);
if(errHandler){
#ifdef _DEBUG
MessageBox(
NULL,
_T("INNER_ERR:\n Error in ImportAlgoriInfo."),
_T("Error Handler"),
MB_OK);
#endif // _DEBUG
return INNER_ERR;
}
/// 2. 设置预处理参数,调用API: SetPreProcPara
INT nParam = dmConfig.preProcPara.grayValueTransform.paramList.size();
PFLOAT pfParamList = new FLOAT [nParam]();
for(INT idx = 0; idx < nParam; ++idx){
pfParamList[idx] =
dmConfig.preProcPara.grayValueTransform.paramList[idx];
}
errHandler = SetPreProcPara(
dmConfig.caliConfig.isMark,
dmConfig.caliConfig.nMarkX,
dmConfig.caliConfig.nMarkY,
dmConfig.caliConfig.nMarkH,
dmConfig.caliConfig.nMarkW,
dmConfig.preProcPara.grayValueTransform.strOprType,
pfParamList);
delete [] pfParamList;
pfParamList = NULL;
if(errHandler){
#ifdef _DEBUG
MessageBox(
NULL,
_T("INNER_ERR:\n Error in SetPreProcPara."),
_T("Error Handler"),
MB_OK);
#endif // _DEBUG
return INNER_ERR;
}
/// 3.设置增强曲线参数集
INT nLev = dmConfig.algoriInfo.nLevelNum;
CString* pEnOprType =
new CString [nLev]();
PFLOAT* ppfParamList = new PFLOAT [nLev];
/****************************
* [0] pfEnEnhanceThres; *
* [1] pfEnCrossThres; *
* [2] pfEnDefectThres; *
****************************/
if(nLev != dmConfig.vLevels.size()){
for(INT l = 0; l < nLev; ++l){
pEnOprType[l].Empty();
delete [] ppfParamList[l];
ppfParamList[l] = NULL;
}
delete [] pEnOprType;
pEnOprType = NULL;
delete [] ppfParamList;
ppfParamList = NULL;
HEDYERRHANDLER_errLogFile(ARGU_ERR, "DeconPara missing.");
#ifdef _DEBUG
MessageBox(
NULL,
_T("ARGU_ERR:\n DeconPara missing."),
_T("Error Handler"),
MB_OK);
#endif // _DEBUG
return ARGU_ERR;
}
PFLOAT pfWDetails = new FLOAT [nLev]();
PFLOAT pfWDepthes = new FLOAT [nLev]();
for(INT l = 0; l < nLev; ++l){
pEnOprType[l] = dmConfig.vLevels[l].enhancePara.strEnOprType;
nParam = dmConfig.vLevels[l].enhancePara.paramList.size() - 2;
ppfParamList[l] = new FLOAT [nParam]();
for(INT idx = 0; idx < nParam; ++idx){
ppfParamList[l][idx] =
dmConfig.vLevels[l].enhancePara.paramList[idx];
}
pfWDetails[l] = dmConfig.vLevels[l].enhancePara.paramList[nParam];
pfWDepthes[l] = dmConfig.vLevels[l].enhancePara.paramList[nParam + 1];
}
errHandler = SetDeconPara(nLev, pEnOprType, ppfParamList, pfWDetails, nDetailLev);
for (INT l = 0; l < nLev; ++l){
pEnOprType[l].Empty();
delete [] ppfParamList[l];
ppfParamList[l] = NULL;
}
delete [] pEnOprType;
pEnOprType = NULL;
delete [] ppfParamList;
ppfParamList = NULL;
delete [] pfWDetails;
pfWDetails = NULL;
if(errHandler){
#ifdef _DEBUG
MessageBox(
NULL,
_T("INNER_ERR:\n Error in SetEdgeEnhancePara."),
_T("Error Handler"),
MB_OK);
#endif // _DEBUG
return INNER_ERR;
}
/// 4.设置压缩曲线参数集
CString* pCurveType = new CString [nLev]();
ppfParamList = new PFLOAT [nLev];
for(INT l = 0; l < nLev; ++l){
pCurveType[l] = dmConfig.vLevels[l].depressDCPara.strOprType;
if(pCurveType[l].Compare(_T("")) != 0){
nParam = dmConfig.vLevels[l].depressDCPara.
paramList.size();
ppfParamList[l] = new FLOAT [nParam]();
for(INT idx = 0; idx < nParam; ++idx){
ppfParamList[l][idx] = dmConfig.vLevels[l].
depressDCPara.paramList[idx];
}
}
else{
ppfParamList[l] = NULL;
}
}
errHandler = SetReconPara(
nLev, pCurveType, ppfParamList,
pfWDepthes, nDepthLev, nMicroCaLev);
for (INT l = 0; l < nLev; ++l){
pCurveType[l].Empty();
if (ppfParamList[l] != NULL){
delete [] ppfParamList[l];
ppfParamList[l] = NULL;
}
}
delete [] pCurveType;
pCurveType = NULL;
delete [] ppfParamList;
ppfParamList = NULL;
delete [] pfWDepthes;
pfWDepthes = NULL;
if(errHandler){
#ifdef _DEBUG
MessageBox(
NULL,
_T("INNER_ERR:\n Error in SetReconPara."),
_T("Error Handler"),
MB_OK);
#endif // _DEBUG
return INNER_ERR;
}
/// 5. 设置后处理参数,调用API: SetPostProcPara
nParam = dmConfig.postProcPara.paramList.size();
pfParamList = new FLOAT [nParam]();
for(INT idx = 0; idx < nParam; ++idx){
pfParamList[idx] = dmConfig.postProcPara.paramList[idx];
}
errHandler = SetPostProcPara(
dmConfig.postProcPara.strCurveType,
pfParamList);
delete [] pfParamList;
pfParamList = NULL;
if(errHandler){
#ifdef _DEBUG
MessageBox(
NULL,
_T("INNER_ERR:\n Error in SetPostProcPara."),
_T("Error Handler"),
MB_OK);
#endif // _DEBUG
return INNER_ERR;
}
/// 6. 将图像转化为16位无符号图像
errHandler = GetEnImg(pOutImg);
if(errHandler){
HEDYERRHANDLER_errLogFile(INNER_ERR, "GetEnImg");
#ifdef _DEBUG
MessageBox(
NULL,
_T("INNER_ERR:\n Error in GetEnImg."),
_T("Error Handler"),
MB_OK);
#endif // _DEBUG
return INNER_ERR;
}
return SUCCESS;
}
将这些代码转为python代码,并解释其作用