Python图像处理实战:利用OpenCV大津法实现灰度图自动抠图

一颗松果
一颗松果
发布时间:2026-10-12| 6人浏览过
原创

本文介绍如何使用Python和OpenCV库,通过大津法(OTSU)算法实现灰度图的自动抠图。详细解析了利用cv2.threshold函数配合THRESH_OTSU参数进行图像二值化的原理与代码实现,并展示了原图、直方图及分割结果的对比。同时指出该算法对噪音和目标大小敏感,适用于背景与前景差异明显的场景,为初学者提供简洁高效的图像处理方案。

一行代码实现灰度图抠图

图像抠图是Photoshop中的基础技能,而在Python中,仅需一行关键代码即可完成基于灰度图的自动抠图处理。

其核心算法基于大津法(Otsu's method),该方法用于确定图像二值化的最佳分割阈值,旨在将图像划分为背景和前景两个部分,并最大化两者之间的类间方差,从而实现最优分割。

关于大津法的详细数学理论可自行查阅相关资料。在代码实现层面,只需在调用cv2.threshold函数时,将参数设置为THRESH_OTSU,即可启用大津法进行自动阈值分割。

ret1, th1 = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)

完整代码示例如下,程序将原始图像、灰度直方图以及分割后的二值化图像并列展示,以便直观对比处理效果。

image = cv2.imread("pictures/dajin.jpg")
#先转化为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

plt.subplot(131), plt.imshow(image, "image")
plt.title("source image"), plt.xticks([]), plt.yticks([])

plt.subplot(132), plt.hist(image.ravel(), 256)
plt.title("Histogram")

ret1, th1 = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) #方法选择为THRESH_OTSU

plt.subplot(133), plt.imshow(th1, "gray")
plt.title("OTSU,threshold is " + str(ret1)), plt.xticks([]), plt.yticks([])

plt.show()

最终的抠图结果展示如下。

需要注意的是,这种基于全局阈值的算法对图像噪声和目标物体大小较为敏感。当背景与前景的像素分布较为接近时,分割效果可能不佳,容易出现误判。

Python抠图程序源码

本文基于零基础学习Python的练习需求,在听完若干节免费入门课程后,即兴编写了此程序,旨在通过实践掌握图像抠图技术。

传统手工抠图操作通常涉及在Photoshop等软件中复制图片、新建图层并粘贴,保留主体对象,随后手动擦除周围背景区域。

被擦除的区域需设置为透明格式,最终保存为PNG格式文件以便后续使用(PNG格式支持图层存储及透明区域)。手工操作不仅费力费时,且容易因操作失误需重新擦除,精度高度依赖操作者的熟练程度。即使是熟练用户,处理一个人物对象的边缘也需要数分钟时间。

相比之下,Python语言可以便捷地调用第三方功能包来实现抠图目的。对于主体对象周边较为平滑的图像,程序执行仅需几秒钟,极大地节省了人力和时间成本。

准备工作

若要使用特定的第三方功能包removebg进行抠图,需先完成安装。在Windows系统中,可通过Win+R热键调出运行对话框,输入cmd命令打开DOS窗口(命令行界面)。

在DOS窗口中输入以下命令并回车执行: pip install removebg 等待下载安装完成后即可使用。os包和time包为Python系统自带模块,无需额外安装。

调用RemoveBg函数时,需要提供APIKEY作为实参(可视为访问密码),这是一个多位字符串。获取该密钥需前往url = www.remove.bg网站注册账号,并申请免费APIKEY。需注意,免费账户每日仅允许处理50张图片,存在一定限制。

程序构思与设计

1)程序设计要求支持批量处理多张jpg格式图片,显示运行进度条,提供适当的用户交互界面,并最终打包为exe可执行文件发布。

2)核心处理单张图片的关键代码仅包含两行:

rmbg = RemoveBg('apiKey码', '错误信息记录文件名')  #56行

首先向服务器发出获取API调用对象的请求,并返回相应的对象实例。

rmbg.remove_background_from_img_file('./picture/' + item)  #74行

随后使用该rmbg对象提供的方法,执行具体的抠图操作。

3)程序包含检查图片存放位置的逻辑:判断目标文件夹是否存在,若不存在则创建该文件夹并退出程序。

4)检查文件夹中是否包含文件,若无文件则显示提示信息并退出;若有文件,则重新建立列表以剔除非jpg格式的文件。

5)对图片检查与抠图处理定义了多个独立函数,旨在避免程序逻辑混乱,提高代码的可读性和维护性。

  • readkey() -- 负责读取APIkey码文件;
  • founddir() -- 检查存放图片文件的文件夹是否存在,若不存在可发出提示信息;
  • Cutout() -- 执行抠图操作,包含检查图片文件是否存在、剔除非jpg格式文件的功能,并伴有相应的提示信息;

6)主程序段位于代码最后,明确提示操作准备情况,并通过交互询问用户是否继续执行或取消操作。

7)打包成exe文件的过程在此略去不述。

完整代码截图如下,每条语句均附有功能注释,便于理解。

1 引用有关处理包

2 定义一个函数,用于从附带文件中读取apikye码值

3. 定义搜索目录的函数,返回真/假结果。

4 定义抠图处理的主函数

4 主程序

以上为个人经验分享,希望能给大家一个参考,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。