论文作者 Derek Bradley* Gerhard Roth
论文给的伪代码:
void vvAdaptiveThreshold( IplImage* inImg, IplImage* outImg) { int S = inImg->width >> 5; int T = 10; char *input, *bin; input = inImg->imageData; bin = outImg->imageData; int width = inImg->width; int height = inImg->height; unsigned long* integralImg = 0; int i, j; long sum=0; int count=0; int index; int x1, y1, x2, y2; int s2 = S/2; //bin = new unsigned char[width*height]; // create the integral image integralImg = (unsigned long*)malloc(width*height*sizeof(unsigned long*)); for (i=0; i<width; i++) { // reset this column sum sum = 0; for (j=0; j<height; j++) { index = j*width+i; sum += input[index]; if (i==0) integralImg[index] = sum; else integralImg[index] = integralImg[index-1] + sum; } } // perform thresholding for (i=0; i<width; i++) { for (j=0; j<height; j++) { index = j*width+i; // set the SxS region x1=i-s2; x2=i+s2; y1=j-s2; y2=j+s2; // check the border if (x1 < 0) x1 = 0; if (x2 >= width) x2 = width-1; if (y1 < 0) y1 = 0; if (y2 >= height) y2 = height-1; count = (x2-x1)*(y2-y1); // I(x,y)=s(x2,y2)-s(x1,y2)-s(x2,y1)+s(x1,x1) sum = integralImg[y2*width+x2] - integralImg[y1*width+x2] - integralImg[y2*width+x1] + integralImg[y1*width+x1]; if ((long)(input[index]*count) < (long)(sum*(100-T)/100)) bin[index] = 0; else bin[index] = 255; } } free (integralImg); }
这个源码请参考 http://blog.csdn.net/hhygcy/article/details/4280165
+++++++++++++++++++++++++
论文效果
而 我跑了下: