阈值分割的核心就是如何选取阈值, 选取正确的阈值是分割成功的关键。
全局阈值分割指的是将灰度值大于 thresh (阈值)的像素设为白色,小于或者等于 thresh 的像素设为黑色; 或者反过来, 将大于 thresh 的像素设为黑色, 小于或者等于 thresh 的像素设为白色, 两者的区别只是呈现形式不同。
需要注意的是,当类型为 THRESH_OTSU 或 THRESH_TRIANGLE 时,输入参数 src 只支持 uchar 类型, 这时 thresh 也是作为输出参数的, 即通过 Otsu 和 TRIANGLE 算法自动计算出来。
局部阈值分割的核心也是计算阈值矩阵,比较常用的是后面提到的自适应阈值算法(又称移动平均值算法) , 是一种简单但是高效的局部阈值算法,其核心思想就是把每一个像素的邻域的“平均值”作为该位置的阈值。
一幅含有一个与背景呈现 明显对比 的物体的图像具有包含 双峰 的直方图,两个峰值对应于物体内部和外部较多数目的点,两个峰值之间的波谷对应于物体边缘附近相对较少数目的点。
直方图技术法就是首先找到这两个峰值,然后取两个峰值之 间的 波谷位置 对应的灰度值,就是所要的阈值。
一 种常用的方式是先对直方图进行高斯平滑处理,逐渐增大高斯滤波器的标准差,直到能从平滑后的直方图中得到两个唯一的波峰和它们之间唯一的最小值。但这种方式需要手动调节,下面介绍一种规则自动选取波峰和波谷的方式。
假设输入图像为I, 高为H、 宽为W, histogramI 代表其对应的灰度直方图, histogramI (k) 代表灰度值等于k的像素点个数, 其中0≤k≤255。
利用熵计算阈值的步骤如下:
在对图像进行阈值分割时,所选取的分割阈值应使前景区域的平均灰度、背景区域 的平均灰度与整幅图像的平均灰度之间的差异最大, 这种差异用区域的 方差 来表示。 Otsu[2]提出了最大方差法, 该算法是在判别分析最小二乘法原理的基础上推导得出的, 计算过程简单, 是一种常用的阈值分割的稳定算法。
在不均匀照明或者灰度值分布不均的情况下,如果使用全局阈值分割, 那么得到的分割效果往往会很不理想。那么想到的策略是针对每一个位置的灰度值 设置一个对应的阈值, 而该位置阈值的设置也和其 邻域 有必然的关系。
在对图像进行平滑处理时,均值平滑、高斯平滑、中值平滑用不同规则计算出以当前像素为中心的邻域内的灰度“平均值”, 所以可以使用平滑处理后的输出结果作为每个 像素设置阈值的参考值,如用均值滤波后的结果乘以某个比例系数作为最后的阈值矩阵。
平滑算子的宽度必须大于被识别物体的宽度,平滑算子的尺寸越大,平滑后的结果越能更好地作为每个像素的阈值的参考,当然也不能无限大。
就可以理解OpenCV提供的自适应阈值函数:
OpenCV提供的两个函数 bitwise_and 和 bitwise_or 分别实现了两 个矩阵之间的与运算和或运算,它们本质上完成的是两个矩阵对应位置数值的逻辑运算。