编写一个函数将一幅灰度图的所有像素值二值化即转换为0或255两种状态。本关卡采用Sauvola自适应阈值二值化算法。相关知识我们常见的图像二值化算法大致可分为全局阈值方法与局部阈值方法这两种类型。Sauvola算法是局部阈值方法的标杆。Sauvola算法的输入是灰度图像它以当前像素点为中心根据当前像素点邻域内的灰度均值与标准方差来动态计算该像素点的阈值。每个像素p的阈值由其邻域窗口内像素的值决定。
void adaptiveBianrizationSauvola(int imageDataMatGray[][MAX_IMAGE_WIDTH], int imageDataMatGrayOutput[][MAX_IMAGE_WIDTH], int height, int width, int winsize, double k) { //遍历每个像素点 for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { double sum = 0; //邻域窗口内像素值的和 double squareSum = 0; //邻域窗口内像素值的平方和 int count = 0; //邻域窗口内像素点的数量
//遍历邻域窗口内的像素点,统计sum、squareSum和count
for (int m = -winsize; m <= winsize; m++)
{
for (int n = -winsize; n <= winsize; n++)
{
if (i + m < 0 || i + m >= height || j + n < 0 || j + n >= width)
{
continue;
}
sum += imageDataMatGray[i + m][j + n];
squareSum += imageDataMatGray[i + m][j + n] * imageDataMatGray[i + m][j + n];
count++;
}
}
//计算邻域窗口内像素值的平均值和标准方差
double mean = sum / count;
double variance = (squareSum / count) - (mean * mean);
double standardDeviation = sqrt(variance);
//计算阈值
double threshold = mean * (1 + k * ((standardDeviation / 128) - 1));
//将像素二值化
if (imageDataMatGray[i][j] > threshold)
{
imageDataMatGrayOutput[i][j] = 255;
}
else
{
imageDataMatGrayOutput[i][j] = 0;
}
}
}
原文地址: http://www.cveoy.top/t/topic/hkOR 著作权归作者所有。请勿转载和采集!