• ## sauvola算法实现

千次阅读 2015-08-18 16:48:30
实现了sauvola算法。 参数是：k, windowSize，自己调调看效果 [cpp] view plaincopy void sauvola(unsigned char * grayImage,unsigned char * biImage,int w,int h,int k,int windowSize)...
 实现了sauvola算法。
参数是：k, windowSize，自己调调看效果

[cpp]
view plain
copy

void sauvola(unsigned char * grayImage,unsigned char * biImage,int w,int h,int k,int windowSize)   {          int whalf = windowSize >> 1;              int i,j;       int IMAGE_WIDTH = w;       int IMAGE_HEIGHT = h;       // create the integral image       unsigned long * integralImg = (unsigned long*)malloc(IMAGE_WIDTH*IMAGE_HEIGHT*sizeof(unsigned long*));       unsigned long * integralImgSqrt = (unsigned long*)malloc(IMAGE_WIDTH*IMAGE_HEIGHT*sizeof(unsigned long*));       int sum = 0;       int sqrtsum = 0;       int index;       for (i=0; i<IMAGE_HEIGHT; i++)       {           // reset this column sum           sum = 0;           sqrtsum = 0;              for (j=0; j<IMAGE_WIDTH; j++)           {               index = i*IMAGE_WIDTH+j;                  sum += grayImage[index];               sqrtsum += grayImage[index] * grayImage[index];                  if (i==0)               {                   integralImg[index] = sum;                   integralImgSqrt[index] = sqrtsum;               }               else               {                   integralImgSqrt[index] = integralImgSqrt[(i-1)*IMAGE_WIDTH+j] + sqrtsum;                   integralImg[index] = integralImg[(i-1)*IMAGE_WIDTH+j] + sum;               }           }       }              //Calculate the mean and standard deviation using the integral image       int xmin,ymin,xmax,ymax;       double mean,std,threshold;       double diagsum,idiagsum,diff,sqdiagsum,sqidiagsum,sqdiff,area;          for (i=0; i<IMAGE_WIDTH; i++){           for (j=0; j<IMAGE_HEIGHT; j++){               xmin = max(0,i - whalf);               ymin = max(0,j - whalf);               xmax = min(IMAGE_WIDTH-1,i+whalf);               ymax = min(IMAGE_HEIGHT-1,j+whalf);                              area = (xmax - xmin + 1) * (ymax - ymin + 1);               if(area <= 0)               {                   biImage[i * IMAGE_WIDTH + j] = 255;                   continue;               }                              if(xmin == 0 && ymin == 0){                   diff = integralImg[ymax * IMAGE_WIDTH + xmax];                   sqdiff = integralImgSqrt[ymax * IMAGE_WIDTH + xmax];               }else if(xmin > 0 && ymin == 0){                   diff = integralImg[ymax * IMAGE_WIDTH + xmax] - integralImg[ymax * IMAGE_WIDTH + xmin - 1];                   sqdiff = integralImgSqrt[ymax * IMAGE_WIDTH + xmax] - integralImgSqrt[ymax * IMAGE_WIDTH + xmin - 1];                  }else if(xmin == 0 && ymin > 0){                   diff = integralImg[ymax * IMAGE_WIDTH + xmax] - integralImg[(ymin - 1) * IMAGE_WIDTH + xmax];                   sqdiff = integralImgSqrt[ymax * IMAGE_WIDTH + xmax] - integralImgSqrt[(ymin - 1) * IMAGE_WIDTH + xmax];;               }else{                   diagsum = integralImg[ymax * IMAGE_WIDTH + xmax] + integralImg[(ymin - 1) * IMAGE_WIDTH + xmin - 1];                   idiagsum = integralImg[(ymin - 1) * IMAGE_WIDTH + xmax] + integralImg[ymax * IMAGE_WIDTH + xmin - 1];                   diff = diagsum - idiagsum;                      sqdiagsum = integralImgSqrt[ymax * IMAGE_WIDTH + xmax] + integralImgSqrt[(ymin - 1) * IMAGE_WIDTH + xmin - 1];                   sqidiagsum = integralImgSqrt[(ymin - 1) * IMAGE_WIDTH + xmax] + integralImgSqrt[ymax * IMAGE_WIDTH + xmin - 1];                   sqdiff = sqdiagsum - sqidiagsum;               }                  mean = diff/area;               std  = sqrt((sqdiff - diff*diff/area)/(area-1));               threshold = mean*(1+k*((std/128)-1));               if(grayImage[j*IMAGE_WIDTH + i] < threshold)                   biImage[j*IMAGE_WIDTH + i] = 0;               else                   biImage[j*IMAGE_WIDTH + i] = 255;              }       }              free(integralImg);       free(integralImgSqrt);   }


展开全文
• 实现的 Sauvola 方法使用积分图像来快速计算阈值函数。 Sauvola 方法描述于： J. Sauvola 和 M. Pietikainen，自适应文档图像二值化，模式识别 33，2000。 - ...
• matlab开发-Sauvola局部图像阈值。Sauvola二值化方法非常适合于光线不足或文档有污点的情况。
• 使用sauvola方法进行的图像二值化，其中包含了计算局部均值和方差的函数
• ## Sauvola 二值化

千次阅读 2019-01-22 23:42:32
常见的图像二值化算法大致可认为全局阈值方法和局部阈值方法两种类型，其中OTSU是全局阈值的代表，而Sauvola算法是局部阈值方法的标杆。 Sauvola算法的输入时灰度图像，它以当前像素点为中心，根据当前像素点的邻域...
简述
针对背景单一，光照不均匀的图像，先求出图片的亮度背景，用原图减去背景，得出前景内容。 常见的图像二值化算法大致可认为全局阈值方法和局部阈值方法两种类型，其中OTSU是全局阈值的代表，而Sauvola算法是局部阈值方法的标杆。
Sauvola算法的输入时灰度图像，它以当前像素点为中心，根据当前像素点的邻域内的灰度均值与标准方差来动态计算该像素点的阈值。
核心公式 R邻域内的灰度均值与标准方差：  该点的阈值：  k：修正参数 0<k<1
通过调大窗口的尺寸可以适应更大的前景目标，由此带来计算量大大增加。
缺陷：当前景存在大面积单一颜色，则容易导致前景中间部分被识别为背景，故该方法最适用于不均匀光照下的文本图像二值化。
Halcon中使用均值，高斯滤波器得到局部背景灰度估计，再跟前景像素点比较，使用的原理是一样的。
代码：
void sauvola(cv::
展开全文
• void sauvola(unsigned char * grayImage, unsigned char * biImage, int w, int h, int k, int windowSize) {  int whalf = windowSize &gt;&gt; 1;  int i, j;  int IMAGE_WIDTH = w;  int IMAGE_HEI...
void sauvola(unsigned char * grayImage, unsigned char * biImage, int w, int h, int k, int windowSize) {     int whalf = windowSize >> 1;
int i, j;     int IMAGE_WIDTH = w;     int IMAGE_HEIGHT = h;     // create the integral image     unsigned long * integralImg = (unsigned long*)malloc(IMAGE_WIDTH*IMAGE_HEIGHT*sizeof(unsigned long*));     unsigned long * integralImgSqrt = (unsigned long*)malloc(IMAGE_WIDTH*IMAGE_HEIGHT*sizeof(unsigned long*));     int sum = 0;     int sqrtsum = 0;     int index;     for (i = 0; i<IMAGE_HEIGHT; i++)     {         // reset this column sum         sum = 0;         sqrtsum = 0;
for (j = 0; j<IMAGE_WIDTH; j++)         {             index = i*IMAGE_WIDTH + j;
sum += grayImage[index];             sqrtsum += grayImage[index] * grayImage[index];
if (i == 0)             {                 integralImg[index] = sum;                 integralImgSqrt[index] = sqrtsum;             }             else             {                 integralImgSqrt[index] = integralImgSqrt[(i - 1)*IMAGE_WIDTH + j] + sqrtsum;                 integralImg[index] = integralImg[(i - 1)*IMAGE_WIDTH + j] + sum;             }         }     }
//Calculate the mean and standard deviation using the integral image     int xmin, ymin, xmax, ymax;     double mean, std, threshold;     double diagsum, idiagsum, diff, sqdiagsum, sqidiagsum, sqdiff, area;
for (i = 0; i<IMAGE_WIDTH; i++){         for (j = 0; j<IMAGE_HEIGHT; j++){             xmin = std::max(0, i - whalf);             ymin = std::max(0, j - whalf);             xmax = std::min(IMAGE_WIDTH - 1, i + whalf);             ymax = std::min(IMAGE_HEIGHT - 1, j + whalf);
area = (xmax - xmin + 1) * (ymax - ymin + 1);             if (area <= 0)             {                 biImage[i * IMAGE_WIDTH + j] = 255;                 continue;             }
if (xmin == 0 && ymin == 0){                 diff = integralImg[ymax * IMAGE_WIDTH + xmax];                 sqdiff = integralImgSqrt[ymax * IMAGE_WIDTH + xmax];             }             else if (xmin > 0 && ymin == 0){                 diff = integralImg[ymax * IMAGE_WIDTH + xmax] - integralImg[ymax * IMAGE_WIDTH + xmin - 1];                 sqdiff = integralImgSqrt[ymax * IMAGE_WIDTH + xmax] - integralImgSqrt[ymax * IMAGE_WIDTH + xmin - 1];             }             else if (xmin == 0 && ymin > 0){                 diff = integralImg[ymax * IMAGE_WIDTH + xmax] - integralImg[(ymin - 1) * IMAGE_WIDTH + xmax];                 sqdiff = integralImgSqrt[ymax * IMAGE_WIDTH + xmax] - integralImgSqrt[(ymin - 1) * IMAGE_WIDTH + xmax];;             }             else{                 diagsum = integralImg[ymax * IMAGE_WIDTH + xmax] + integralImg[(ymin - 1) * IMAGE_WIDTH + xmin - 1];                 idiagsum = integralImg[(ymin - 1) * IMAGE_WIDTH + xmax] + integralImg[ymax * IMAGE_WIDTH + xmin - 1];                 diff = diagsum - idiagsum;
sqdiagsum = integralImgSqrt[ymax * IMAGE_WIDTH + xmax] + integralImgSqrt[(ymin - 1) * IMAGE_WIDTH + xmin - 1];                 sqidiagsum = integralImgSqrt[(ymin - 1) * IMAGE_WIDTH + xmax] + integralImgSqrt[ymax * IMAGE_WIDTH + xmin - 1];                 sqdiff = sqdiagsum - sqidiagsum;             }
mean = diff / area;             std = sqrt((sqdiff - diff*diff / area) / (area - 1));             threshold = mean*(1 + k*((std / 128) - 1));             if (grayImage[j*IMAGE_WIDTH + i] < threshold)                 biImage[j*IMAGE_WIDTH + i] = 0;             else                 biImage[j*IMAGE_WIDTH + i] = 255;         }     }
free(integralImg);     free(integralImgSqrt); }
展开全文
• 智慧石上的资源Sauvola
智慧石上的资源
Sauvola
展开全文
• 在机器视觉领域，二值化是分割图像的一种常用方法，对于亮度分布不均的图像，不可采用固定阈值方法，通常采用局部阈值方法，比如动态阈值分割、sauvola算法分割等。 1. 动态阈值分割 一般对原图像进行滤波处理进行...
• sauvola算法是一个比较不错的局部二值化算法，有不少人也具体实现了其代码，但是本人觉得里面存在一些bug和不方便opencv调用，所以对其适当的修改。 但是修改之后，仍然就是存在一些问题，就是难以找到一个比较大的...
• 利用sauvola实现图像二值化，很好的解决了光照不均匀产生的影响，这是我用c++实现后编译成mexw32 文件，方便matlab调用。适用于32位window系统
• 实现了sauvola算法，原论文去google一下就有了~ 参数是：k, windowSize，自己调调看效果 void sauvola(unsigned char * grayImage,unsigned char * biImage,int w,int h,int k,int windowSize) { int whalf = ...
• sauvola是一种考虑局部均值亮度的图像二值化方法, 以局部均值为基准在根据标准差做些微调.算法实现上一般用积分图方法来实现的. 步骤1 计算区域像素积分和和积分平方和 步骤2 计算标准差，标准差的计算方法为: std...
• sauvola二值化算法研究 sauvola是一种考虑局部均值亮度的图像二值化方法, 以局部均值为基准在根据标准差做些微调.算法实现上一般用积分图方法 来实现.这个方法能很好的解决全局阈值方法的短板—关照不均图像二值化...
• void sauvola(unsigned char * grayImage, unsigned char * biImage, int w, int h, double k, int windowSize) { int whalf = windowSize >> 1; int i, j; int IMAGE_WIDTH = w; int IMAGE_HEIGHT = h; // cr
• sauvola是一种考虑局部均值亮度的图像二值化方法, 以局部均值为基准在根据标准差做些微调.算法实现上一般用积分图方法来实现的. 步骤1 计算区域像素积分和和积分平方和 步骤2 计算标准差，标准差的计算方法为: std...
• 之前接触过全局二值化（OTSU算法），还有OPENCV提供的自适应二值化，最近又了解到一种新的局部二值化算法，Sauvola算法。 转载自：http://www.dididongdong.com/archives/4048 值得注意的是，计算r×r邻域内像素...
• 下面先给出代码 void SauvolA(vector &FilesVec,vector &outputImg,string root) { char version; int c; int winx = 0, winy = 0; float optK = 0.5; bool didSpecifyK = false; string Saveroot; // Determine the...
• Phansalkar 方法描述于： N. Phansalkar、S. More、A. Sabale 和 M. Joshi，“用于检测多样性染色细胞学图像中细胞核的自适应局部阈值”，2011 年国际通信和信号处理会议，2011 年，第 218-220 页： IEEE。
• alpr ...自动车牌识别 Sauvola和连接的组件贴标签后 T := C \circ S \circ G 带有C组件标记，S Sauvola（10,2,256,0.25），G灰度（50）。
• Wolf 方法解决了 Sauvola 方法中背景和文本像素的灰度级接近时的问题。 方法说明以及与其他方法的比较可在http://dx.doi.org/10.1117/12.805827获得。
• Automatic Non-Perfused ...With 1.50 edition, choriocapillary flow voids measured with Phansalkar thresholding, which is the modification of Sauvola's thresholding method to deal with low contrast image
• This is the WPF interface of merged-characters-segmentation. You could choose the test picture by a button.It ...Sauvola binarization OTSU binarization Iteration binarization Zhang-Suen skeletonization
• Feng 阈值方法很有趣，因为它可以在定性上优于 Sauvola 阈值方法。 但是，Feng方法包含许多必须设置的参数。 因此，这种方法从未被广泛接受。 Feng方法在以下内容中进行了描述： Meng-Ling Feng 和 Yap-Peng Tan，...
• 2 sauvola方法, 参考我的另一篇博文: sauvola二值化算法研究 3 Bersen方法 Bersen方法感觉有些粗糙, 只是考虑目标点附近区域的像素灰度值的最大值和最小值, 阈值是最大值和最小值的均值.下面是它的matlab实现,...
• 二值化（全局Otsu，Sauvola，Niblack，自适应） 相差校正 去噪（非局部均值去噪算法） 间伐（张孙，郭堂） 模糊检测（LAPM，LAPV，TENG，GLVN） Deblur（基于高斯） 白平衡（简单，灰色世界） 边界检测（基于...
• Histonets计算机视觉 Histonets项目的计算机视觉部分 免费软件：Apache Software License 2.0 文档： : 。 特征 用法：组蛋白[OPTIONS] COMMAND [ARGS] ... ... -m，--method [sauvola | isodata | o