📄 rxysegment_temp.cpp
字号:
// RxySegment.cpp: implementation of the RxySegment class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "fusion.h"#include "RxySegment.h"// yeni 2004.02.11#include "filters.h"// yeni 2004.02.24.#include "ipl.h"//#include "JJBinaryVolume.h"// yeni 2004.03.19.#include "volumedata.h"#include "RxyConnectedComponent.h"#include "fusionglobal.h"// yeni 2004.05.18.#include "ProgressWnd.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif#define PATIENT_1 1#define PATIENT_2 0#define PATIENT_3 0#define PATIENT_4 0#define PATIENT_5 0#define PATIENT_6 0#define PATIENT_7 0#define PATIENT_8 0#define PATIENT_9 0#define PATIENT_10 0// 1 全扁后// 2 蜡公磊// 3 捞犁帮// 4 辫荐沥// 5 颊措牢, Float 2锅掳 辆剧 92锅掳 浇扼捞胶// 6 捞荐磊// 7 决沥巢// 8 捞篮雀, 2锅掳 巴 肋 救凳// 9 烙篮惑, 2锅掳 巴 肋 救凳// 10 捞荐康, 4锅掳 巴 肋 救凳// 全扁后#ifdef PATIENT_1#define THRESHOLD 600 #define NUM_OF_EROSION 4 #define REMOVEBACK 0.1 #define OFFSET 4#endif// 蜡公磊#ifdef PATIENT_2#define THRESHOLD 600 #define NUM_OF_EROSION 3 #define REMOVEBACK 0.137 #define OFFSET 10 #endif// 捞犁帮#ifdef PATIENT_3#define THRESHOLD 600 #define NUM_OF_EROSION 3 #define REMOVEBACK 0.15 #define OFFSET 10#endif// 辫荐沥#ifdef PATIENT_4#define THRESHOLD 600 #define NUM_OF_EROSION 3 #define REMOVEBACK 0.1#define OFFSET 10 #endif// 颊措牢#ifdef PATIENT_5#define THRESHOLD 550 #define NUM_OF_EROSION 3 #define REMOVEBACK 0.1 #define OFFSET 4#endif// 捞荐磊#ifdef PATIENT_6#define THRESHOLD 600 #define NUM_OF_EROSION 2 #define REMOVEBACK 0.15 #define OFFSET 4#endif// 决辆巢#ifdef PATIENT_7#define THRESHOLD 600 #define NUM_OF_EROSION 2 #define REMOVEBACK 0.15 #define OFFSET 4#endif// 捞篮锐#ifdef PATIENT_8#define THRESHOLD 600 #define NUM_OF_EROSION 2 #define REMOVEBACK 0.15 #define OFFSET 4#endif// 烙篮惑#ifdef PATIENT_9#define THRESHOLD 600 #define NUM_OF_EROSION 2 #define REMOVEBACK 0.15 #define OFFSET 4#endif// 捞荐康#ifdef PATIENT_10#define THRESHOLD 600 #define NUM_OF_EROSION 3 #define REMOVEBACK 0.15 #define OFFSET 4#endifCQ::CQ(int MaxCount){ m_nMaxElement=MaxCount; m_pQElement = (int *)malloc(m_nMaxElement*sizeof(int)*0.2); m_nIndexEnqueue =0; m_nIndexDequeue =0;}CQ::~CQ(){ free(m_pQElement);}void CQ::Clear(){ m_nIndexEnqueue =0; m_nIndexDequeue =0;}void CQ::Enqueue(int nIndex){ m_pQElement[m_nIndexEnqueue++]=nIndex; }int CQ::Dequeue(){ return(m_pQElement[m_nIndexDequeue++]);}bool CQ::IsEmpty(){ return(m_nIndexEnqueue == m_nIndexDequeue);}bool CQ::IsFull(){ return(m_nIndexEnqueue>=m_nMaxElement);}//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////RxySegment::RxySegment(){ // yeni 2004.03.19. m_pLabel = NULL; m_ptSeed = NULL;}RxySegment::~RxySegment(){}BOOL RxySegment::SRG2D_MinMax( float SeedX, float SeedY, unsigned short *pImg, BYTE *pLabel, int nWidth, int nHeight, int nMin, int nMax ) { int nSliceSize = nWidth*nHeight; if(SeedX<0 || SeedX>=nWidth|| SeedY<0 || SeedY>=nHeight ) { TRACE(_T("return FALSE\n")); return FALSE; } CQ Q(nSliceSize); BOOL bRet = FALSE; int nIndex = SeedX+SeedY*nWidth; unsigned short nData = pImg[nIndex]; int nValue = 255; if((pLabel[nIndex]==0) && (nData>=nMin && nData<=nMax)){ Q.Enqueue(nIndex); // seed point啊 烙拌摹 捞郴捞搁 q 俊 涝仿 (Seed 犬厘) bRet = TRUE; } else { TRACE(_T("out of threshold range\n")); return bRet; } do{ nIndex = Q.Dequeue();// Seed 痢阑 罐绰促. int x_pos = (nIndex%(nSliceSize))%nWidth; int y_pos = (nIndex%(nSliceSize))/nWidth; int nXIndex = (nIndex%(nSliceSize))%nWidth; // current row俊辑 割锅掳 牢郸胶牢啊 int nYIndex = nIndex%(nSliceSize)-nXIndex; // current slice俊辑 previous row鳖瘤狼 牢郸胶 bool bTop_Connectivity = false; bool bBottom_Connectivity = false; bool bTop_Check = true; bool bBottom_Check = true; if(y_pos <= 0) bTop_Check = false; if(y_pos >= nHeight) bBottom_Check = false; for(int x=x_pos;x>=0;x--){ int nIndexNeighbor = nYIndex+x; if(pLabel[nIndexNeighbor]!=0/* && pLabel[nZIndex+nIndexNeighbor]!=HALF_MARK_LABEL*/){ break; } nData = pImg[nIndexNeighbor]; if((nMin<=nData) && (nData<=nMax)){ pLabel[nIndexNeighbor]=nValue; //弊 痢俊 饭捞喉阑 霖促. if(bTop_Check){ int nRefIndex = nIndexNeighbor - nWidth; // top neighbor if( pLabel[nRefIndex]==0 ){ int nRefData = pImg[nRefIndex]; if((nMin<=nRefData) && (nRefData<=nMax)){ // threshold裹困 郴俊 乐栏搁 if(!bTop_Connectivity){ Q.Enqueue(nRefIndex); bTop_Connectivity = true; } } else bTop_Connectivity = false; } else bTop_Connectivity = false; } if(bBottom_Check){ int nRefIndex = nIndexNeighbor + nWidth; // bottom neighbor if( pLabel[nRefIndex]==0 ){ int nRefData = pImg[nRefIndex]; if((nMin<=nRefData) && (nRefData<=nMax)){ // threshold裹困 郴俊 乐栏搁 if(!bBottom_Connectivity){ Q.Enqueue(nRefIndex); bBottom_Connectivity = true; } } else bBottom_Connectivity = false; } else bBottom_Connectivity = false; } } else break; } bTop_Connectivity = bBottom_Connectivity = false; for(x=x_pos+1;x<=nWidth;x++){ int nIndexNeighbor = nYIndex+x; if(pLabel[nIndexNeighbor]!=0 ){ break; } nData = pImg[nIndexNeighbor]; if((nMin<=nData) && (nData<=nMax)){ pLabel[nIndexNeighbor]=nValue; //弊 痢俊 饭捞喉阑 霖促. if(bTop_Check){ int nRefIndex = nIndexNeighbor - nWidth; if( pLabel[nRefIndex]==0 ){ int nRefData = pImg[nRefIndex]; if((nMin<=nRefData) && (nRefData<=nMax)){ if(!bTop_Connectivity){ Q.Enqueue(nRefIndex); bTop_Connectivity = true; } } else bTop_Connectivity = false; } else bTop_Connectivity = false; } if(bBottom_Check){ int nRefIndex = nIndexNeighbor + nWidth; if( pLabel[nRefIndex]==0 ){ int nRefData = pImg[nRefIndex]; if((nMin<=nRefData) && (nRefData<=nMax)){ if(!bBottom_Connectivity){ Q.Enqueue(nRefIndex); bBottom_Connectivity = true; } } else bBottom_Connectivity = false; } else bBottom_Connectivity = false; } } else break; } }while(!Q.IsEmpty()); // Q俊 甸绢埃 point啊 家柳瞪 锭鳖瘤 return bRet;}////////////////////////////////////// 3D seeded region growing// added in 2004. 02. 04 ////////////////////////////////////BOOL RxySegment::SRG3D_LineMinMax(float SeedX, float SeedY, float SeedZ, unsigned short *pImg, BYTE *pLabel, int nWidth, int nHeight, int iSliceCnt, int nMin, int nMax ) { TRACE(_T("Start SRG3D_LineMinMax!\n")); int nSliceSize = nWidth*nHeight; int nVolSize = iSliceCnt*nSliceSize; if(SeedX<0 || SeedX>nWidth-1 || SeedY<0 || SeedY>nHeight-1 || SeedZ<0 || SeedZ>iSliceCnt-1) { TRACE(_T("return FALSE\n")); return FALSE; } CQ Q(nVolSize); BOOL bRet = FALSE; int nIndex = SeedX+SeedY*nWidth+SeedZ*nSliceSize; unsigned short nData = pImg[nIndex]; int nValue = 255; if((pLabel[nIndex]==0) && (nData>=nMin && nData<=nMax)){ Q.Enqueue(nIndex); // seed point啊 烙拌摹 捞郴捞搁 q 俊 涝仿 (Seed 犬厘) bRet = TRUE; } else { TRACE(_T("out of threshold range\n")); return bRet; } do{ nIndex = Q.Dequeue();// Seed 痢阑 罐绰促. int x_pos = (nIndex%nSliceSize)%nWidth; int y_pos = (nIndex%nSliceSize)/nWidth; int z_pos = nIndex/nSliceSize; int nXIndex = (nIndex%nSliceSize)%nWidth; // current row俊辑 割锅掳 牢郸胶牢啊 int nYIndex = nIndex%nSliceSize-nXIndex; // current slice俊辑 previous row鳖瘤狼 牢郸胶 int nZIndex = nIndex-nYIndex-nXIndex; // previous slice鳖瘤狼 牢郸胶 int nZUpIndex = nZIndex-nSliceSize; // nZIndex俊 slice茄厘父怒 牢郸胶 力寇 int nZDownIndex = nZIndex+nSliceSize; // nZIndex俊 slice茄厘父怒 牢郸胶 眠啊 if(z_pos < 0) continue; if(z_pos > iSliceCnt-1) continue; bool bTop_Connectivity = false; bool bBottom_Connectivity = false; bool bUp_Connectivity = false; bool bDown_Connectivity = false; bool bTop_Check = true; bool bBottom_Check = true; bool bUp_Check = true; bool bDown_Check = true; if(y_pos <= 0) bTop_Check = false; if(y_pos >= nHeight-1) bBottom_Check = false; if(z_pos <= 0) bUp_Check = false; if(z_pos >= iSliceCnt-1) bDown_Check = false; for(int x=x_pos;x>=0;x--){ int nIndexNeighbor = nYIndex+x; if( pLabel[nZIndex+nIndexNeighbor]!=0 ){ break; } nData = pImg[nZIndex+nIndexNeighbor]; if((nMin<=nData) && (nData<=nMax)){ pLabel[nZIndex+nIndexNeighbor]=nValue; //弊 痢俊 饭捞喉阑 霖促. if(bTop_Check){ int nRefIndex = nIndexNeighbor - nWidth; // top neighbor if(pLabel[nZIndex+nRefIndex]==0 ){ int nRefData = pImg[nZIndex+nRefIndex]; if((nMin<=nRefData) && (nRefData<=nMax)){ // threshold裹困 郴俊 乐栏搁 if(!bTop_Connectivity){ Q.Enqueue(nZIndex+nRefIndex); bTop_Connectivity = true; } } else bTop_Connectivity = false; } else bTop_Connectivity = false; } if(bBottom_Check){ int nRefIndex = nIndexNeighbor + nWidth; // bottom neighbor if(pLabel[nZIndex+nRefIndex]==0 ){ int nRefData = pImg[nZIndex+nRefIndex]; if((nMin<=nRefData) && (nRefData<=nMax)){ // threshold裹困 郴俊 乐栏搁 if(!bBottom_Connectivity){ Q.Enqueue(nZIndex+nRefIndex); bBottom_Connectivity = true; } } else bBottom_Connectivity = false; } else bBottom_Connectivity = false; } if(bUp_Check){ if(pLabel[nZUpIndex+nIndexNeighbor]==0 ){ int nRefData = pImg[nZUpIndex+nIndexNeighbor]; if((nMin<=nRefData) && (nRefData<=nMax)){ // threshold裹困 郴俊 乐栏搁 if(!bUp_Connectivity){ Q.Enqueue(nZUpIndex+nIndexNeighbor); bUp_Connectivity = true; } } else bUp_Connectivity = false; } else bUp_Connectivity = false; } if(bDown_Check){ if(pLabel[nZDownIndex+nIndexNeighbor]==0 ){ int nRefData = pImg[nZDownIndex+nIndexNeighbor]; if((nMin<=nRefData) && (nRefData<=nMax)){ // threshold裹困 郴俊 乐栏搁 if(!bDown_Connectivity){ Q.Enqueue(nZDownIndex+nIndexNeighbor); bDown_Connectivity = true; } } else bDown_Connectivity = false; } else bDown_Connectivity = false; } } else break; } bUp_Connectivity = bDown_Connectivity = bTop_Connectivity = bBottom_Connectivity = false; for(x=x_pos+1;x<nWidth;x++){ int nIndexNeighbor = nYIndex+x; if(pLabel[nZIndex+nIndexNeighbor]!=0 ){ break; } nData = pImg[nZIndex+nIndexNeighbor]; if((nMin<=nData) && (nData<=nMax)){ pLabel[nZIndex+nIndexNeighbor]=nValue; //弊 痢俊 饭捞喉阑 霖促. if(bTop_Check){ int nRefIndex = nIndexNeighbor - nWidth; if( pLabel[nZIndex+nRefIndex]==0 ){ int nRefData = pImg[nZIndex+nRefIndex]; if((nMin<=nRefData) && (nRefData<=nMax)){ if(!bTop_Connectivity){ Q.Enqueue(nZIndex+nRefIndex); bTop_Connectivity = true; } } else bTop_Connectivity = false; } else bTop_Connectivity = false; } if(bBottom_Check){ int nRefIndex = nIndexNeighbor + nWidth; if(pLabel[nZIndex+nRefIndex]==0 ){ int nRefData = pImg[nZIndex+nRefIndex]; if((nMin<=nRefData) && (nRefData<=nMax)){ if(!bBottom_Connectivity){ Q.Enqueue(nZIndex+nRefIndex);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -