photoshop中的解释:阈值”命令将灰度或彩色图像转换为高对比度的黑白图像。可以指定某个色阶作为阈值。所有比阈值亮的像素转换为白色;而所有比阈值暗的像素转换为黑色。“阈值”命令对确定图像的最亮和最暗区域很有用。
如果图像的像素等于阀值时怎么处理呢?
如果是普通图片,怎么处理都不怎么影响,可当图片是二值化之后的,会怎么样呢?传一张全白的怎么样呢?
这可能存在的隐形问题如果没考虑到,会有出乎意料的结果。
int otsuThreshold(int *data, int size)//buf里保存的是 { int pixelCount[GrayScale]; float pixelPro[GrayScale]; int *pdata = data; int i, j, pixelSum = size, threshold = 0; for(i = 0; i < GrayScale; i++) { pixelCount[i] = 0; pixelPro[i] = 0; } //统计灰度级中每个像素在整幅图像中的个数 for(j = 0;j < pixelSum;j++) { i = *pdata++; pixelCount[i]++; } //计算每个像素在整幅图像中的比例 for(i = 0; i < GrayScale; i++) { pixelPro[i] = (float)pixelCount[i] / pixelSum; } //遍历灰度级[0,255] float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0; for(i = 0; i < GrayScale; i++) { w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0; for(j = 0; j < GrayScale; j++) { if(j <= i) //背景部分 { w0 += pixelPro[j]; u0tmp += j * pixelPro[j]; } else //前景部分 { w1 += pixelPro[j]; u1tmp += j * pixelPro[j]; } } u0 = u0tmp / w0; u1 = u1tmp / w1; u = u0tmp + u1tmp; deltaTmp = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2); if(deltaTmp > deltaMax) { deltaMax = deltaTmp; threshold = i; } } return threshold; }
当一个图片背景大部分为白色时,而其图片特征轮廓可能是灰色和黑色分界,对着局部区域取阀值比较可取,如下:
/*-----------------------------------------/ 一个图片宽度固定,但仅对x, y区域的求阀值
x是从行头开始的宽,y是固定大小的height,
这个程序是对图像左半部x求阀值 -----------------------------------------*/ int otsuThreshold(int *data, int x, int y, int width) { int pixelCount[GrayScale]; float pixelPro[GrayScale]; int *pdata = data; int i, j, pixelSum = x*y, threshold = 0; for(i = 0; i < GrayScale; i++) { pixelCount[i] = 0; pixelPro[i] = 0; } //统计灰度级中每个像素在整幅图像中的个数 int n; for(i = 0; i < y; i++) { for(j = 0; j < x; j++) { n = *(pdata + i*width + j); pixelCount[n]++; } } //计算每个像素在整幅图像中的比例 for(i = 0; i < GrayScale; i++) { pixelPro[i] = (float)pixelCount[i] / pixelSum; } //遍历灰度级[0,255] float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0; for(i = 0; i < GrayScale; i++) { w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0; for(j = 0; j < GrayScale; j++) { if(j <= i) //背景部分 { w0 += pixelPro[j]; u0tmp += j * pixelPro[j]; } else //前景部分 { w1 += pixelPro[j]; u1tmp += j * pixelPro[j]; } } u0 = u0tmp / w0; u1 = u1tmp / w1; u = u0tmp + u1tmp; deltaTmp = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2); if(deltaTmp > deltaMax) { deltaMax = deltaTmp; threshold = i; } } return threshold; }