OpenCV和PIL进行前景提取

news2024/9/17 7:12:51

摘要

在图像处理和分析中,前景提取是一项关键技术,尤其是在计算机视觉和模式识别领域。本文介绍了一种结合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:
        break
    
    img_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] = 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])

    labels[labels != sorted_indices[-2]] = 0
    labels[labels == sorted_indices[-2]] = 1

    img_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 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)

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:
        break
    
    img_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])

    # 使用mask
    labels[labels != sorted_indices[-2]] = 0
    labels[labels == sorted_indices[-2]] = 1

    img_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)
        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1917148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧水利的变革之路:如何通过大数据、物联网和人工智能构建高效、智能、可持续的水利管理新模式

目录 一、引言:智慧水利的时代背景与意义 二、大数据:水利管理的数据基石 (一)数据收集与整合 (二)数据分析与挖掘 三、物联网:水利管理的感知神经 (一)智能感知与监…

现在国内的ddos攻击趋势怎么样?想了解现在ddos的情况该去哪看?

目前,国内的DDoS攻击趋势显示出以下几个特征: 攻击频次显著增加:根据《快快网络2024年DDoS攻击趋势白皮书》,2023年DDoS攻击活动有显著攀升,总攻击次数达到1246.61万次,比前一年增长了18.1%。 攻击强度和规…

可视化作品集(12):智慧园区绝对是可视化大屏重点应用领域。

现在越来越多的园区上了可视化大屏,来对园区进行智慧化管理,本期分享一些精彩案例给大家。

2024年AI终端白皮书-AI与人协作、服务于人

