首页 > 代码库 > OpenCV笔记(十一)——图像的阈值操作(一种分割的方法)

OpenCV笔记(十一)——图像的阈值操作(一种分割的方法)

对图像进行阈值的操作,可以认为是一种简单的分割前景和背景的方法。

这种分割的方法一般用在前景像素和背景像素的强度值反差比较明显的情况下,如下图:

Threshold simple example

我们可以看到这幅苹果的图像,代表前景的是苹果,代表背景的是白色部分。这幅图像前景背景分明,所以可以取一个阈值,如200。在图像中,凡是灰度低于200的像素,我们认作是前景,将其值设为255,凡是灰度不低于200的像素,我们认作是背景,将其值设为0。获得一张新的Mask,将原始的图像与这张Mask做与(&)运算,就能够得到分割好的图像。

 

一般来说,阈值化的手段有以下五种:

1. Threshold Binary

\texttt{dst} (x,y) =  \fork{\texttt{maxVal}}{if $\texttt{src}(x,y) > \texttt{thresh}$}{0}{otherwise}

2. Threshold Binary, Inverted

\texttt{dst} (x,y) =  \fork{0}{if $\texttt{src}(x,y) > \texttt{thresh}$}{\texttt{maxVal}}{otherwise}

3. Truncate

\texttt{dst} (x,y) =  \fork{\texttt{threshold}}{if $\texttt{src}(x,y) > \texttt{thresh}$}{\texttt{src}(x,y)}{otherwise}

4. Threshold to Zero  

\texttt{dst} (x,y) =  \fork{\texttt{src}(x,y)}{if $\texttt{src}(x,y) > \texttt{thresh}$}{0}{otherwise}

5. Threshold to Zero, Inverted

\texttt{dst} (x,y) =  \fork{0}{if $\texttt{src}(x,y) > \texttt{thresh}$}{\texttt{src}(x,y)}{otherwise}

 

我们根据不同的实际需要,灵活利用上述的5种阈值化的方法。

 

在OpenCV中,提供了threshold函数来实现阈值化的功能:

double threshold(InputArray src, OutputArray dst, double thresh, double maxVal, int thresholdType)

src表示输入的图像,只支持Single-channel, 8-bit or 32-bit floating point类型的图像。

thresholdType表示阈值化的方法,对应上述5种阈值化的方法:THRESH_BINARY, THRESH_BINARY_INV, THRESH_TRUNC, THRESH_TOZERO, THRESH_TOZERO_INV。

当然了,特别要提出的,在设置上述5种thresholdType的同时,我们可以与(&)上THRESH_OTSU,在这种情形下,threshold函数使用Otsu算法来选取最优的thresh,而不使用给定的thresh。需要注意的是,Otsu的算法只适用于8位的图像(根据文档的描述)。

 

OpenCV笔记(十一)——图像的阈值操作(一种分割的方法)