通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

python 如何二值化图

python 如何二值化图

Python 二值化图像可以使用多种方法,包括opencv、PIL、scikit-image等库。二值化图像是将图像转换为仅包含两种颜色(通常是黑色和白色)的图像。常用的方法有全局阈值法、自适应阈值法、Otsu阈值法。 其中,opencv 提供了多种便捷的二值化方法,我们将详细介绍使用opencv进行图像二值化的方法。

一、全局阈值法

全局阈值法是最简单的二值化方法。它将图像中的像素值与一个全局阈值进行比较,大于阈值的像素被设置为白色,小于阈值的像素被设置为黑色。

1、使用 OpenCV 进行全局阈值法二值化

要使用 OpenCV 进行全局阈值法二值化图像,可以使用 cv2.threshold 函数。这个函数的参数包括源图像、阈值、最大值和阈值类型。以下是一个示例代码:

import cv2

读取灰度图像

image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

设置阈值

threshold_value = 127

进行二值化

_, binary_image = cv2.threshold(image, threshold_value, 255, cv2.THRESH_BINARY)

显示原图和二值化后的图像

cv2.imshow('Original Image', image)

cv2.imshow('Binary Image', binary_image)

cv2.waitKey(0)

cv2.destroyAllWindows()

在这个示例中,我们将阈值设置为127,意味着所有像素值大于127的部分将被设置为255(白色),其余部分将被设置为0(黑色)。

二、自适应阈值法

自适应阈值法根据图像的局部特征来确定阈值,适用于光照条件不均匀的图像。OpenCV 提供了 cv2.adaptiveThreshold 函数来实现自适应阈值法。

1、使用 OpenCV 进行自适应阈值法二值化

自适应阈值法有两种方法:均值法高斯法。以下是使用自适应阈值法进行图像二值化的示例代码:

import cv2

读取灰度图像

image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

进行自适应阈值二值化(均值法)

adaptive_thresh_mean = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C,

cv2.THRESH_BINARY, 11, 2)

进行自适应阈值二值化(高斯法)

adaptive_thresh_gaussian = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,

cv2.THRESH_BINARY, 11, 2)

显示原图和二值化后的图像

cv2.imshow('Original Image', image)

cv2.imshow('Adaptive Mean Thresholding', adaptive_thresh_mean)

cv2.imshow('Adaptive Gaussian Thresholding', adaptive_thresh_gaussian)

cv2.waitKey(0)

cv2.destroyAllWindows()

在这个示例中,我们使用了 cv2.ADAPTIVE_THRESH_MEAN_Ccv2.ADAPTIVE_THRESH_GAUSSIAN_C 两种方法来进行自适应阈值二值化。

三、Otsu 阈值法

Otsu 阈值法是一种自动确定全局阈值的方法。它通过最大化类间方差来找到最佳阈值。OpenCV 提供了 cv2.threshold 函数的一个选项来使用 Otsu 阈值法。

1、使用 OpenCV 进行 Otsu 阈值法二值化

以下是使用 Otsu 阈值法进行图像二值化的示例代码:

import cv2

读取灰度图像

image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

进行 Otsu 阈值二值化

_, otsu_thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

显示原图和二值化后的图像

cv2.imshow('Original Image', image)

cv2.imshow('Otsu Thresholding', otsu_thresh)

cv2.waitKey(0)

cv2.destroyAllWindows()

在这个示例中,我们将阈值设置为0,并使用 cv2.THRESH_BINARY + cv2.THRESH_OTSU 来启用 Otsu 阈值法。Otsu 阈值法会自动计算出最佳的阈值。

四、使用 PIL 进行图像二值化

Python 的 PIL(Pillow)库也可以用于图像二值化。PIL 提供了 Image.convert 方法来将图像转换为二值图像。

1、使用 PIL 进行全局阈值法二值化

以下是使用 PIL 进行全局阈值法二值化的示例代码:

from PIL import Image

读取图像

image = Image.open('image.jpg').convert('L')

进行二值化

