📄 chenimage.cpp
字号:
return GOOD_RETURN;
}
else
{
if (pBlock1)
delete [] pBlock1;
if (pBlock2)
delete [] pBlock2;
if (pBlockRes)
delete [] pBlockRes;
if (pBlockResAbs)
delete [] pBlockResAbs;
return BAD_RETURN;
}
#endif
}
int ChenImage_imageBlockMatch1DDoubleHypothesisAdd(const int nWidth, const int nHeight, const int nBlockSize, const int nMaxShift, const short* pSrc1, const short* pSrc2, const short* pSrc3, const float* pWeights, short* pShifted, short* pResidual, short* pShifts1, short* pShifts2)
{
#ifdef _USEIPP
bool bSuccess = true;
// Initialize
int nBlockRows = nHeight / nBlockSize;
int nBlockCols = nWidth / nBlockSize;
int nBlockElems = nBlockSize * nBlockSize;
short* pBlock1 = new short[nBlockElems];
short* pBlock2 = new short[nBlockElems];
short* pBlock3 = new short[nBlockElems];
short* pBlockComb = new short[nBlockElems];
short* pBlockRes = new short[nBlockElems];
short* pBlockResAbs = new short[nBlockElems];
float* pBlock2F = new float[nBlockElems];
float* pBlock3F = new float[nBlockElems];
float* pBlockCombF = new float[nBlockElems];
// Copy src 2 into output by default
int nSrcStep = nWidth * sizeof(short);
int nDstStep = nWidth * sizeof(short);
IppiSize roiSize = {nWidth, nHeight};
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pSrc2, nSrcStep, (Ipp16s*)pShifted, nDstStep, roiSize), bSuccess );
// Iterate across all blocks
double dMinResAbsSum;
int nSrc1StartCol, nSrc1StartRow, nSrc2StartCol, nSrc2StartRow, nSrc3StartCol, nSrc3StartRow;
roiSize.width = nBlockSize;
roiSize.height = nBlockSize;
for (int nBlockRow = 0; nBlockRow < nBlockRows; nBlockRow++) {
for (int nBlockCol = 0; nBlockCol < nBlockCols; nBlockCol++) {
int nBlock = nBlockRow*nBlockCols + nBlockCol;
dMinResAbsSum = LARGE;
nSrc1StartCol = nBlockSize * nBlockCol;
nSrc1StartRow = nBlockSize * nBlockRow;
// Copy block from image X
nSrcStep = nWidth * sizeof(short);
nDstStep = nBlockSize * sizeof(short);
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc1 + nSrc1StartRow*nWidth + nSrc1StartCol), nSrcStep, (Ipp16s*)pBlock1, nDstStep, roiSize), bSuccess );
// Iterate across all local horizontal shifts for Y1 and Y2
nSrc2StartRow = nSrc1StartRow;
nSrc3StartRow = nSrc1StartRow;
for (nSrc2StartCol = MAX(0,nSrc1StartCol-nMaxShift); nSrc2StartCol <= MIN(nSrc1StartCol+nMaxShift,nWidth-nBlockSize); nSrc2StartCol++) {
for (nSrc3StartCol = MAX(0,nSrc1StartCol-nMaxShift); nSrc3StartCol <= MIN(nSrc1StartCol+nMaxShift,nWidth-nBlockSize); nSrc3StartCol++) {
// Copy blocks from Y1 and Y2
nSrcStep = nWidth * sizeof(short);
nDstStep = nBlockSize * sizeof(short);
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc2 + nSrc2StartRow*nWidth + nSrc2StartCol), nSrcStep, (Ipp16s*)pBlock2, nDstStep, roiSize), bSuccess );
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc3 + nSrc3StartRow*nWidth + nSrc3StartCol), nSrcStep, (Ipp16s*)pBlock3, nDstStep, roiSize), bSuccess );
// Form combination block in a1*Y1 + a2*Y2
nSrcStep = nBlockSize * sizeof(short);
nDstStep = nBlockSize * sizeof(float);
RECORD_IPP_SUCCESS( ippiConvert_16s32f_C1R((const Ipp16s*)pBlock2, nSrcStep, (Ipp32f*)pBlock2F, nDstStep, roiSize), bSuccess );
RECORD_IPP_SUCCESS( ippiConvert_16s32f_C1R((const Ipp16s*)pBlock3, nSrcStep, (Ipp32f*)pBlock3F, nDstStep, roiSize), bSuccess );
RECORD_IPP_SUCCESS( ippiMulC_32f_C1IR(pWeights[0], (Ipp32f*)pBlock2F, nDstStep, roiSize), bSuccess );
RECORD_IPP_SUCCESS( ippiMulC_32f_C1IR(pWeights[1], (Ipp32f*)pBlock3F, nDstStep, roiSize), bSuccess );
nSrcStep = nBlockSize * sizeof(float);
nDstStep = nBlockSize * sizeof(float);
RECORD_IPP_SUCCESS( ippiAdd_32f_C1R((const Ipp32f*)pBlock2F, nSrcStep, (const Ipp32f*)pBlock3F, nSrcStep, (Ipp32f*)pBlockCombF, nDstStep, roiSize), bSuccess );
nSrcStep = nBlockSize * sizeof(float);
nDstStep = nBlockSize * sizeof(short);
IppRoundMode rndMode = ippRndNear;
RECORD_IPP_SUCCESS( ippiConvert_32f16s_C1R((const Ipp32f*)pBlockCombF, nSrcStep, (Ipp16s*)pBlockComb, nDstStep, roiSize, rndMode), bSuccess );
// Create residual block
nSrcStep = nBlockSize * sizeof(short);
nDstStep = nBlockSize * sizeof(short);
int nScaleFactor = 0;
RECORD_IPP_SUCCESS( ippiSub_16s_C1RSfs((const Ipp16s*)pBlockComb, nSrcStep, (const Ipp16s*)pBlock1, nSrcStep, (Ipp16s*)pBlockRes, nDstStep, roiSize, nScaleFactor), bSuccess );
// Calculate sum of absolute residuals
double dResAbsSum;
nSrcStep = nBlockSize * sizeof(short);
nDstStep = nBlockSize * sizeof(short);
RECORD_IPP_SUCCESS( ippiAbs_16s_C1R((const Ipp16s*)pBlockRes, nSrcStep, (Ipp16s*)pBlockResAbs, nDstStep, roiSize), bSuccess );
RECORD_IPP_SUCCESS( ippiSum_16s_C1R((const Ipp16s*)pBlockResAbs, nSrcStep, roiSize, &dResAbsSum), bSuccess );
// Compare with previous min sum of absolute residuals
if (dResAbsSum < dMinResAbsSum) {
dMinResAbsSum = dResAbsSum;
// Copy shifted block into output image
nSrcStep = nBlockSize * sizeof(short);
nDstStep = nWidth * sizeof(short);
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pBlockComb, nSrcStep, (Ipp16s*)(pShifted + nSrc1StartRow*nWidth + nSrc1StartCol), nDstStep, roiSize), bSuccess );
// Copy block residual into output residual image
nSrcStep = nBlockSize * sizeof(short);
nDstStep = nWidth * sizeof(short);
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pBlockRes, nSrcStep, (Ipp16s*)(pResidual + nSrc1StartRow*nWidth + nSrc1StartCol), nDstStep, roiSize), bSuccess );
// Record optimal shift value
if (pShifts1 != NULL) {
pShifts1[nBlock] = nSrc2StartCol - nSrc1StartCol;
}
if (pShifts2 != NULL) {
pShifts2[nBlock] = nSrc3StartCol - nSrc1StartCol;
}
} // end if
} // end nSrc3StartCol
} // end nSrc2StartCol
} // end nBlockCol
} // end nBlockRow
delete [] pBlock1;
delete [] pBlock2;
delete [] pBlock3;
delete [] pBlockRes;
delete [] pBlockComb;
delete [] pBlock2F;
delete [] pBlock3F;
delete [] pBlockCombF;
return bSuccess ? GOOD_RETURN : BAD_RETURN;
#else
return BAD_RETURN;
#endif
}
int ChenImage_imageBlockMatch1DDoubleHypothesisSwitch(const int nWidth, const int nHeight, const int nBlockSize, const int nMaxShift, const short* pSrc1, const short* pSrc2, const short* pSrc3, short* pShiftedImg, short* pResidual, short* pShifts1, short* pShifts2)
{
#ifdef _USEIPP
bool bSuccess = true;
// Initialize
int nBlockRows = nHeight / nBlockSize;
int nBlockCols = nWidth / nBlockSize;
int nBlockElems = nBlockSize * nBlockSize;
short* pBlock1 = new short[nBlockElems];
short* pBlock2 = new short[nBlockElems];
short* pBlock3 = new short[nBlockElems];
short* pBlockComb = new short[nBlockElems];
short* pBlockRes2 = new short[nBlockElems];
short* pBlockResAbs2 = new short[nBlockElems];
short* pBlockRes3 = new short[nBlockElems];
short* pBlockResAbs3 = new short[nBlockElems];
// Copy src 2 into output by default
int nSrcStep = nWidth * sizeof(short);
int nDstStep = nWidth * sizeof(short);
IppiSize roiSize = {nWidth, nHeight};
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pSrc2, nSrcStep, (Ipp16s*)pShiftedImg, nDstStep, roiSize), bSuccess );
RECORD_IPP_SUCCESS( ippsSet_16s(-nMaxShift-1, (Ipp16s*)pShifts1, nBlockRows*nBlockCols), bSuccess );
RECORD_IPP_SUCCESS( ippsSet_16s(-nMaxShift-1, (Ipp16s*)pShifts2, nBlockRows*nBlockCols), bSuccess );
// Iterate across all blocks
double dMinResAbsSum;
int nSrc1StartCol, nSrc1StartRow, nSrc2StartCol, nSrc2StartRow, nSrc3StartCol, nSrc3StartRow;
roiSize.width = nBlockSize;
roiSize.height = nBlockSize;
for (int nBlockRow = 0; nBlockRow < nBlockRows; nBlockRow++) {
for (int nBlockCol = 0; nBlockCol < nBlockCols; nBlockCol++) {
int nBlock = nBlockRow*nBlockCols + nBlockCol;
dMinResAbsSum = LARGE;
nSrc1StartCol = nBlockSize * nBlockCol;
nSrc1StartRow = nBlockSize * nBlockRow;
// Copy block from image X
nSrcStep = nWidth * sizeof(short);
nDstStep = nBlockSize * sizeof(short);
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc1 + nSrc1StartRow*nWidth + nSrc1StartCol), nSrcStep, (Ipp16s*)pBlock1, nDstStep, roiSize), bSuccess );
// Iterate across all local horizontal shifts for Y1 and Y2
nSrc2StartRow = nSrc1StartRow;
nSrc3StartRow = nSrc1StartRow;
for (nSrc2StartCol = MAX(0,nSrc1StartCol-nMaxShift); nSrc2StartCol <= MIN(nSrc1StartCol+nMaxShift,nWidth-nBlockSize); nSrc2StartCol++) {
nSrc3StartCol = nSrc2StartCol;
// Copy blocks from Y1 and Y2
nSrcStep = nWidth * sizeof(short);
nDstStep = nBlockSize * sizeof(short);
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc2 + nSrc2StartRow*nWidth + nSrc2StartCol), nSrcStep, (Ipp16s*)pBlock2, nDstStep, roiSize), bSuccess );
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc3 + nSrc3StartRow*nWidth + nSrc3StartCol), nSrcStep, (Ipp16s*)pBlock3, nDstStep, roiSize), bSuccess );
// Create residual blocks
nSrcStep = nBlockSize * sizeof(short);
nDstStep = nBlockSize * sizeof(short);
int nScaleFactor = 0;
RECORD_IPP_SUCCESS( ippiSub_16s_C1RSfs((const Ipp16s*)pBlock2, nSrcStep, (const Ipp16s*)pBlock1, nSrcStep, (Ipp16s*)pBlockRes2, nDstStep, roiSize, nScaleFactor), bSuccess );
RECORD_IPP_SUCCESS( ippiSub_16s_C1RSfs((const Ipp16s*)pBlock3, nSrcStep, (const Ipp16s*)pBlock1, nSrcStep, (Ipp16s*)pBlockRes3, nDstStep, roiSize, nScaleFactor), bSuccess );
// Calculate sum of absolute residuals
double dResAbsSum2, dResAbsSum3;
nSrcStep = nBlockSize * sizeof(short);
nDstStep = nBlockSize * sizeof(short);
RECORD_IPP_SUCCESS( ippiAbs_16s_C1R((const Ipp16s*)pBlockRes2, nSrcStep, (Ipp16s*)pBlockResAbs2, nDstStep, roiSize), bSuccess );
RECORD_IPP_SUCCESS( ippiSum_16s_C1R((const Ipp16s*)pBlockResAbs2, nSrcStep, roiSize, &dResAbsSum2), bSuccess );
RECORD_IPP_SUCCESS( ippiAbs_16s_C1R((const Ipp16s*)pBlockRes3, nSrcStep, (Ipp16s*)pBlockResAbs3, nDstStep, roiSize), bSuccess );
RECORD_IPP_SUCCESS( ippiSum_16s_C1R((const Ipp16s*)pBlockResAbs3, nSrcStep, roiSize, &dResAbsSum3), bSuccess );
// Compare with previous min sum of absolute residuals
if (MIN(dResAbsSum2, dResAbsSum3) < dMinResAbsSum) {
dMinResAbsSum = MIN(dResAbsSum2, dResAbsSum3);
if (dResAbsSum2 < dResAbsSum3) {
// Copy shifted block into output image
nSrcStep = nBlockSize * sizeof(short);
nDstStep = nWidth * sizeof(short);
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pBlock2, nSrcStep, (Ipp16s*)(pShiftedImg + nSrc1StartRow*nWidth + nSrc1StartCol), nDstStep, roiSize), bSuccess );
// Copy block residual into output residual image
nSrcStep = nBlockSize * sizeof(short);
nDstStep = nWidth * sizeof(short);
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pBlockRes2, nSrcStep, (Ipp16s*)(pResidual + nSrc1StartRow*nWidth + nSrc1StartCol), nDstStep, roiSize), bSuccess );
// Record optimal shift value
if (pShifts1 != NULL) {
pShifts1[nBlock] = nSrc2StartCol - nSrc1StartCol;
pShifts2[nBlock] = -nMaxShift - 1;
}
}
else {
// Copy shifted block into output image
nSrcStep = nBlockSize * sizeof(short);
nDstStep = nWidth * sizeof(short);
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pBlock3, nSrcStep, (Ipp16s*)(pShiftedImg + nSrc1StartRow*nWidth + nSrc1StartCol), nDstStep, roiSize), bSuccess );
// Copy block residual into output residual image
nSrcStep = nBlockSize * sizeof(short);
nDstStep = nWidth * sizeof(short);
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pBlockRes3, nSrcStep, (Ipp16s*)(pResidual + nSrc1StartRow*nWidth + nSrc1StartCol), nDstStep, roiSize), bSuccess );
// Record optimal shift value
if (pShifts2 != NULL) {
pShifts2[nBlock] = nSrc3StartCol - nSrc1StartCol;
pShifts1[nBlock] = -nMaxShift - 1;
}
}
} // end if
} // end nSrc2StartCol
} // end nBlockCol
} // end nBlockRow
delete [] pBlock1;
delete [] pBlock2;
delete [] pBlock3;
delete [] pBlockRes2;
delete [] pBlockRes3;
return bSuccess ? GOOD_RETURN : BAD_RETURN;
#else
return BAD_RETURN;
#endif
}
int ChenImage_imageBlockMatch1DDoubleHypothesisAddDynamicWeight(const int nWidth, const int nHeight, const int nBlockSize, const int nMaxShift, const short* pSrc1, const short* pSrc2, const short* pSrc3, short* pShiftedImg, short* pResidual, short* pShifts1, short* pShifts2, short* pWeights1)
{
#ifdef _USEIPP
bool bSuccess = true;
// Initialize
int nBlockRows = nHeight / nBlockSize;
int nBlockCols = nWidth / nBlockSize;
int nBlockElems = nBlockSize * nBlockSize;
short* pBlock1 = new short[nBlockElems];
short* pBlock2 = new short[nBlockElems];
short* pBlock3 = new short[nBlockElems];
short* pBlockComb = new short[nBlockElems];
short* pBlockRes = new short[nBlockElems];
short* pBlockResAbs = new short[nBlockElems];
float* pBlock2F = new float[nBlockElems];
float* pBlock3F = new float[nBlockElems];
float* pBlockCombF = new float[nBlockElems];
// Copy src 2 into output by default
int nSrcStep = nWidth * sizeof(short);
int nDstStep = nWidth * sizeof(short);
IppiSize roiSize = {nWidth, nHeight};
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pSrc2, nSrcStep, (Ipp16s*)pShiftedImg, nDstStep, roiSize), bSuccess );
// Iterate across all blocks
double dMinResAbsSum;
int nSrc1StartCol, nSrc1StartRow, nSrc2StartCol, nSrc2StartRow, nSrc3StartCol, nSrc3StartRow;
roiSize.width = nBlockSize;
roiSize.height = nBlockSize;
float pLinearWeightsY1[3] = {1, (float)0.5, 0};
float pLinearWeightsY2[3] = {0, (float)0.5, 1};
for (int nBlockRow = 0; nBlockRow < nBlockRows; nBlockRow++) {
for (int nBlockCol = 0; nBlockCol < nBlockCols; nBlockCol++) {
int nBlock = nBlockRow*nBlockCols + nBlockCol;
dMinResAbsSum = LARGE;
nSrc1StartCol = nBlockSize * nBlockCol;
nSrc1StartRow = nBlockSize * nBlockRow;
// Copy block from image X
nSrcStep = nWidth * sizeof(short);
nDstStep = nBlockSize * sizeof(short);
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc1 + nSrc1StartRow*nWidth + nSrc1StartCol), nSrcStep, (Ipp16s*)pBlock1, nDstStep, roiSize), bSuccess );
// Iterate across all local horizontal shifts for Y1 and Y2
nSrc2StartRow = nSrc1StartRow;
nSrc3StartRow = nSrc1StartRow;
for (nSrc2StartCol = MAX(0,nSrc1StartCol-nMaxShift); nSrc2StartCol <= MIN(nSrc1StartCol+nMaxShift,nWidth-nBlockSize); nSrc2StartCol++) {
for (nSrc3StartCol = MAX(0,nSrc1StartCol-nMaxShift); nSrc3StartCol <= MIN(nSrc1StartCol+nMaxShift,nWidth-nBlockSize); nSrc3StartCol++) {
for (int nWeight = 0; nWeight < 3; nWeight++) {
// Copy blocks from Y1 and Y2
nSrcStep = nWidth * sizeof(short);
nDstStep = nBlockSize * sizeof(short);
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc2 + nSrc2StartRow*nWidth + nSrc2StartCol), nSrcStep, (Ipp16s*)pBlock2, nDstStep, roiSize), bSuccess );
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)(pSrc3 + nSrc3StartRow*nWidth + nSrc3StartCol), nSrcStep, (Ipp16s*)pBlock3, nDstStep, roiSize), bSuccess );
// Form combination block in a1*Y1 + (1-a1)*Y2
nSrcStep = nBlockSize * sizeof(short);
nDstStep = nBlockSize * sizeof(float);
RECORD_IPP_SUCCESS( ippiConvert_16s32f_C1R((const Ipp16s*)pBlock2, nSrcStep, (Ipp32f*)pBlock2F, nDstStep, roiSize), bSuccess );
RECORD_IPP_SUCCESS( ippiConvert_16s32f_C1R((const Ipp16s*)pBlock3, nSrcStep, (Ipp32f*)pBlock3F, nDstStep, roiSize), bSuccess );
RECORD_IPP_SUCCESS( ippiMulC_32f_C1IR(pLinearWeightsY1[nWeight], (Ipp32f*)pBlock2F, nDstStep, roiSize), bSuccess );
RECORD_IPP_SUCCESS( ippiMulC_32f_C1IR(pLinearWeightsY2[nWeight], (Ipp32f*)pBlock3F, nDstStep, roiSize), bSuccess );
nSrcStep = nBlockSize * sizeof(float);
nDstStep = nBlockSize * sizeof(float);
RECORD_IPP_SUCCESS( ippiAdd_32f_C1R((const Ipp32f*)pBlock2F, nSrcStep, (const Ipp32f*)pBlock3F, nSrcStep, (Ipp32f*)pBlockCombF, nDstStep, roiSize), bSuccess );
nSrcStep = nBlockSize * sizeof(float);
nDstStep = nBlockSize * sizeof(short);
IppRoundMode rndMode = ippRndNear;
RECORD_IPP_SUCCESS( ippiConvert_32f16s_C1R((const Ipp32f*)pBlockCombF, nSrcStep, (Ipp16s*)pBlockComb, nDstStep, roiSize, rndMode), bSuccess );
// Create residual block
nSrcStep = nBlockSize * sizeof(short);
nDstStep = nBlockSize * sizeof(short);
int nScaleFactor = 0;
RECORD_IPP_SUCCESS( ippiSub_16s_C1RSfs((const Ipp16s*)pBlockComb, nSrcStep, (const Ipp16s*)pBlock1, nSrcStep, (Ipp16s*)pBlockRes, nDstStep, roiSize, nScaleFactor), bSuccess );
// Calculate sum of absolute residuals
double dResAbsSum;
nSrcStep = nBlockSize * sizeof(short);
nDstStep = nBlockSize * sizeof(short);
RECORD_IPP_SUCCESS( ippiAbs_16s_C1R((const Ipp16s*)pBlockRes, nSrcStep, (Ipp16s*)pBlockResAbs, nDstStep, roiSize), bSuccess );
RECORD_IPP_SUCCESS( ippiSum_16s_C1R((const Ipp16s*)pBlockResAbs, nSrcStep, roiSize, &dResAbsSum), bSuccess );
// Compare with previous min sum of absolute residuals
if (dResAbsSum < dMinResAbsSum) {
dMinResAbsSum = dResAbsSum;
// Copy shifted block into output image
nSrcStep = nBlockSize * sizeof(short);
nDstStep = nWidth * sizeof(short);
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pBlockComb, nSrcStep, (Ipp16s*)(pShiftedImg + nSrc1StartRow*nWidth + nSrc1StartCol), nDstStep, roiSize), bSuccess );
// Copy block residual into output residual image
nSrcStep = nBlockSize * sizeof(short);
nDstStep = nWidth * sizeof(short);
RECORD_IPP_SUCCESS( ippiCopy_16s_C1R((const Ipp16s*)pBlockRes, nSrcStep, (Ipp16s*)(pResidual + nSrc1StartRow*nWidth + nSrc1StartCol), nDstStep, roiSize), bSuccess );
// Record optimal shift value
if (pShifts1 != NULL) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -