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

相关推荐

  • sqlserver发送邮件给多人_sql server登录

    sqlserver发送邮件给多人_sql server登录– BI EMAIL declare @CC varchar(10),@MAIL varchar(500), @str varchar(800),@year varchar(4),@month va

    2022-12-28
    171
  • (3)SQL Server表分区「终于解决」

    (3)SQL Server表分区「终于解决」1.简介 当一个表数据量很大时候,很自然我们就会想到将表拆分成很多小表,在执行查询时候就到各个小表去查,最后汇总数据集返回给调用者加快查询速度。比如电商平台订单表,库存表,由于长年累月读写较多,积累数

    2023-02-15
    147
  • MongoDB用户相关[通俗易懂]

    MongoDB用户相关[通俗易懂]1.用户权限结构图 2.可以优先创建标红的MongoDB用户 3.创建用户命令列表 创建用户一定要在具体的db下执行 use admin Root用户: db.createUser({user:”r…

    2023-02-13
    165
  • Redis 的基本特性和 5 个常用数据结构

    Redis 的基本特性和 5 个常用数据结构[TOC] 1. 基本特性 速度快 基于 C 语言开发,源码短小精悍 数据存在内存中 单线程(高性能) 支持数据持久化,异步保存到磁盘 丰富的数据结构(key-value):string、list、…

    2023-03-09
    162
  • 线上千万级大表排序优化

    线上千万级大表排序优化前言   大家好我是不一样的科技宅,每天进步一点点,体验不一样的生活,今天我们聊一聊Mysql大表查询优化,前段时间应急群有客服反馈,会员管理功能无法按到店时间、到店次数、消费金额 进行排序。经过排…

    2023-02-03
    150
  • mysql中多表查询_数据库多表查询sql语句

    mysql中多表查询_数据库多表查询sql语句第06章 MySQL多表查询 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了

    2023-04-29
    142
  • 【MySQL】笔记(4)-[亲测有效]

    【MySQL】笔记(4)-[亲测有效]8.7、索引的实现原理:通过B Tree缩小扫描范围,底层索引进行了排序,分区,索引会携带数据在表中的“物理地址”,最终通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位表中的数据,效率是

    2023-05-01
    128
  • MySQL 8.0_dns-list

    MySQL 8.0_dns-list转载自公众号:玩转MySQL 作者:洪斌 MySQL Router 是 InnoDB Cluster 架构的访问入口,在架构部署上,官方给出的建议是 router 与应用端绑定部署,避免 route…

    2023-01-27
    138

发表回复

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