基于阀值的图形分割

基于阈值可以给图形做分隔,提取出我们需要的像素点。用来制作mask或者分离图片的背景等都有很多实际的应用。

cv2.threshold

最基本的定义一个全局阈值,然后对整体图片应用这个阈值。可以用来生成mask然后再用这个mask来做其他的操作。更进一步的,此算法还可以使用Otsu优化过程,让算法自己来决定阈值。要注意的是,Otsh算法它是假设这个图片的前景与背景区分得非常分明。它根据对整体图片的统计,然后找到两个最大的像素频率,并假设此图的背景与前景就对应这两个最大频率。然后用这两个最大频率出现的像素数值来计算阈值。因此Otsh算法在前景和背景有好几个像素集中区域时就会出现问题。

cv2.adaptiveThreshold

与常规的全局应用阈值不同,这里的(adaptiveThreshold)是调整式的应用阈值。它会应用局部的阈值来针对局部的像素来进行运算和判断。

此算法实现的基本思路,是对每一个像素的一定范围内的领域找一种平均值出来。然后用这个平均值减去一个常数,最后得到一个判据数值。然后在对比该像素与此判据数值的大小,并以此来判断该点是背景还是前景。对图像中所有点都应用此算法,最后得到一个新的图。如下图所示,计算图中红色所标识像素点是前景还是背景时,则需要综合计算黄色包围圈内所有像素的一种平均值来考虑。一般情况下,我们可以使用算数平均值或者高斯平均值,采用算数平均值时,该黄色包围圈内所有像素点对平均值的贡献一样,而使用高斯平均值时,在黄色包围圈内,距离该点越近,则对该点平均值的贡献越大。

我们可以看看opencv中adaptiveThreshold函数的原型:


void cv::adaptiveThreshold	(	
  InputArray 	src,
  OutputArray 	dst,
  double 	maxValue,
  int 	adaptiveMethod,
  int 	thresholdType,
  int 	blockSize,
  double 	C 
)	

其中,src, dst是输入图和输出图片,maxValue是判断为前景时填充的像素值,adaptiveMethod值的是前面提到的求相邻点平均值的算法。主要值的就是算数平均值和高斯平均值。thresholdType指的是如何填充0和maxValue的方法。或者是说,如何区分前背景的方法。至于后面的blockSize是前面提到算法中要采用的领域的大小。图示示例中,领域大小为7。C为计算出来平均值后再减去的那个常数。

更多基于神经网络的图形分割

对于一些更难以区分前背景的图片的应用场景,我们还可以使用人工智能的方法,把独立对象都识别出来,并给这些独立对象用于图形分段。此类方法已经超出此文要讨论问题(基于阈值)的范畴。要了解更多,请检索关键词:Mask R-CNN , U-Net segmentation network

发表评论

邮箱地址不会被公开。 必填项已用*标注