threshold_value = 127

binary_image = image.point(lambda x: 255 if x > threshold_value else 0, '1')

显示原图和二值化后的图像

image.show()

binary_image.show()

在这个示例中,我们使用 Image.point 方法来进行二值化。这个方法接受一个函数作为参数,并将该函数应用到图像的每个像素上。

五、使用 scikit-image 进行图像二值化

scikit-image 是一个强大的图像处理库,提供了多种图像处理功能,包括二值化。scikit-image 提供了 threshold_otsu 函数来计算 Otsu 阈值,并提供了 threshold_local 函数来进行局部阈值处理。

1、使用 scikit-image 进行 Otsu 阈值法二值化

以下是使用 scikit-image 进行 Otsu 阈值法二值化的示例代码:

from skimage import io, color

from skimage.filters import threshold_otsu

读取灰度图像

image = io.imread('image.jpg', as_gray=True)

计算 Otsu 阈值

otsu_thresh_value = threshold_otsu(image)

进行二值化

binary_image = image > otsu_thresh_value

显示原图和二值化后的图像

io.imshow(image)

io.show()

io.imshow(binary_image)

io.show()

在这个示例中,我们使用 threshold_otsu 函数来计算 Otsu 阈值,并将图像进行二值化。

2、使用 scikit-image 进行自适应阈值法二值化

以下是使用 scikit-image 进行自适应阈值法二值化的示例代码:

from skimage import io, color

from skimage.filters import threshold_local

读取灰度图像

image = io.imread('image.jpg', as_gray=True)

计算局部阈值

block_size = 35

local_thresh = threshold_local(image, block_size, offset=10)

进行二值化

binary_image = image > local_thresh

显示原图和二值化后的图像

io.imshow(image)

io.show()

io.imshow(binary_image)

io.show()

在这个示例中,我们使用 threshold_local 函数来计算局部阈值,并将图像进行二值化。block_size 参数定义了局部区域的大小,offset 参数用于调整阈值的偏移量。

六、总结

在本文中,我们介绍了几种常用的图像二值化方法,包括全局阈值法、自适应阈值法和 Otsu 阈值法,并演示了如何使用 OpenCV、PIL 和 scikit-image 库实现这些方法。不同的方法适用于不同的场景,选择合适的方法可以提高图像处理的效果。

全局阈值法适用于光照条件均匀的图像,自适应阈值法适用于光照条件不均匀的图像,Otsu 阈值法适用于需要自动确定全局阈值的场景。通过实际应用和实验,可以更好地理解和掌握这些方法,提升图像处理的能力。

相关问答FAQs:

如何在Python中实现图像二值化?
在Python中,图像二值化可以通过使用OpenCV库来实现。您可以使用cv2.threshold()函数,该函数将图像转换为黑白图像。首先,您需要将图像读入为灰度图像,然后设置一个阈值,图像中所有高于该阈值的像素将被设置为白色,低于该阈值的像素将被设置为黑色。示例代码如下:

import cv2

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 应用阈值
_, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)

# 显示二值化图像
cv2.imshow('Binary Image', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

二值化图像有什么实际应用场景?
图像二值化广泛应用于各种计算机视觉任务中,如边缘检测、物体识别、文档图像处理等。在文档扫描中,通过二值化可以提取文本信息,提高OCR(光学字符识别)的准确性。在工业检测中,二值化有助于识别缺陷或识别产品的形状。

使用其他库进行图像二值化的方式有哪些?
除了OpenCV,PIL(Pillow)库也是处理图像的一个好选择。您可以使用Pillow中的convert()方法将图像转换为黑白模式,然后使用point()方法设置阈值。下面是一个简单的例子:

from PIL import Image

# 读取图像
image = Image.open('image.jpg').convert('L')

# 应用阈值
threshold = 127
binary_image = image.point(lambda p: 255 if p > threshold else 0)

# 显示二值化图像
binary_image.show()

通过这些方法,您可以灵活地选择适合您需求的库和方法来进行图像二值化。

相关文章