引言

图像二值化是指将一张输入图像的所有像素点的灰度值转换成黑色或白色的过程。这是图像处理中最常用的操作之一。在一张输入图像中通过二值化,我们可以将目标图像中的多余信息进行过滤,保留出我们需要的信息,如字符识别、边缘检测等。

在这篇文章中,我们将介绍Python图像二值化。我们将探讨一些基本的二值化方法,并介绍如何使用不同的Python库(如PIL、OpenCV等)来实现图像二值化操作。

方法介绍

在这一部分,我们将介绍一些基本的图像二值化方法。

全局阈值二值化

全局阈值二值化是指,在一张输入图像中,确定一个全局阈值,然后将所有像素点的灰度值进行比较,当灰度值大于全局阈值的时候将像素点设为白色,反之则为黑色。

这种方法的实现比较简单,在Python中可以使用OpenCV库实现:

import cv2

img = cv2.imread('image.png', 0)
ret, thresh_binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

以上代码中,我们首先使用cv2.imread()函数读取输入图像。然后,我们使用cv2.threshold()函数对图像进行阈值处理,其中参数127是我们的阈值,同时使用了cv2.THRESH_BINARY表示我们对阈值处理后的结果进行二值化。

局部阈值二值化

与全局阈值二值化不同,局部阈值二值化方法的阈值并不是在整个图像中一次性确定的。相反,我们使用移动窗口方法,在图像中选取小的区域,对区域内的像素进行阈值处理并且二值化。

OpenCV同样提供了局部阈值二值化的函数adaptiveThreshold():

import cv2

img = cv2.imread('image.png', 0)
thresh_binary = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)

以上代码中,我们使用cv2.adaptiveThreshold()函数将输入图像二值化。其中参数cv2.ADAPTIVE_THRESH_MEAN_C是指使用均值计算阈值,而参数11和2则表示所选取的小窗口是一个11*11的矩形,并且阈值的计算方法为平均值加上2倍的标准差。

OTSU二值化

Otsu二值化方法使用了一种自适应的阈值选择方法,该方法通过分析整个输入图像的灰度值直方图并计算它的方差,来确定最适合的全局阈值。

使用OpenCV库实现Otsu二值化同样非常简单:

import cv2

img = cv2.imread('image.png', 0)
ret, thresh_binary = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

以上代码中,我们调用cv2.threshold()函数并使用了cv2.THRESH_OTSU表示我们使用了Otsu方法去计算全局阈值。

Python库的选择

除了OpenCV之外,Python中还有一些很常用的图像库,如Pillow和Scipy。

Pillow是Python中一个非常流行的图像库,它提供了许多简单易用的图像处理工具,如图像打开、剪切、旋转、缩放等功能。

Scipy是一个专注于科学计算的Python库,它提供了很多工具来处理图像数据,例如图像滤波、分割以及二值化等。

Pillow库

Pillow库提供了一些简单易用的图像处理操作,包括图像打开、通道分离、旋转和缩放等。但是Pillow库的图像二值化支持不如OpenCV库那么全面。

from PIL import Image

img = Image.open('image.png').convert('L')
img = img.point(lambda x: 0 if x < 128 else 255, '1')

以上代码中,我们首先使用PIL库中的Image.open()函数打开图片,然后使用img.convert()函数将图片转换为灰度图像。接下来我们使用lambda函数将像素值小于128的设为0,大于等于128的设为255。最后我们使用img.point()函数使修改的点生效。

Scipy库

Scipy库提供了几种不同的图像二值化方法,包括Global thresholding、Local thresholding以及Otsu thresholding。

import numpy as np
import scipy.misc
from scipy.ndimage import gaussian_filter
from scipy import ndimage
import matplotlib.pyplot as plt
from skimage.filters import threshold_otsu, threshold_local

img = scipy.misc.face(gray=True)
blurred = gaussian_filter(img, 4)
local_thresh = threshold_local(blurred, block_size=81, offset=20)
binary_local = img > local_thresh

otsu_thresh = threshold_otsu(blurred)
binary_otsu = img > otsu_thresh

fig, ax = plt.subplots(1, 3, figsize=(14, 8))
ax[0].imshow(img, cmap=plt.cm.gray)
ax[0].set_title('Original')
ax[1].imshow(binary_local, cmap=plt.cm.gray)
ax[1].set_title('Local thresholding')
ax[2].imshow(binary_otsu, cmap=plt.cm.gray)
ax[2].set_title('Global thresholding')

for a in ax:
    a.axis('off')

plt.show()

以上代码中,我们首先使用Scipy中的scipy.misc.face()函数来读取图片,然后使用了几个不同的阈值处理方法对其进行了二值化。最后生成了一副展示三种不同阈值处理方法效果的图片。

总结

在这篇文章中,我们介绍了图像二值化方法的基础知识和一些常见的实现方式。此外,我们探讨了Python中不同的图像处理库(如OpenCV、Pillow、Scipy),并使用这些库的实现方式演示了如何应用不同的方法进行图像二值化处理。

通过这里的学习,你应该对不同的二值化方法有了更深刻的了解,并且也了解了Python中使用这些方法进行图像二值化的常用手段。