本文为原创文章,未经本人允许,禁止转载。转载请注明出处。
1.阈值类型
👉阈值二值化(threshold binary):
\[dst(x,y) = \begin{cases} maxVal, & \text{if src(x,y) > thresh} \\ 0, & \text{otherwise} \end{cases}\]👉阈值反二值化(threshold binary inverted):
\[dst(x,y) = \begin{cases} 0, & \text{if src(x,y) > thresh} \\ maxVal, & \text{otherwise} \end{cases}\]👉截断(truncate):
\[dst(x,y) = \begin{cases} threshold, & \text{if src(x,y) > thresh} \\ src(x,y), & \text{otherwise} \end{cases}\]👉阈值取零(threshold to zero):
\[dst(x,y) = \begin{cases} src(x,y), & \text{if src(x,y) > thresh} \\ 0, & \text{otherwise} \end{cases}\]👉阈值反取零(threshold to zero inverted):
\[dst(x,y) = \begin{cases} 0, & \text{if src(x,y) > thresh} \\ src(x,y), & \text{otherwise} \end{cases}\]2.寻找阈值的方法
2.1.THRESH_OTSU
OSTU(大津法/最大类间方差法):
记$t$为前景与背景的分割阈值,前景点数占图像比例为$w_0$,平均灰度为$u_0$;背景点数占图像比例为$w_1$,平均灰度为$u_1$。
则图像的总平均灰度为:
\[u=w_0 u_0+w_1 u_1\]前景和背景图象的方差:
\[g=w_0(u_0-u)(u_0-u)+w_1(u_1-u)(u_1-u)=w_0w_1(u_0-u_1)(u_0-u_1)\]此公式为类间方差公式。当方差$g$最大时,可以认为此时前景和背景差异最大。
2.2.THRESH_TRIANGLE
即三角法图像二值化:$d$取得最大值时,对应的灰度级即为阈值,见下图所示:
使用前提:波峰不能在中间,在侧边才能构建三角形。
3.API
1
2
3
4
5
6
7
double threshold(
InputArray src,
OutputArray dst,
double thresh,
double maxval,
int type
);
参数解释:
InputArray src
:输入图像。OutputArray dst
:输出图像。double thresh
:阈值。double maxval
:对应第一部分中的maxVal
。int type
:THRESH_BINARY = 0
THRESH_BINARY_INV = 1
THRESH_TRUNC = 2
THRESH_TOZERO = 3
THRESH_TOZERO_INV = 4
THRESH_MASK = 7
THRESH_OTSU = 8
THRESH_TRIANGLE = 16
当type=8
或type=16
时,图像必须为单通道(其他type
时,可以为多通道图像),其预测出来的阈值可以搭配其他阈值类型进行使用,例如:
1
2
3
threshold(src_gray, dst, 0,255, THRESH_OTSU | THRESH_BINARY);//这里的0已经失去了作用,阈值由OTSU计算得到
//也可写为:
threshold(src_gray, dst, 0,255, THRESH_BINARY | THRESH_OTSU);