本文为合集收录,欢迎查看合集/专栏链接进行全部合集的系统学习。
合集完整版请参考这里。
上一节学习了利用 Canny 算法来完成一个图片的边缘检测,从而可以区分出图像的边缘。
本节再了解一个计算机视觉中更常见的应用,那就是把图片的前景和背景的分离,也叫做图像分割。
什么是图像的前景和背景
在图像处理和计算机视觉中,"前景"和"背景"是指图像中的两个主要部分。
前景:前景是图像中引起人们兴趣或希望被重点关注的区域,通常指图像中的主要目标,或者在图像处理中你想要从图像中提取或识别的对象。
背景:简单理解就是除了前景之外的其余图像区域,作为陪衬的、通常是图像中次要的区域。
举个例子,上述图片一只猫在一个花园中,那么照片中的猫就是前景,而周围的花园景色就是背景。
在一些图像处理任务中,准确地分割前景和背景非常关键,例如,在图像分割领域中,我们就很希望将图像中的不同对象分离开来,这肯定需要识别然后分割前景和背景。
如何区别前景和背景
在继续阅读之前,你可以先想一下,如果让你自己来完成这个前景和背景的分割,在已学习的知识框架下,如何来完成呢?
你可能会想到先用灰度图简化一张图像。没错,前面已经介绍了灰度图,灰度图丢失了颜色信息,转而将彩色图像转化为了只有一个通道(灰度)的照片,在这样的照片里,所有像素的灰度值都限制在了0-255的范围内。
如果想要区分前景和背景,就需要找到一个灰度阈值,比如100,大于100的所有像素,称之为前景(或背景),而小于等于100的所有像素称之为背景(或前景)。
基于此,就可以把一张图片的前景和背景分开了。那现在问题转化为,如何选择一个合适的阈值,来将灰度图分开?
大津算法
大津算法就是专门做这个事的一种算法,这里不写具体的公式了,如果你对大津算法感兴趣可以直接去百度查一下,有很多公式推导。
这里从一个最通俗易懂的角度来说明大津算法是如何将一个灰度图分为前景和背景的。
大津是个日本学者,他在研究这个算法的时候可能这么想过:假设我已经找到了一个阈值,并且已经利用这个阈值将图像划分为两块区域(一块是所有像素点小于阈值的,一块是所有像素点大于阈值的),那么这两个区域可以看做是两个集合或者两个类别。
如果让前景和背景分割的效果最好,那肯定就是这两个集合(两个类别)之间的灰度值相差最大,这样区别才明显。
于是,大津定义了一个指标为两类中所有像素点的类间方差,如果类间方差最大,那么划分这两类的阈值分割出来的图像肯定就是最明显的。
类间方差最大,这是大津算法的一个核心思想。
方差大意味着两个数据的差别大,从而可以最大限度、最精确的来完成图像的前景和背景的分割。
那还是回到这个问题,如何确定这个阈值,使得小于它和大于它的两类图像的像素点类间方差最大呢?
大津也想了很多办法,发现从数学上几乎很难解决这个问题,但是这个问题数学上解决不了,不代表工程上解决不了。
工程实践解决
我们知道,灰度图的全部像素的值也就0-255。假设先设置阈值为0,那么就可以利用这个阈值计算出一个类间方差,记为S0; 然后再设置阈值为1,再计算出一个类间方差S1,一直尝试到设置阈值为255, 总共计算出256个方差,分别为 S0、S1、…、S255。
找到这256个类间方差最大的那个值,对应的阈值就是希望得到的阈值了。
这就是大津算法在实现时的另一个核心思想:灰度值遍历。
所以,总结一下,大津算法的核心思想有两个。
-
第一个是数学上的:是求大于阈值和小于阈值所有像素点的方差,以类间方差为标准来划分前景和背景;
-
第二个是工程上的:利用遍历法来遍历所有像素值,最终获得类间方差最大时对应的阈值。
对于计算机而言,遍历一个从 0-255 的数组的性能是很快的。因此,大津算法在效果和性能上都还不错,成为了在图像前景和背景分离中一个常见的算法。