⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spectrum.cpp

📁 3D reconstruction, medical image processing from colons, using intel image processing for based clas
💻 CPP
字号:
#include "StdAfx.h"#include <xmmintrin.h>#include <malloc.h>#include <math.h>#include "Spectrum.h"static const int MIN_DENSITY=0;static const int MAX_DENSITY=4095;static const int CACHESIZE=32;RxSpectrum::RxSpectrum(){	m_pTable = (__m128*)_mm_malloc(DENSITY_RANGE*16, CACHESIZE);	m_pMPRTable = (__m128*)_mm_malloc(DENSITY_RANGE*16, CACHESIZE);	m_nVolumeNum = 0;}RxSpectrum::~RxSpectrum(){	_mm_free(m_pTable);	_mm_free(m_pMPRTable);}void RxSpectrum::Initialize(int nStart, int nEnd){	// do nothing	ASSERT(nEnd == nStart+DENSITY_RANGE-1);	m_nVolumeNum = 0;}// fcolor : b, g, r, avoid RxSpectrum::SetVolumeInfo(short nDensityValue[4], float fColor[13]){	ASSERT(IsInputValid(nDensityValue, fColor));	for(int i=0; i<4; i++) 		m_pVolumeInfo[m_nVolumeNum].m_nDensityValue[i] = nDensityValue[i];	for( i=0; i<13; i++) 		m_pVolumeInfo[m_nVolumeNum].m_fColor[i] = fColor[i];		m_nVolumeNum++;}// 2001.11.17. density狼 裹困啊 MIN_DENSITY,MAX_DENSITY俊 乐瘤 臼酒档 登档废BOOL RxSpectrum::IsInputValid(short nDensityValue[4], float fColor[4]){	int i;	for(i=0; i<4; i++) {//		if(MIN_DENSITY <= nDensityValue[i] && nDensityValue[i] <= MAX_DENSITY) {//		} else {//			return FALSE;//		};		if(0.0f <= fColor[i] && fColor[i] <= 1.0f) {		} else {			return FALSE;		}	}	for(i=0; i<3; i++) {		if(nDensityValue[i] <= nDensityValue[i+1]) {		} else {			return FALSE;		}	}	return TRUE;}BOOL inline RxSpectrum::InRange(int density){	return (MIN_DENSITY <= density && density <= MAX_DENSITY);}// alpha甫 拌魂秦辑 table阑 积己茄饶 color甫 饶俊 蚌茄促./*               ........        *              /        \       *         ..../          \..... *            p1 p2     p3 p4    */// color绰 mem俊 alpha, bb, gg, rr狼 鉴栏肺 涝仿 : note曼绊.void RxSpectrum::MakeDensityTable(){	int		i,j;	float	fLengthInverse;	float color[12];	float deltaC[2][3];	float fAlpha;	__m128	vDeltaWeight;	__m128	vWeight;	__m128	vColor;	__m128  *pTable = NULL;	__m128	vMaxAlpha[DENSITY_RANGE];	float bb,gg,rr;		for(int count=0; count<2; count++) {		if(count==0) { // mpr table父甸扁			pTable = m_pMPRTable;		} else { // rendering table父甸扁			pTable = m_pTable;		}		memset(pTable, 0, DENSITY_RANGE*16);		memset(vMaxAlpha, 0 , DENSITY_RANGE*16);		// for each volume		for(i=0; i<m_nVolumeNum; i++) {			fAlpha = (count == 0)?m_pVolumeInfo[i].m_fColor[12]: m_pVolumeInfo[i].m_fColor[12]*m_pVolumeInfo[i].m_fColor[12];			for(j=0; j<12; j++) 				color[j]= m_pVolumeInfo[i].m_fColor[j] * fAlpha ; 			// p1....p2			if(m_pVolumeInfo[i].m_nDensityValue[1] != m_pVolumeInfo[i].m_nDensityValue[0])				fLengthInverse = 1.0f / (float)(m_pVolumeInfo[i].m_nDensityValue[1] - m_pVolumeInfo[i].m_nDensityValue[0]);			else				fLengthInverse = 0.0f;			vDeltaWeight	= _mm_set_ps1(fLengthInverse);			vWeight			= _mm_setzero_ps();			int pos=0;			for(j=0; j<3; j++) 				deltaC[0][j]=color[pos++]*fLengthInverse;						for(j=0; j<3; j++) 				deltaC[1][j]=color[pos++]*fLengthInverse;						bb = color[0];			gg = color[1];			rr = color[2];			for(j=m_pVolumeInfo[i].m_nDensityValue[0]; j<m_pVolumeInfo[i].m_nDensityValue[1]; j++) {				vWeight = _mm_add_ps(vWeight, vDeltaWeight);								//tykim				vColor = _mm_set_ps(rr, gg, bb, fAlpha);		// r,g,b,1				bb=bb-deltaC[0][0]+deltaC[1][0];				gg=gg-deltaC[0][1]+deltaC[1][1];				rr=rr-deltaC[0][2]+deltaC[1][2];				__m128 vResultColor = _mm_mul_ps(vColor, vWeight);				if(InRange(j)) {					pTable[j] = _mm_add_ps(pTable[j], vResultColor);					vMaxAlpha[j] = _mm_max_ss(vMaxAlpha[j], vResultColor); // ss档 惑包 绝促.				}			}			if(m_pVolumeInfo[i].m_nDensityValue[2] != m_pVolumeInfo[i].m_nDensityValue[1])				fLengthInverse = 1.0f / (float)(m_pVolumeInfo[i].m_nDensityValue[2] - m_pVolumeInfo[i].m_nDensityValue[1]);			else				fLengthInverse = 0.0f;			//tykim			pos=3;			for(j=0; j<3; j++) 				deltaC[0][j]=color[pos++]*fLengthInverse;						for(j=0; j<3; j++) 				deltaC[1][j]=color[pos++]*fLengthInverse;									bb = color[3];			gg = color[4];			rr = color[5];			// p2....p3			for(j=m_pVolumeInfo[i].m_nDensityValue[1]; j<m_pVolumeInfo[i].m_nDensityValue[2]; j++) {				__m128 vResultColor = vColor;				//tykim				vResultColor = _mm_set_ps(rr, gg, bb, fAlpha);		// r,g,b,1				bb=bb-deltaC[0][0]+deltaC[1][0];				gg=gg-deltaC[0][1]+deltaC[1][1];				rr=rr-deltaC[0][2]+deltaC[1][2];				if(InRange(j)) {					pTable[j] = _mm_add_ps(pTable[j], vResultColor);					vMaxAlpha[j] = _mm_max_ss(vMaxAlpha[j], vResultColor); // ss档 惑包 绝促				}			}			// p3....p4			if(m_pVolumeInfo[i].m_nDensityValue[2] != m_pVolumeInfo[i].m_nDensityValue[3])				fLengthInverse = 1.0f / (float)(m_pVolumeInfo[i].m_nDensityValue[3] - m_pVolumeInfo[i].m_nDensityValue[2]);			else				fLengthInverse = 0.0f;			vDeltaWeight	= _mm_set_ps1(fLengthInverse);			vWeight			= _mm_set_ps1(1.0f);			pos=6;			for(j=0; j<3; j++) 				deltaC[0][j]=color[pos++]*fLengthInverse;						for(j=0; j<3; j++) 				deltaC[1][j]=color[pos++]*fLengthInverse;			bb = color[6];			gg = color[7];			rr = color[8];			for(j=m_pVolumeInfo[i].m_nDensityValue[2]; j<m_pVolumeInfo[i].m_nDensityValue[3]; j++) {							vColor = _mm_set_ps(rr, gg, bb, fAlpha);		// r,g,b,1				vWeight = _mm_sub_ps(vWeight, vDeltaWeight);				__m128 vResultColor = _mm_mul_ps(vColor, vWeight);				bb=bb-deltaC[0][0]+deltaC[1][0];				gg=gg-deltaC[0][1]+deltaC[1][1];				rr=rr-deltaC[0][2]+deltaC[1][2];				if(InRange(j)) {					pTable[j] = _mm_add_ps(pTable[j], vResultColor);					vMaxAlpha[j] = _mm_max_ss(vMaxAlpha[j], vResultColor); // ss档 惑包 绝促				}			}		}		// prefetch nta		for(i=0; i<=MAX_DENSITY-MIN_DENSITY; i++) {			int bEq = _mm_comigt_ss(pTable[i], _mm_setzero_ps());			if(bEq) {				__m128 vInvAlpha = _mm_rcp_ss(pTable[i]);				vInvAlpha = _mm_mul_ss(vInvAlpha, vMaxAlpha[i]);				vInvAlpha = _mm_shuffle_ps(vInvAlpha, vInvAlpha, 0);				pTable[i] = _mm_mul_ps(pTable[i], vInvAlpha);			}		}	} // end of two table}// return value: RGBQuad(bb,gg,rr,reserved)unsigned int RxSpectrum::GetDIBColor(int nDensity){	// 0-1	__m128 vColor = m_pMPRTable[nDensity];	// 0-255	vColor = _mm_mul_ps(vColor, _mm_set_ps1(255.0f));	// convert to __m64	__m64 v64Color = _mm_packs_pu16(_mm_cvtps_pi16(vColor), _mm_setzero_si64());	// convert to unsigned int (not signed int)	unsigned int iABGRColor = (unsigned int)_mm_cvtsi64_si32(v64Color);	unsigned int iBGRAColor = (iABGRColor << 24) | (iABGRColor >> 8);	// don't care alpha	_mm_empty();									// don't remove (255.0f)	return iBGRAColor;}/*// 0 <= nWindowingValue <= 255unsigned int RxSpectrum::GetDIBColor(int nDensity, int nWindowingValue){	// 0-1	__m128 vColor = m_pMPRTable[nDensity];	// 0-255	vColor = _mm_mul_ps(vColor, _mm_set_ps1((float)nWindowingValue));	// convert to __m64	__m64 v64Color = _mm_packs_pu16(_mm_cvtps_pi16(vColor), _mm_setzero_si64());	// convert to unsigned int (not signed int)	unsigned int iABGRColor = (unsigned int)_mm_cvtsi64_si32(v64Color);	unsigned int iBGRAColor = (iABGRColor << 24) | (iABGRColor >> 8);	// don't care alpha	_mm_empty();									// don't remove (255.0f)	return iBGRAColor;}*/unsigned int RxSpectrum::GetInterpolatedDIBColor(int nDensity1, int nDensity2, float fWeight1, float fWeight2){	__m128 vColor1 = m_pMPRTable[nDensity1];	__m128 vColor2 = m_pMPRTable[nDensity2];	__m128 vWeight1 = _mm_set_ss(fWeight1);	__m128 vWeight2 = _mm_set_ss(fWeight2);	__m128 vWeight = _mm_add_ss(vWeight1, vWeight2);	vWeight1 = _mm_shuffle_ps(vWeight1, vWeight1, 0);	vWeight2 = _mm_shuffle_ps(vWeight2, vWeight2, 0);	__m128 vWeightInverse = _mm_rcp_ss(vWeight);	vWeightInverse = _mm_mul_ss(vWeightInverse, _mm_set_ss(255.0f));	vWeightInverse = _mm_shuffle_ps(vWeightInverse, vWeightInverse, 0);	vColor1 = _mm_mul_ps(vColor1, vWeight2);	vColor2 = _mm_mul_ps(vColor2, vWeight1);	// weighted sum	__m128 vColor = _mm_add_ps(vColor1, vColor2);	// 0 - 255.0f	vColor = _mm_mul_ps(vColor, vWeightInverse);	vColor = _mm_shuffle_ps(vColor, vColor, _MM_SHUFFLE(0, 1, 2, 3));	// color啊 捞惑窍搁 捞巴阑 官层杭 巴	__m64 v32Color = _mm_packs_pu16 (_mm_cvtps_pi16(vColor), _mm_setzero_si64());	unsigned int nRetval = _mm_cvtsi64_si32(v32Color);	_mm_empty();	return nRetval;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -