sauvola算法是一个比较不错的局部二值化算法,有不少人也具体实现了其代码,但是本人觉得里面存在一些bug和不方便opencv调用,所以对其适当的修改。
但是修改之后,仍然就是存在一些问题,就是难以找到一个比较大的数据类型去存储,这个bug等以后有空再处理。不过通过修改后的代码进行学习,还是很不错的。代码如下:
#include "opencv2/opencv.hpp"
static int CalcMaxValue(int a, int b)
{
return (a > b) ? a : b;
}
static double CalcMaxValue(double a, double b)
{
return (a > b) ? a : b;
}
static int CalcMinValue(int a, int b)
{
return (a < b) ? a : b;
}
static double CalcMinValue(double a, double b)
{
return (a < b) ? a : b;
}
/** @brief SauvolaThresh二值算法
此代码不适用与分辨率较大的图像, 此bug准备有空再处理
@param src 单通道灰度图
@param dst 单通道处理后的图
@param k threshold = mean*(1 + k*((std / 128) - 1))
@param wndSize 处理区域宽高, 一定是奇数
*/
void SauvolaThresh(const cv::Mat& src, cv::Mat& dst, const int k, const cv::Size w