OpenCV和PIL进行前景提取
摘要
在图像处理和分析中,前景提取是一项关键技术,尤其是在计算机视觉和模式识别领域。本文介绍了一种结合OpenCV和PIL库的方法,实现在批量处理图像时有效提取前景并保留原始图像的EXIF数据。具体步骤包括从指定文件夹中读取图像,进行前景提取和处理,然后将结果保存到另一个文件夹,同时保持图像的元数据信息。


代码实现步骤
这段代码实现了从指定文件夹中批量读取图像,进行前景提取和处理,并将结果保存到另一个文件夹,同时保留原始图像的EXIF信息。以下是代码的详细解释:
导入必要的库
import cv2
import numpy as np
from PIL import Image
import glob
import os
from pathlib import Path
import tqdm
cv2: OpenCV库,用于图像处理。numpy: 数值计算库,用于处理数组操作。PIL: Python图像库,用于处理图像文件和EXIF数据。glob: 文件名模式匹配库,用于查找符合特定模式的文件路径名。os: 操作系统接口,用于文件和目录操作。Path: pathlib库的一部分,用于处理文件路径。tqdm: 进度条库,用于显示处理进度。
设置文件夹路径和创建输出文件夹
folder_path = r'C:\Users\cdh96\Desktop\iphone11\*.jpg'
output_folder = r'D:\lab\paper\img_preproccess\extrat_foreground\1\images'if not os.path.isdir(output_folder):os.mkdir(output_folder)
folder_path: 输入图像文件夹路径。output_folder: 输出图像文件夹路径。如果输出文件夹不存在,则创建它。
处理图像
for image_path in tqdm.tqdm(glob.glob(folder_path)):path_obj = Path(image_path)image_path = path_obj.as_posix()img_original = cv2.imread(image_path)if img_original is None:breakimg_original = cv2.cvtColor(img_original, cv2.COLOR_RGB2BGR)img_gray = cv2.imread(image_path, 0)
- 使用
glob库获取所有符合条件的图像路径,并使用tqdm显示进度条。 - 使用
cv2.imread读取图像,如果图像为空,退出循环。 - 将图像转换为BGR格式,并读取灰度图像。
前景提取和处理
output_path = os.path.join(output_folder, path_obj.name)retval, img_global = cv2.threshold(img_gray, 30, 255, cv2.THRESH_BINARY)img_global[img_global > 0] = 1kernel = np.ones((3, 3), dtype=np.uint8)img_global = cv2.morphologyEx(img_global, cv2.MORPH_OPEN, kernel, iterations=4)num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(img_global, connectivity=8)sorted_indices = np.argsort(stats[:, -1])labels[labels != sorted_indices[-2]] = 0labels[labels == sorted_indices[-2]] = 1img_original = img_original * np.repeat(labels[:, :, np.newaxis], 3, axis=-1)img_original = cv2.convertScaleAbs(img_original)image_rgb = cv2.cvtColor(img_original, cv2.COLOR_BGR2RGB)
- 使用全局阈值法提取前景。
- 使用形态学操作去除噪点。
- 使用连通组件分析提取主要前景区域。
- 根据连通组件的面积排序,选取面积第二大的组件作为主要前景。
- 生成前景掩码并应用到原始图像。
保存处理后的图像并保留EXIF数据
cv2.imwrite(output_path, image_rgb)with Image.open(r'D:\lab\paper\img_preproccess\extrat_foreground\1\DSC00421.JPG') as img:exif_data = img.info.get('exif')with Image.open(output_path) as img:img.save(output_path, 'JPEG', exif=exif_data)
- 保存处理后的图像。
- 从示例图像中提取EXIF数据,并应用到处理后的图像中。
这个过程确保了前景的提取和处理,同时保留了原始图像的EXIF元数据,使得图像在保存时保留原始的拍摄信息。
整体代码
import cv2
import numpy as np
from PIL import Image
import glob
import os
from pathlib import Path
import tqdmfolder_path = r'C:\Users\cdh96\Desktop\iphone11\*.jpg'
output_folder = r'D:\lab\paper\img_preproccess\extrat_foreground\1\images'if not os.path.isdir(output_folder):os.mkdir(output_folder)for image_path in tqdm.tqdm(glob.glob(folder_path)):path_obj = Path(image_path)image_path = path_obj.as_posix()img_original = cv2.imread(image_path)if img_original is None:breakimg_original = cv2.cvtColor(img_original, cv2.COLOR_RGB2BGR)img_gray = cv2.imread(image_path, 0)output_path = os.path.join(output_folder,path_obj.name)# 分割retval, img_global = cv2.threshold(img_gray, 30, 255, cv2.THRESH_BINARY)img_global[img_global > 0] = 1# 处理毛刺kernel = np.ones((3, 3), dtype=np.uint8)img_global = cv2.morphologyEx(img_global, cv2.MORPH_OPEN, kernel, iterations=4)# 根据面积选取主体num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(img_global, connectivity=8)sorted_indices = np.argsort(stats[:, -1])# 使用masklabels[labels != sorted_indices[-2]] = 0labels[labels == sorted_indices[-2]] = 1img_original = img_original * np.repeat(labels[:, :, np.newaxis], 3, axis=-1)img_original = cv2.convertScaleAbs(img_original)image_rgb = cv2.cvtColor(img_original, cv2.COLOR_BGR2RGB)cv2.imwrite(output_path, image_rgb)# # 存储原始的图像信息with Image.open(r'D:\lab\paper\img_preproccess\extrat_foreground\1\DSC00421.JPG') as img:exif_data = img.info.get('exif')with Image.open(output_path) as img:img.save(output_path, 'JPEG', exif=exif_data)相关文章:
OpenCV和PIL进行前景提取
摘要 在图像处理和分析中,前景提取是一项关键技术,尤其是在计算机视觉和模式识别领域。本文介绍了一种结合OpenCV和PIL库的方法,实现在批量处理图像时有效提取前景并保留原始图像的EXIF数据。具体步骤包括从指定文件夹中读取图像,…...
Linux虚拟化大师:使用 KVM 和 QEMU 进行高级虚拟化管理
Linux 虚拟化大师:使用 KVM 和 QEMU 进行高级虚拟化管理 虚拟化技术是现代数据中心的核心技术之一,它可以将一台物理服务器分割成多个虚拟机,从而提高资源利用率,降低成本,并增强系统的灵活性和可扩展性。KVM…...
CentOS-6的iso下载地址镜像yum源
CentOS6下载地址镜像yum源 从 CentOS官网 Vault Mirror 过期镜像库下载 下载iso光盘镜像,使用其提供的yum源 vault:保险库,墓穴 , Vault Mirror 是官方对过期镜像库的取名 CentOS官网 Vault Mirror 过期镜像库 可下载CentOS2,3,4,5,6,7,8 CentOS-Vault.repo对应的是发行该镜…...
【python】PyQt5可视化开发,鼠标键盘实现联动界面交互逻辑与应用实战
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
Raw Socket(一)实现TCP三次握手
实验环境: Windows物理机:192.168.1.4 WSL Ubuntu 20.04.6 LTS:172.19.32.196 Windows下的一个http服务器:HFS,大概长这个样子: 客户端就是Ubuntu,服务端就是这个…...
考研数学开始的晚?别慌,超全复习规划拿去抄
实话实说,从七月中旬考研数一复习完真的有点悬,需要超级高效快速... 数二的时间也有点紧张...🥺 中间基本没有试错的时间,让你换老师换习题尝试,必须从头到尾规划好 而且相信你也不止自己,有很多考研党都是…...
创建React 项目的几种方式
①.react自带脚手架 使用步骤: 1、下载 npm i create-react-app -g 2、创建项目命令: create-react-app 项目名称 ②.Vite构建工具创建react步骤:(推荐) 方法一: 1、yarn create vite 2、后续根据提示步…...
探索Kotlin:从K1到K2
人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 嘿,小伙伴们!今天我们来聊聊Kotlin,这个在安卓开发圈里越来越火的编程语言。…...
Python爬虫速成之路(1):获取网页源代码
hello hello~ ,这里是绝命Coding——老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页:绝命Coding-CSDN博客 &a…...
OpenGL笔记七之顶点数据绘制命令和绘制模式
OpenGL笔记七之顶点数据绘制命令和绘制模式 —— 2024-07-07 杭州 下午 总结自bilibili赵新政老师的教程 code review! 文章目录 OpenGL笔记七之顶点数据绘制命令和绘制模式1.OpenGL版本号更改和编译更改2.GL_TRIANGLES模式绘制一个三角形、支持NFC坐标随窗口缩放2.1.三个点…...
力扣题解( 最长湍流子数组)
978. 最长湍流子数组 已解答 给定一个整数数组 arr ,返回 arr 的 最大湍流子数组的长度 。 如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是 湍流子数组 。 更正式地来说,当 arr 的子数组 A[i], A[i1], ..., A[j] 满足仅满…...
pytorch-RNN存在的问题
这里写目录标题 1. RNN存在哪些问题呢?1.1 梯度弥散和梯度爆炸1.2 RNN为什么会出现梯度弥散和梯度爆炸呢? 2. 解决梯度爆炸方法3. Gradient Clipping的实现4. 解决梯度弥散的方法 1. RNN存在哪些问题呢? 1.1 梯度弥散和梯度爆炸 梯度弥散是…...
Leetcode 17:电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 public List<String> letterCombinations(String digits) {if (digits null || digits.length() 0) {return result;}int index0; //记录遍历digits的角标//初始…...
jmeter-beanshell学习4-beanshell截取字符串
再写个简单点的东西,截取字符串,参数化文件统一用csv,然后还要用excel打开,如果是数字很容易格式就乱了。有同事是用双引号把数字引起来,报文里就不用加引号了,但是这样beanshell处理起来,好像容…...
QScrollArea 设置最大的高度值
在 Qt 中,QScrollArea 是一个提供滚动视图的控件,允许用户查看大于当前视口尺寸的内容。如果你想要为 QScrollArea 设置一个最大的高度值,这通常不是直接通过 QScrollArea 的属性来设置的,而是需要调整其内容部件(widg…...
CentOS6禁止锁屏
在电源中设置后还是会锁屏, 原因是有屏幕保护程序 电源管理都 “从不” 一些AI的回答 在CentOS 6系统中,如果你想要禁用锁屏功能,可以编辑/etc/kbd/config文件。这个文件通常包含了键盘相关的设置,包括密码策略和屏幕锁定选项。 首先打开终…...
MapReduce底层原理详解:大案例解析(第32天)
系列文章目录 一、MapReduce概述 二、MapReduce工作机制 三、Map,Shuffle,reduce阶段详解 四、大案例解析 文章目录 系列文章目录前言一、MapReduce概述二、MapReduce工作机制1. 角色与组件2. 作业提交与执行流程1. 作业提交:2. Map阶段&…...
【JVM基础篇】Java垃圾回收器介绍
垃圾回收器(垃圾回收算法实现) 垃圾回收器是垃圾回收算法的具体实现。由于垃圾回收器分为年轻代和老年代,除了G1(既能管控新生代,也可以管控老年代)之外,新生代、老年代的垃圾回收器必须按照ho…...
java通过poi-tl导出word实战详细步骤
文章目录 与其他模版引擎对比1.引入maven依赖包2.新建Word文档exportWprd.docx模版3.编写导出word接口代码4.导出成果 poi-tl是一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库,你可以非常方便的加入到你的项目中,并且拥有着让…...
将自签证书添加到Java的可信任证书列表中
文章目录 前言将自签证书添加到Java的可信任证书列表中添加到Java的可信任证书列表中 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。 而且听说点赞的人每天的运气都不会太差,实…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
