图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。 百度百科
在介绍二值化算法之前,首先来引入阈值的概念:
【阈值】:阈值是在图像分割时作为区分物体与背景像素的门限,大于或等于阈值的像素属于物体,而其他像素属于背景。这种方法对于在物体与背景之间存在明显差别(对比)的景物分割十分有效。实际上,在任何实际应用的图像处理系统中,都要直接或间接用到阈值化技术,为了有效地分割物体与背景,人们发展了各种各样的阈值处理技术,包括全局阈值、自适应阈值等等。
【阈值化】:阈值化是指输入图像g到输出图像G的如下变换:

为了显示方便,也常常如下变换(因为1太暗和0难以区分)

图像处理中常用的二值化通常采用阈值化来完成。
【全局阈值】全局阈值是指整幅图像使用同一个阈值来处理,适用于背景和前景有明显对比的图像。
【自适应阈值】在许多情况下,物体和背景的对比度在图像中不是各处一样的,这时很难用统一的一个阈值来将物体和背景分开。这时可以根据图像的局部特征分别采用不同的阈值来进行处理。实际处理时,需要按照具体问题将图像分成若干子区域分别选择阈值,或者动态地根据一定的邻域范围选择各点处的阈值。
【代码实现】
1.读取灰度图像
%matplotlib inlineimport matplotlib as mplimport matplotlib.pyplot as pltimport numpy as npimport imageiofrom _utils import *# Input and normalize to [0, 1]img_in = imageio.imread('../_data/woman02.png')# Relight input images, t = np.mgrid[1:0:512j, 0:1:512j]**(1/2.2)img_in = (np.min(img_in, axis=2) + s*t*255)//2img_in = img_in.astype('uint8')# Visualizationhistogram(img_in, bins=2**8, interval=[0, 255])

2.全局阈值实现
T = 127img_gt = img_in > T# Visualizationhistogram(img_gt, bins=2**8, interval=[0, 1])

3.自适应阈值实现
阈值为该像素周围半径r内的邻域像素值均值减去常数C,公式如下:

# Parameters "constant" (C) and "radius" (r)C = 3r = 13# Imaging padding based on radius rimg_pad = np.pad(img_in,((r, r), (r, r)),'edge')# Init output imageimg_at = img_pad.copy()m, n = img_in.shapefor i in range(r, m + r):for j in range(r, n + r):block = img_pad[i-r:i+r+1,j-r:j+r+1]T = np.mean(block) - Cimg_at[i, j] = img_pad[i, j] > Thistogram(img_at[r:-r,r:-r], bins=2**8, interval=[0, 1])


