图像二值化处理时图像处理过程中非常常见的一种操作,在python中比较常用的主要是opencv,pil两个第三库,对比来看的话,opencv使用要更加的方便灵活,
文本主要介绍以下基于opencv的图像二值化处理方法。
     首先我们来看一种比较简单的图像二值化处理方法。

全局阈值二值化

主要思路就是设置一个阈值,低于该阈值的像素置为0(黑色),高于该阈值的像素置为255(白色),下面来看代码

def image_binarization(img):
        # 将图片转为灰度图
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        # retval, dst = cv2.threshold(gray, 110, 255, cv2.THRESH_BINARY)
        # 最大类间方差法(大津算法),thresh会被忽略,自动计算一个阈值
        retval, dst = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
        cv2.imwrite('binary.jpg', dst)

cv2.threshold(src, thresh, maxval, type)

  • src:表示的是图片源
  • thresh:表示的是阈值(分割值)
  • maxval:表示的是最大值
  • type:表示的是这里划分的时候使用的是什么类型的算法,包含以下几种

Python二值化图像边缘检测 python 图像二值化_二值化


该函数有两个返回值,第一个retVal(得到的阈值),第二个就是阈值化后的图像。

上述方法较为简单,且运算效率较高,但是存在一个问题,如果你想批量处理一批文本图片,有的图片文本较深,有的图片文本较浅,那么你设置一个单一的阈值就会存在问题,如果阈值较小,那么颜色较浅的文本图片二值化过后内容会丢失,如果阈值较大,图片二值化处理后,文本内容很可能和背景融为一体较难区分。

阈值设置为70

Python二值化图像边缘检测 python 图像二值化_二值化_02

            

Python二值化图像边缘检测 python 图像二值化_opencv_03

                 处理前                                                                   处理后

阈值设置为110

Python二值化图像边缘检测 python 图像二值化_计算机视觉_04

                  

Python二值化图像边缘检测 python 图像二值化_二值化_05

               处理前                                                                   处理后

大津算法
cv2.threshold处理上述5种算子之外,还提供了一种可以根据图片像素自动计算阈值的一种方法,cv2.THRESH_OTSU(最大类间方差法,也叫大津算法),thresh会被忽略,自动计算一个阈值。

retval, dst = cv2.threshold(gray, 0, 255,  cv2.THRESH_BINARY | cv2.THRESH_OTSU)

Python二值化图像边缘检测 python 图像二值化_python_06

 

Python二值化图像边缘检测 python 图像二值化_python_07

                         处理前                                                                  处理后 

虽然该算子可以在一定程度上可以解决上述问题,但是该算子对于比较复杂的图片处理效果还是很不理想,尤其是一些明暗差异较大的图片,下面记录一种可以局部自适应的二值化的方法

局部阈值二值化

为了解决我们上述所说的问题,我们可以采用cv2.adaptiveThreshold方法进行二值化处理,函数的大致意思是以图片中的每个像素点为中心取他周围n*n的范围内的像素,然后根据这个区域内的像素值来计算出来一个阈值,决定当前像素点是处理成0还是255。

主要包含以下几个步骤

1. 加载图像
2. 转灰度图
3. 图像预处理(根据个人需求进行处理)
4. 二值化处理
5. 降噪(根据个人需求进行处理)

def image_binarization_part_situation(img):
    '''
    局部二值化
    :return:
    '''
    # 转灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 图像压缩(非必要步骤)
    new_gray = np.uint8((255 * (gray/255.0)**1.4))
    # 二值化
    dst = cv2.adaptiveThreshold(new_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 15, 1)
    # 中值滤波
    img_median = cv2.medianBlur(dst, 5)

核心函数

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)

src:需要进行二值化的一张灰度图像

maxValue:满足条件的像素点需要设置的灰度值。(将要设置的灰度值)

adaptiveMethod:自适应阈值算法。可选ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C

thresholdType:opencv提供的二值化方法,只能THRESH_BINARY或者THRESH_BINARY_INV

blockSize:要分成的区域大小,上面的N值,取奇数

C:常数,每个区域计算出的阈值的基础上在减去这个常数作为这个区域的最终阈值,可以为负数

dst:输出图像,可以忽略

Python二值化图像边缘检测 python 图像二值化_opencv_08

      

Python二值化图像边缘检测 python 图像二值化_opencv_09

     

Python二值化图像边缘检测 python 图像二值化_opencv_10

     

Python二值化图像边缘检测 python 图像二值化_opencv_11