Python图像二值化

Python图像二值化a href=”https://beian.miit.gov.cn/”苏ICP备2023018380号-1/a Copyright www.python100.com .Some Rights Reserved.

引言

图像二值化是指将一张输入图像的所有像素点的灰度值转换成黑色或白色的过程。这是图像处理中最常用的操作之一。在一张输入图像中通过二值化,我们可以将目标图像中的多余信息进行过滤,保留出我们需要的信息,如字符识别、边缘检测等。 在这篇文章中,我们将介绍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中使用这些方法进行图像二值化的常用手段。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/21043.html

(0)
上一篇 2024-05-09
下一篇 2024-05-10

相关推荐

  • Python实现删除指定元素

    Python实现删除指定元素 Python语言简单易学,语法简洁,运行效率高,拥有丰富的第三方库。Python可以应用于多种场景,包括自动化脚本、数据分析、机器学习、Web开发等等。本文将重点讲解在Python中如何删除指定元素。

    2024-06-13
    34
  • 数据库产品引入及输出「建议收藏」

    数据库产品引入及输出「建议收藏」有同学咨询如何引入及应用数据库产品,对比简单列了一下相应的阶段,及对应输出的文档。 阶段 工具项描述 输出 选型阶段 1.确认要选型的数据库产品类型 2.确认需要对比的同类数据库产品 各位产品的市分…

    2023-01-24
    127
  • ORACLE 12C创建wm_concat函数

    ORACLE 12C创建wm_concat函数0.首先使用dba用户登录数据库,并解锁wmsys用户 alter user wmsys account unlock; 1.用WMSYS用户登录,不知道密码可以修改其密码 alter user wm

    2023-03-22
    1.6K
  • Python中args的含义

    Python中args的含义在Python的函数定义中,如果我们想要传入不定数量的参数,可以使用args。在这篇文章中,我们将详细介绍Python中args的含义以及如何使用它来实现不定数量参数的传递。

    2024-05-27
    39
  • Python移位操作指南

    Python移位操作指南Python是一种高级编程语言,可以轻松地处理各种数据类型。然而,在一些特殊场景下,常规的算术操作可能不足以满足需求。这时,移位操作就派上用场了。移位操作可以让我们快速高效地处理二进制位的变化。本篇文章将介绍Python的移位操作,并且提供详细的代码示例。

    2024-04-15
    52
  • 10万字208道Java经典面试题总结(附答案)「终于解决」

    10万字208道Java经典面试题总结(附答案)「终于解决」1、JDK和JRE有什么区别?JDK(JavaDevelopmentKit),Java开发工具包JRE(JavaRuntimeEnvironment),Java运行环境JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。2、==和equals的区别是什么?对于基本类型,==比较的是值; 对于引用类型,==比较的是地址; equals不能用于基本类型的比较; 如果没有重写equa

    2023-03-02
    114
  • DB concept 恢复系统[通俗易懂]

    DB concept 恢复系统[通俗易懂]aries 减少恢复时间 减少检查点开销 避免重做日志冗余重做 减少日质量 LSN:日志序列号,标识操作在页上实施 物理逻辑redo,物理上标识受影响的页,页内逻辑 脏页表:内存已更新,未刷盘,减少…

    2023-04-06
    142
  • Python中指数函数的完全指南

    Python中指数函数的完全指南指数函数是数学里一种常见的函数类型。在Python语言中,指数函数可以使用math库中的exp()函数实现。exp()函数以e为底数,返回e的x次方的值。

    2024-04-05
    52

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注