在图像处理中,图像二值处理有两种常见的方法:
- 全局阈值二值化:
全局阈值二值化是一种简单的二值处理方法,基于设定的全局阈值将图像中的像素值划分为两个类别:黑色(0)和白色(255)。其原理是通过比较每个像素的灰度值与全局阈值的大小来确定其所属类别。具体步骤如下:
- 选择一个全局阈值。
- 遍历图像中的每个像素,将像素灰度值与阈值进行比较。
- 如果像素灰度值大于阈值,则将其设置为白色;如果像素灰度值小于等于阈值,则将其设置为黑色。
- 重复上述步骤,直到处理完所有像素。
全局阈值化的推导公式,假设全局阈值为T,将图像像素灰度值大于T的像素设置为白色(255),像素灰度值小于等于T的像素设置为黑色(0),全局阈值化公式:
P ( x , y ) = { 255 , if P ( x , y ) > T 0 , otherwise P(x, y) = \begin{cases} 255, & \text{if } P(x, y) > T \\ 0, & \text{otherwise} \end{cases} P(x,y)={255,0,if P(x,y)>Totherwise
全局阈值二值化的作用是将图像转换为只有两个取值的二值图像,简化图像信息,突出目标物体的形状和边缘。它常用于物体检测、字符识别、图像分割等场景。
- 自适应阈值二值化:
自适应阈值二值化是一种根据局部像素灰度值动态调整阈值的二值化方法。不同于全局阈值二值化使用固定阈值,自适应阈值二值化根据像素周围的局部区域灰度值的统计信息来确定每个像素的阈值。具体步骤如下:
- 将图像划分为多个局部区域(如图像的小块或滑动窗口)。
- 针对每个局部区域,计算局部区域内像素的平均值或高斯加权平均值作为该区域的阈值。
- 对图像中的每个像素,将其与对应局部区域的阈值进行比较,并根据比较结果将其设置为黑色或白色。
自适应阈值化的推导公式,假设图像的局部区域大小为N×N,对每个像素点P(x, y),计算其局部区域的平均灰度值avg。将avg作为阈值,将像素灰度值大于avg的像素设置为白色(255),像素灰度值小于等于avg的像素设置为黑色(0),自适应阈值化公式:
P ( x , y ) = { 255 , if P ( x , y ) > avg 0 , otherwise P(x, y) = \begin{cases} 255, & \text{if } P(x, y) > \text{avg} \\ 0, & \text{otherwise} \end{cases} P(x,y)={255,0,if P(x,y)>avgotherwise
其中,avg表示局部区域的平均灰度值。
自适应阈值二值化的作用是在处理具有不均匀光照或背景复杂的图像时,能够更好地适应局部灰度变化,提高二值化效果。它常用于文档图像处理、光学字符识别(OCR)、图像增强等场景。
总体而言,图像二值处理的作用是将灰度图像转换为只有两种取值(黑色和白色)的二值图像,突出目标物体的形状和边缘,简化图像信息。这在许多计算机视觉任务中是很有用的,如物体检测、字符识别、图像分割等。具体选择使用哪种二值处理方法取决于图像的特性和所需的应用场景。
二值处理的代码实现过程如下所示:
import cv2
import matplotlib.pyplot as plt
class ImageProcessing:
def __init__(self,image_path):
self.image_path=image_path
self.img_gray = None # 存储灰度图像的成员变量
def To_Gray(self):
img=cv2.imread(self.image_path,flags=1)# 读取彩色图像(BGR)
if img is None:
print('Unable to load image!')
return
else:
img_gray=cv2.imread(self.image_path,flags=0)# flags=0 读取为灰度图像
return img_gray
def To_Binary(self):
if img_gray is None:
print('Gray image is not available!')
else:
ret1, img1 = cv2.threshold(img_gray, 63, 255, cv2.THRESH_BINARY) # 转换为二值图像, thresh=63
ret2, img2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY) # 转换为二值图像, thresh=127
ret3, img3 = cv2.threshold(img_gray, 191, 255, cv2.THRESH_BINARY) # 转换为二值图像, thresh=191
ret4, img4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV) # 逆二值图像,BINARY_INV
ret5, img5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC) # TRUNC 阈值处理,THRESH_TRUNC
ret6, img6 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO) # TOZERO 阈值处理,THRESH_TOZERO
self.display_images(img1, img2, img3, img4, img5, img6)
def display_images(self,img1, img2, img3, img4, img5, img6):
title_list = ["1. BINARY(thresh=63)", "2. BINARY(thresh=127)", "3. BINARY(thresh=191)",
"4. THRESH_BINARY_INV", "5. THRESH_TRUNC", "6. THRESH_TOZERO"]
image_list = [img1, img2, img3, img4, img5, img6] # 假设这里是图像列表
plt.figure(figsize=(9, 6))
for i in range(len(image_list)):
plt.subplot(2, 3, i+1)
plt.title(title_list[i])
plt.axis('off')
plt.imshow(image_list[i], 'gray')
plt.show()
if __name__ == '__main__':
imgfile="./Images/lena.jpg"
img=ImageProcessing(imgfile)
img_gray=img.To_Gray()
img.To_Binary()