当前位置: 首页 > news >正文

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数据。具体步骤包括从指定文件夹中读取图像&#xff0c…...

Linux虚拟化大师:使用 KVM 和 QEMU 进行高级虚拟化管理

Linux 虚拟化大师:使用 KVM 和 QEMU 进行高级虚拟化管理 虚拟化技术是现代数据中心的核心技术之一,它可以将一台物理服务器分割成多个虚拟机,从而提高资源利用率,降低成本,并增强系统的灵活性和可扩展性。KVM&#xf…...

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 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 public List<String> letterCombinations(String digits) {if (digits null || digits.length() 0) {return result;}int index0; //记录遍历digits的角标//初始…...

jmeter-beanshell学习4-beanshell截取字符串

再写个简单点的东西&#xff0c;截取字符串&#xff0c;参数化文件统一用csv&#xff0c;然后还要用excel打开&#xff0c;如果是数字很容易格式就乱了。有同事是用双引号把数字引起来&#xff0c;报文里就不用加引号了&#xff0c;但是这样beanshell处理起来&#xff0c;好像容…...

QScrollArea 设置最大的高度值

在 Qt 中&#xff0c;QScrollArea 是一个提供滚动视图的控件&#xff0c;允许用户查看大于当前视口尺寸的内容。如果你想要为 QScrollArea 设置一个最大的高度值&#xff0c;这通常不是直接通过 QScrollArea 的属性来设置的&#xff0c;而是需要调整其内容部件&#xff08;widg…...

CentOS6禁止锁屏

在电源中设置后还是会锁屏, 原因是有屏幕保护程序 电源管理都 “从不” 一些AI的回答 在CentOS 6系统中&#xff0c;如果你想要禁用锁屏功能&#xff0c;可以编辑/etc/kbd/config文件。这个文件通常包含了键盘相关的设置&#xff0c;包括密码策略和屏幕锁定选项。 首先打开终…...

MapReduce底层原理详解:大案例解析(第32天)

系列文章目录 一、MapReduce概述 二、MapReduce工作机制 三、Map&#xff0c;Shuffle&#xff0c;reduce阶段详解 四、大案例解析 文章目录 系列文章目录前言一、MapReduce概述二、MapReduce工作机制1. 角色与组件2. 作业提交与执行流程1. 作业提交&#xff1a;2. Map阶段&…...

【JVM基础篇】Java垃圾回收器介绍

垃圾回收器&#xff08;垃圾回收算法实现&#xff09; 垃圾回收器是垃圾回收算法的具体实现。由于垃圾回收器分为年轻代和老年代&#xff0c;除了G1&#xff08;既能管控新生代&#xff0c;也可以管控老年代&#xff09;之外&#xff0c;新生代、老年代的垃圾回收器必须按照ho…...

java通过poi-tl导出word实战详细步骤

文章目录 与其他模版引擎对比1.引入maven依赖包2.新建Word文档exportWprd.docx模版3.编写导出word接口代码4.导出成果 poi-tl是一个基于Apache POI的Word模板引擎&#xff0c;也是一个免费开源的Java类库&#xff0c;你可以非常方便的加入到你的项目中&#xff0c;并且拥有着让…...

将自签证书添加到Java的可信任证书列表中

文章目录 前言将自签证书添加到Java的可信任证书列表中添加到Java的可信任证书列表中 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...