voidBradleyThreshold(constIplImage*srcImage,IplImage*dstImage,intiRows,intiCols,doubledPercentThres)
{
// Deal with even blocksize
if(iRows%2==0)
++iRows;
if(iCols%2==0)
++iCols;
// Deal with color image
constIplImage*grayImg=srcImage;
//-- Generateintegral image.
intiRowAmount=srcImage->height+1;//Padding
intiColAmount=srcImage->width+1;//Padding
double*pIntegralImage=newdouble[iRowAmount*iColAmount];
// Zero padding
for(intiCol=0;iCol<iColAmount;++iCol)
pIntegralImage[iCol]=0.0;
for(intiRow=0;iRow<iRowAmount;++iRow)
pIntegralImage[iRow*iColAmount]=0.0;
boolbIsFirstRow=true;
doubledSum=0.0;
uchar*pCurrentRow;// = grayImg.ptr<uchar>(0);
for(intiRow=1;iRow<iRowAmount;++iRow)
{
bIsFirstRow=iRow==1;
pCurrentRow=(uchar*)(grayImg->imageData+(iRow-1)*grayImg->widthStep);
dSum=0.0;
for(intiCol=1;iCol<iColAmount;++iCol)
{
dSum+=pCurrentRow[iCol-1];
if(!bIsFirstRow)
pIntegralImage[iRow*iColAmount+iCol]=dSum+pIntegralImage[(iRow-1)*iColAmount+iCol];
else
pIntegralImage[iRow*iColAmount+iCol]=dSum;
}
}
//-- Integralimage generated.
// Binarization
constintiRowHalfRange=iRows/2;
constintiColHalfRange=iCols/2;
intiRowBegin=0;
intiRowEnd=0;
intiColBegin=0;
intiColEnd=0;
intiArea=0;
doubledAverageVal=0.0;
/// dstImage.create(grayImg.size(), CV_8UC1);
for(intiRow=1;iRow<iRowAmount;++iRow)
{
uchar*pDstCurrentRow=(uchar*)(dstImage->imageData+(iRow-1)*dstImage->widthStep);
uchar*pSrcCurrentRow=(uchar*)(grayImg->imageData+(iRow-1)*grayImg->widthStep);
iRowBegin=iRow-iRowHalfRange-1;
iRowEnd=iRow+iRowHalfRange;
if(iRowBegin<0)
iRowBegin=0;
if(iRowEnd>=iRowAmount)
iRowEnd=iRowAmount-1;
for(intiCol=1;iCol<iColAmount;++iCol)
{
iColBegin=iCol-iColHalfRange-1;
iColEnd=iCol+iColHalfRange;
if(iColBegin<0)
iColBegin=0;
if(iColEnd>=iColAmount)
iColEnd=iColAmount-1;
iArea=(iColEnd-iColBegin)*(iRowEnd-iRowBegin);
dSum=pIntegralImage[iRowBegin*iColAmount+iColBegin]+pIntegralImage[iRowEnd*iColAmount+iColEnd]
-pIntegralImage[iRowBegin*iColAmount+iColEnd]-pIntegralImage[iRowEnd*iColAmount+iColBegin];
dAverageVal=dSum/iArea;
pDstCurrentRow[iCol-1]=pSrcCurrentRow[iCol-1]>dAverageVal*(1+dPercentThres)?255:0;
}
}
delete[]pIntegralImage;
}