【OpenCV基础】第十三课:基本阈值操作

阈值二值化,阈值反二值化,阈值截断,阈值取零,阈值反取零,大津法,三角法图像二值化

Posted by x-jeff on August 24, 2020

本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

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 
);

参数解释:

  1. InputArray src:输入图像。
  2. OutputArray dst:输出图像。
  3. double thresh:阈值。
  4. double maxval:对应第一部分中的maxVal
  5. 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=8type=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);

4.代码地址

  1. 基本阈值操作