Python图像处理实战:利用OpenCV大津法实现灰度图自动抠图
本文介绍如何使用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 主程序

以上为个人经验分享,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













