计算机视觉基础-图像处理之图像分割/二值化

阈值分割基本概念

二值化就是让图像的像素点矩阵中的每个像素点的灰度值为0(黑色)或者255(白色),也就是让整个图像呈现只有黑和白的效果,在灰度化的图像中灰度值的范围为0~255,在二值化后的图像中的灰度值范围是0或者255。图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。一般采用阈值分割法。
**阈值分割法分为全局阈值法和局部阈值分割法。**所谓局部阈值分割法是将原始图像划分成较小的图像,并对每个子图像选取相应的阈值。在阈值分割后,相邻子图像之间的边界处可能产生灰度级的不连续性,因此需用平滑技术进行排除。局部阈值法常用的方法有灰度差直方图法、微分直方图法。局部阈值分割法虽然能改善分割效果,但存在几个缺点:
  (1)每幅子图像的尺寸不能太小,否则统计出的结果无意义。
  (2)每幅图像的分割是任意的,如果有一幅子图像正好落在目标区域或背景区域,而根据统计结果对其进行分割,也许会产生更差的结果。
  (3)局部阈值法对每一幅子图像都要进行统计,速度慢,难以适应实时性的要求。

全局阈值分割方法在图像处理中应用比较多,它在整幅图像内采用固定的阈值分割图像。经典的阈值选取以灰度直方图为处理对象。根据阈值选择方法的不同,可以分为模态方法、迭代式阈值选择等方法。这些方法都是以图像的直方图为研究对象来确定分割的阈值的。另外还有类间方差阈值分割法、二维最大熵分割法、模糊阈值分割法、共生矩阵分割法、区域生长法等等。

最大类间方差法(大津法)、自适应阈值分割的原理

最大类间方差法(大津法)

最大类间方差法(大津法),简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像分为前景和背景两个部分。当取最佳阈值时,两部分之间的差别应该是最大的,在OTSU算法中所采用的衡量差别的标准就是较为常见的最大类间方差。前景和背景之间的类间方差如果越大,就说明构成图像的两个部分之间的差别越大,当部分目标被错分为背景或部分背景被错分为目标,都会导致两部分差别变小,当所取阈值的分割使类间方差最大时就意味着错分概率最小。

应用: 是求图像全局阈值的最佳方法,应用不言而喻,适用于大部分需要求图像全局阈值的场合。

优点: 计算简单快速,不受图像亮度和对比度的影响。

缺点: 对图像噪声敏感;只能针对单一目标分割;当目标和背景大小比例悬殊、类间方差函数可能呈现双峰或者多峰,这个时候效果不好。

自适应阈值

前面介绍了OTSU算法,但这算法属于全局阈值法,所以对于某些光照不均的图像,这种全局阈值分割的方法会显得苍白无力,如下图:
计算机视觉基础-图像处理之图像分割/二值化_第1张图片
显然,这样的阈值处理结果不是我们想要的,那么就需要一种方法来应对这样的情况。

这种办法就是自适应阈值法(adaptiveThreshold),它的思想不是计算全局图像的阈值,而是根据图像不同区域亮度分布,计算其局部阈值,所以对于图像不同区域,能够自适应计算不同的阈值,因此被称为自适应阈值法。(其实就是局部阈值法)

如何确定局部阈值呢?可以计算某个邻域(局部)的均值、中值、高斯加权平均(高斯滤波)来确定阈值。值得说明的是:如果用局部的均值作为局部的阈值,就是常说的移动平均法。

OpenCV框架下上述阈值分割算法API的代码

def img_threshold(img):
    '''
    task04 图像滤波
    :param img:
    :return:
    '''
    # 灰度处理
    GrayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # 自适应阈值
    adaptive_img = cv2.adaptiveThreshold(GrayImage,  # 原图像
                                         255,  #  当像素值高于(有时是小于)阈值时应该被赋予的新的像素值
                                         cv2.ADAPTIVE_THRESH_GAUSSIAN_C,  # CV_ADAPTIVE_THRESH_MEAN_C 或 CV_ADAPTIVE_THRESH_GAUSSIAN_C
                                         cv2.THRESH_BINARY,  # 取阈值类型   CV_THRESH_BINARY或CV_THRESH_BINARY_INV
                                         11,  # 用来计算阈值的象素邻域大小: 3, 5, 7, ...
                                         2  # 指与方法有关的参数
                                         )
    ret, threshold_img = cv2.threshold(
                                        GrayImage,  # 原图像
                                        0, # 阈值0,OTSU会自动寻找阈值
                                        255,  # 高于阈值时赋予的新值
                                        cv2.THRESH_OTSU  # 大津算法
                                        )
    print("shape1 : ",adaptive_img.shape)
    print("shape2 : ",threshold_img.shape)

    cv2.imshow('box_filter', adaptive_img)
    cv2.imshow('blur_filter', threshold_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    img = cv2.imread('./xiabang.jpg', cv2.IMREAD_UNCHANGED)
    print('Original Dimensions : ',img.shape)
    img_threshold(img)

你可能感兴趣的:(基础,图像处理,算法,python,计算机视觉)