Files
GuideInfrared/编程资料/并行编程/Intrinsic.nlmeans/nlmeans.cpp

292 lines
8.3 KiB
C++
Raw Normal View History

2026-02-01 21:55:55 +08:00
#include "stdafx.h"
#include "NLmeans.h"
#include <stdlib.h>
//ȫ<>ֱ<EFBFBD><D6B1><EFBFBD>
int g_nSigma = 50; // <20><>˹<EFBFBD><CBB9><EFBFBD>߲<EFBFBD><DFB2><EFBFBD>sigma
int g_nSWBlocX = 9; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3>з<EFBFBD><D0B7><EFBFBD>
int g_nSWBlocY = 9; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3>з<EFBFBD><D0B7><EFBFBD>
int g_nPWBloc = 1; // ƥ<><EFBFBD>ڴ<EFBFBD>С
// <20><>˹<EFBFBD>˲<EFBFBD><CBB2><EFBFBD>ͬȨֵ<C8A8><D6B5><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>k<EFBFBD><6B>b<EFBFBD><62>10<31><30><EFBFBD><EFBFBD><EFBFBD>ݷֱ<DDB7><D6B1><EFBFBD>ʾ<EFBFBD>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD>sigma=10:10:100<30><30><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD><CFBD><EFBFBD>
int g_nGaussK[10] = {-159, -80, -53, -40, -32, -27, -23, -20, -18, -16};
int g_nGaussB[10] = {4100, 4114, 4118, 4120, 4121, 4122, 4123, 4123, 4123, 4124};
/***************************************************************************
* NlMeansDenoiseCenter()
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NL-MEANS ͼ<EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> һ<EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* unsigned char bitWitdth <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>8λ/16λ
* unsigned short pSrc16 16λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* unsigned char pSrc8 8λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* int nHeight ͼ<EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
* int nWidth ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>unsigned short pSrc16 16λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16λ<EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҲΪ16λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* unsigned char pSrc8 8λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8λ<EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҲΪ8λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ֵ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD>ϵ
* <EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD>չImageExpandINT()
ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>и<EFBFBD>ImageExpandInverseINT()
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ArithProcessFunc()
***************************************************************************/
void NlMeansDenoiseCenter(unsigned char bitWitdth,
unsigned short *pSrc16,
unsigned char* pSrc8,
int nWidth, int nHeight)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>С
int nSWBlocX = g_nSWBlocX;
int nSWBlocY = g_nSWBlocY;
//int nSWBlocX = 8;
//int nSWBlocY = 8;
//<2F><>˹<EFBFBD>˲<EFBFBD><CBB2><EFBFBD>׼<EFBFBD><D7BC>
int nSigma = g_nSigma;
//ƥ<><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nPWBloc = g_nPWBloc; //nPWBloc = 1
//<2F><>˹<EFBFBD><CBB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>K<EFBFBD><4B>B
int k = g_nGaussK[nSigma/10 - 1];
int b = g_nGaussB[nSigma/10 - 1];
//<2F><><EFBFBD><EFBFBD><EFBFBD>ռ<D5BC><E4BCB0>ʼ<EFBFBD><CABC>-->change into 16bit datablock
int nLen = nWidth * nHeight;
unsigned short *pImgTemp= new unsigned short[nLen];
memset(pImgTemp,0,sizeof(unsigned short) * nLen);
if(bitWitdth == 8)
{
for(int i = 0;i < nLen;i++)
{
pImgTemp[i] = pSrc8[i];
}
}
else
{
memcpy(pImgTemp,pSrc16,sizeof(unsigned short) * nLen);
}
// <20><><EFBFBD>롢Ȩ<EBA1A2><C8A8><EFBFBD><EFBFBD><EFBFBD>صı<D8B5><C4B1><EFBFBD>
int nWeight = 0;
int nMaxWeight = 0;
int nSumWeight = 0;
int nDif = 0;
int nSumDif = 0;
double nDstValue = 0;
// ͼ<><CDBC><EFBFBD><EFBFBD>չ <20><>ԭʼͼ<CABC><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ
int nWidthNew = nWidth + 2 * (nSWBlocX + nPWBloc);
int nHeightNew = nHeight + 2 * (nSWBlocY + nPWBloc);
int nLenNew = nWidthNew * nHeightNew;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9>ͼ<EFBFBD><CDBC><EFBFBD>ռ<D5BC><E4B2A2>ʼ<EFBFBD><CABC>
unsigned short *pImgExpand = new unsigned short[nLenNew];
memset(pImgExpand,0,sizeof(unsigned short) * nLenNew);
//<2F><><EFBFBD>Ž<EFBFBD><C5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned short *pImgOut = new unsigned short[nLenNew];
memset(pImgOut,0,sizeof(unsigned short) * nLenNew);
//ͼ<><CDBC><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>չ
ImageExpandINT(pImgTemp,nWidth,nHeight,pImgExpand,nWidthNew,nHeightNew);
////////////////////////////////////// PROCESS STARTS//////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD>ȥ<EFBFBD><EFBFBD><EBB4A6>
int nSpos = 0;
int nPpos = 0;
for ( int y = nSWBlocY + nPWBloc; y < nHeightNew - nSWBlocY - nPWBloc; y++) //<2F><>һ<EFBFBD><D2BB>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD><79><EFBFBD><EFBFBD> ԭʼͼ<CABC><CDBC><EFBFBD>ĵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD> pImgTemp(0,0)
{
for ( int x = nSWBlocX + nPWBloc ; x < nWidthNew - nSWBlocX - nPWBloc; x++)//<2F><>һ<EFBFBD><D2BB>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD><78><EFBFBD><EFBFBD>
{
nWeight = 0;
nMaxWeight = 0;
nSumWeight = 0;
nDstValue = 0;
//<2F><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD>WinsDenoised
for (int j = y - nSWBlocY;j <= y + nSWBlocY;j++)
{
for ( int i = x - nSWBlocX ; i <= x + nSWBlocX; i++)
{
nDif = 0;
nSumDif = 0;
for (int s = -nPWBloc; s <= nPWBloc; s++)
{
nSpos = (j + s) * nWidthNew + i; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
nPpos = (y + s ) * nWidthNew + x ;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD>
for (int r = -nPWBloc; r <= nPWBloc; r++)
{
nDif = pImgExpand[nSpos + r] - pImgExpand[nPpos + r];
nSumDif += abs(nDif);
}
}
//ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD>˹Ȩֵ , k<><6B>b<EFBFBD><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ѷŴ<D1B7>4096<39><36>
if (nSumDif >= 3*nSigma)
{
nWeight = 0;
}
else
{
nWeight = (b - k * nSumDif);
}
if (nWeight < 0)
{
nWeight = 0;
}
else if (nWeight > 4096)
{
nWeight = 4096;
}
//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8>fmaxWeight<68><74><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8>fTotalWeight
nMaxWeight = __max(nMaxWeight , nWeight);
nSumWeight += nWeight;
nDstValue += nWeight*pImgExpand[j*nWidthNew+i];
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>Ĺ<EFBFBD><C4B9><EFBFBD>ֵ
if (nSumWeight > 0)
{
pImgOut[y * nWidthNew + x] = (unsigned short)(nDstValue / nSumWeight);
}
else
{
pImgOut[y * nWidthNew + x] = pImgExpand[y * nWidthNew + x];
}
}//y
}//x
//<2F><>ȡȥ<C8A1><C8A5><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
ImageExpandInverseINT(pImgOut,nWidth,nHeight,pImgOut,nWidthNew,nHeightNew);
if(bitWitdth == 8)
{
for(int i = 0;i < nLen;i++)
{
pSrc8[i] =(unsigned char)pImgOut[i];
}
}
else
{
memcpy(pSrc16,pImgOut,sizeof(unsigned short) * nLen);
}
//<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
delete [] pImgTemp;
delete [] pImgExpand;
delete [] pImgOut;
}
/***************************************************************************
* ImageExpandINT()
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD>Ե
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* unsigned short* pSrc <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* int nHeight <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
* int nWidth <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* int NewWidth <EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* int NewHeight <EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>unsigned short *pDst <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD>ϵ
* <EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NLMȥ<EFBFBD><EFBFBD><EFBFBD>NlMeansDenoiseCenter()
***************************************************************************/
void ImageExpandINT(unsigned short* pSrc,int nWidth,int nHeight,unsigned short *pDst,int NewWidth,int NewHeight)
{
int nstepW= (int)((NewWidth - nWidth) / 2);
int nstepH = (int)((NewHeight - nHeight) / 2);
int i = 0;
int j = 0;
for (i = nstepH;i < nstepH + nHeight;i++)
{
for(j = 0;j < nstepW;j++)
{
pDst[i * NewWidth+j] = pSrc[(i - nstepH) * nWidth + 0];
}
for(j = nstepW;j < nstepW + nWidth;j++)
{
pDst[i * NewWidth + j] = pSrc[(i - nstepH) * nWidth + (j - nstepW)];
}
for(j = nstepW + nWidth;j < NewWidth;j++)
{
pDst[i * NewWidth + j] = pSrc[(i - nstepH) * nWidth + nWidth - 1];
}
}
for(i = 0;i < nstepH;i++)
{
for( j = 0;j < NewWidth;j++)
{
pDst[i * NewWidth + j] = pDst[nstepH * NewWidth + j];
}
}
for(i = nstepH + nHeight;i < NewHeight;i++)
{
for(j = 0;j < NewWidth;j++)
{
pDst[i * NewWidth + j] = pDst[(nstepH + nHeight - 1) * NewWidth + j];
}
}
}
/***************************************************************************
* ImageExpandInverseINT()
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>и<EFBFBD>, <EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD>ı<EFBFBD>Եȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ԭͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>λ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* unsigned short* pSrc <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* int nHeight <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
* int nWidth <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* int NewWidth <EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* int NewHeight <EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>unsigned short *pDst <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD>ϵ
* <EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NLMȥ<EFBFBD><EFBFBD><EFBFBD>NlMeansDenoiseCenter()
***************************************************************************/
void ImageExpandInverseINT(unsigned short* pSrc,int nWidth,int nHeight,unsigned short *pDst,int NewWidth,int NewHeight)
{
int nstepW = (int)((NewWidth - nWidth) / 2);
int nstepH = (int)((NewHeight - nHeight) / 2);
unsigned short * pos = NULL;
pos = pDst + nstepH * NewWidth + nstepW;
for (int i = 0;i < nHeight;i++)
{
memcpy(pSrc + i * nWidth, pos,sizeof(unsigned short) * nWidth);
pos = pos + NewWidth;
}
}