图像的二值处理

在图像处理中,图像二值处理有两种常见的方法:

  1. 全局阈值二值化:
      全局阈值二值化是一种简单的二值处理方法,基于设定的全局阈值将图像中的像素值划分为两个类别:黑色(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
      全局阈值二值化的作用是将图像转换为只有两个取值的二值图像,简化图像信息,突出目标物体的形状和边缘。它常用于物体检测、字符识别、图像分割等场景。
  1. 自适应阈值二值化:
      自适应阈值二值化是一种根据局部像素灰度值动态调整阈值的二值化方法。不同于全局阈值二值化使用固定阈值,自适应阈值二值化根据像素周围的局部区域灰度值的统计信息来确定每个像素的阈值。具体步骤如下:
  • 将图像划分为多个局部区域(如图像的小块或滑动窗口)。
  • 针对每个局部区域,计算局部区域内像素的平均值或高斯加权平均值作为该区域的阈值。
  • 对图像中的每个像素,将其与对应局部区域的阈值进行比较,并根据比较结果将其设置为黑色或白色。
      自适应阈值化的推导公式,假设图像的局部区域大小为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()
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Make_magic

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值