来源:华为&清华大学: 近期历史回顾: 2024年上半年全国新房市场报告.pdf 2024移动应用趋势区域聚焦-土耳其.pdf 2024年轻人购房意愿调查报告.pdf 2024药械企业HCP全渠道营销实践指南.pdf 中国水产品贸易月度监测报告(2024年1-5月&#xf…

汽车免拆诊断案例 | 奥迪 Q7 e-tron无法通过插电式充电器充电

故障现象 车主反映,车辆无法使用自带的插电式充电器充电。(这种充电方法是“Mode 2充电”,3针插头,10 A,2.2 kW) 接车后验证故障,将Type 2充电插头连接到车辆时,充电口锁定销循环三…

从0到1写vue源码(02手写diff算法)

snabbdom snabbdom简介 搭建snabbdom环境 npm init npm i -S snabbdom搭建好后出现这样一个文件,sanabbdom里边就有js源码 接着安装webpack命令 npm install --save-dev webpack5 webpack-cli3 webpack-dev-server3 --legacy-peer-deps 直接npm run dev命令 接…

实战教程:如何利用Optimizer优化你的Windows系统?

前言 你是否厌倦了系统臃肿、隐私泄露的烦恼?小江湖今天就要带你走进一个全新的世界,一个能够让你重获自由与安心的神奇之地——Optimizer,一款专为Windows用户打造的深度优化神器;有了它你仅需轻轻一点,再也不用为系…

Shader每日一练(2)护盾

Shader "Custom/Shield" {Properties{_Size("Size", Range(0 , 10)) 1 // 控制噪声纹理缩放大小的参数_colorPow("colorPow", Float) 1 // 控制颜色强度的指数_colorMul("colorMul", Float) 1 // 控制颜色乘法因子_mainColor("…

如何在 Python 中创建一个类似于 MS 计算器的 GUI 计算器

问题背景 假设我们需要创建一个类似于微软计算器的 GUI 计算器。这个计算器应该具有以下功能: 能够显示第一个输入的数字。当按下运算符时,输入框仍显示第一个数字。当按下第二个数字时,第一个数字被替换。 解决方案 为了解决这个问题&am…

el-date-picker 限制选择六个月内的日期

效果如图&#xff1a; 代码&#xff1a; <el-date-picker v-model"serchTimes" type"daterange" size"small" start-placeholder"开始时间"range-separator"~" end-placeholder"结束时间" format"yyyy /…

防火墙安全策略及用户认证实验

一、实验拓扑 二、实验要求 1、DMZ区内的服务器&#xff0c;办公区仅能在办公时间&#xff08;9&#xff1a;00-18&#xff1a;00&#xff09;内可以访问&#xff1b;生产区的设备全天可以访问 2、生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3、办公区设…

逆向案例十一——华强北登录逆向

网址&#xff1a;aHR0cHM6Ly9wYXNzcG9ydC5ocWV3LmNvbS9sb2dpbg 登陆页面&#xff1a; 打开开发者工具会出现debugger调试&#xff1a; 直接使用一律不再此处暂停即可。点击登录&#xff0c;找到登录包。 发现有三个参数进行了加密&#xff0c;分别是Password,UserName和Devic…

概率论期末速成(知识点+例题)

考试范围 一&#xff1a; 事件关系运算性质全概率公式、贝叶斯公式古典概型 二&#xff1a; 离散分布律连续密度函数性质 -> 解决三个问题&#xff08;求待定系数、求概率、求密度函数&#xff09;分布函数 -> 解决三个问题常用分布&#xff08;最后一节课的那几个分…

Auslogics Disk Defrag Pro v11激活版下载、安装、使用教程 (磁盘碎片整理工具)

前言 Auslogics Disk Defrag Pro 是一款支持 FAT16 文件系统的磁盘碎片整理工具&#xff0c;它可以快速整理磁盘碎片&#xff0c;使磁盘空间更加整洁&#xff0c;显著提升电脑的运行速度。该软件无需任何分析阶段&#xff0c;并且速度比大多数其他碎片整理软件更快。它可以帮助…

算法力扣刷题记录 四十一【N叉树遍历】

前言 依然是遍历问题。由二叉树扩展到N叉树遍历。 记录 四十一【N叉树遍历】 一、【589. N叉树的前序遍历】 题目 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔…

Node.js_fs模块

文件删除 文件重命名和移动&#xff08;本质都是修改路径&#xff09; 文件夹操作 创建文件夹(mkdir) 读取文件夹(readdir) &#xff08;打印出来是该文件夹下名称的数组形式&#xff09; 读取当前的文件夹(readdir) 删除文件夹 &#xff08;rmdir&#xff09; 查看资源状态…

合合信息大模型加速器亮相WAIC大会:文档解析与文本识别新突破

合合信息大模型加速器亮相WAIC大会&#xff1a;文档解析与文本识别新突破 文章目录 合合信息大模型加速器亮相WAIC大会&#xff1a;文档解析与文本识别新突破前言合合信息TextIn平台&#xff1a;智能文档处理的领军者文档解析引擎&#xff1a;百页文档秒级处理大模型的发展背景…

文件数据跨境传输这些常见问题,要怎么解决?

越来越多的企业和机构面临文件数据跨境传输的场景和需求&#xff0c;数据跨境流通的过程还是比较复杂的&#xff0c;所以在传输过程中会面临各种问题。 比如法律法规和数据保护、技术标准、网络带宽和速度、数据安全风险控制等&#xff0c;企业要如何解决这些问题呢&#xff1…

数据仓库介绍_维度表(三)

维度表概述 维度表是维度建模的基础和灵魂。前文提到&#xff0c;事实表紧紧围绕业务过程进行设计&#xff0c;而维度表则围绕业务过程所处的环境进行设计。维度表主要包含一个主键和各种维度字段&#xff0c;维度字段称为维度属性。 表设计步骤 确定维度&#xff08;表&…

UI设计工具选择指南:Sketch、XD、Figma、即时设计

在数字产品设计产业链中&#xff0c;UI设计师往往起着连接前后的作用。产品经理从一个“需求”开始&#xff0c;制定一个抽象的产品概念原型。UI设计师通过视觉呈现将抽象概念具体化&#xff0c;完成线框图交互逻辑视觉用户体验&#xff0c;最终输出高保真原型&#xff0c;并将…