day16 - 提取图像前景

news2024/11/25 3:59:14

在我们平时使用购物软件是会发现通常在搜索框右侧都会有一个相机的标志,这个标志是可以让用户通过图片来搜索自己需要购买的内容。拍照购物将用户拍摄的商品与商品图库的图像进行对比,找到最为相似的商品。但是由于用户拍摄的图像是任意的随机的,不可能与商家的商品图完全吻合,复杂的商品背景对拍照购物造成了很大的影响,商品与背景图像的分离技术成为了技术的关键。

本期我们来学习使用图像轮廓相关的技术来实现图像前景的提取。

完成本期内容,你可以:

  • 了解图像轮廓的基本定义
  • 了解图像轮廓检测与边缘检测的区别
  • 学会提取图像的轮廓并绘制轮廓

若要运行案例代码,你需要有:

  • 操作系统:Ubuntu 16 以上 或者 Windows10

  • 工具软件:VScode 或者其他源码编辑器

  • 硬件环境:无特殊要求

  • 核心库:python 3.6.13, opencv-contrib-python 3.4.11.39,opencv-python 3.4.2.16


判断图形轮廓

OpenCV中提供了cv2.findContours()函数可以通过计算图像梯度来判断出图像的边缘。

函数原型:contours, hierarchy = cv2.findContours( image, mode, method)

contours为返回的轮廓。hierarchy为返回的图像的拓扑信息(轮廓层次)。

参数描述如下:

  • contours:返回的轮廓。
  • hierarchy:图像的拓扑信息(轮廓层次)。
  • image:原始图像。
  • mode:轮廓检索模式。
  • method:轮廓的近似方法
mode参数含义
cv2.RETR_EXTERNAL只检测外轮廓
cv2.RETR_LIST检测所有轮廓,轮廓不建立等级
cv2.RETR_CCOMP检测所有轮廓,建立两个等级的轮廓
cv2.RETR_TREE检测所有轮廓,建立等级树轮廓
method参数含义
cv2.CHAIN_APPROX_NONE存储所有的轮廓点
cv2.CHAIN_APPROX_SIMPLE压缩存储
cv2.CHAIN_APPROX_TC89_L1使用ten-Chinl chain 近似算法
cv2.CHAIN_APPROX_TC89_KCOS使用ten-Chinl chain 近似算法

绘制图像轮廓

OpenCV中提供了cv2.drawContours()函数来绘制图像轮廓。

函数原型:image=cv.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])

image为目标图像,绘制了边缘的原始图像。

参数描述如下:

  • image:待绘制轮廓图像。
  • contours:需要绘制的轮廓。
  • contourIdx:需要绘制的边缘索引。
  • color:绘制的颜色,用 BGR 格式表示。
  • thickness:可选参数,表示绘制轮廓时所用的画笔粗细。
  • lineType:可选,绘制的线型。
  • hierarchy:对应函数cv2.findContours()所输出的层次信息。
  • maxLevel:该参数控制绘制的轮廓层次深度。
  • offset:偏移参数。

绘制多边形轮廓

OpenCV中提供了cv2.approxPolyDP()函数来绘制多边形轮廓。

函数原型:approxCurve = cv2.approxPolyDP( curve, epsilon, closed )

approxCurve为逼近多边形点集;

参数描述如下:

  • curve:是轮廓。
  • epsilon:精度,原始轮廓的边界点与逼近多边形边界之间的最大距离。
  • closed:逻辑值。该值为真时,逼近多边形是封闭的;否则,逼近曲线是不封闭的。

具体步骤

使用图像轮廓相关技术提取图像前景。

请添加图片描述

请添加图片描述

步骤一:创建项目工具

创建项目名为提取图像前景,项目根目录下新建code文件夹储存代码,新建dataset文件夹储存数据,项目结构如下:

提取图像前景                             # 项目名称
├── code                               # 储存代码文件
├── dataset                            # 储存数据文件

注:如项目结构已存在,无需再创建。

步骤二:获取轮廓并绘制

  1. 导入所需模块:OpenCV、NumPy ;
  2. 读取dataset文件夹下的dandelion.jpg 图片;
  3. 将原图像复制,用于绘制图像轮廓;
  4. 将图像转换为二值图像;
  5. 获取图像轮廓并绘制;

代码实现

# 导入OpenCV、numpy
import cv2
import numpy as np

o = cv2.imread('../dataset/dandelion.jpg')# 读取原图
img = o.copy() # 复制图像
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)  # 原图从彩图变成单通道灰度图像
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)  # 灰度图像转化为二值图像,阈值为127,最大值为255
# 获取二值化图像中的轮廓以及储存轮廓层次数据
contours, hierarchy = cv2.findContours(binary,
                                          cv2.RETR_LIST,
                                          cv2.CHAIN_APPROX_SIMPLE)
# 在复制得到的图像上绘制轮廓
cv2.drawContours(img, contours, -1, (0, 0, 255), 2)

步骤三:提取图像前景

  1. 创建一张与原始图像大小相同值为0的数组(黑色图像)作为掩码;
  2. 在掩码中绘制出实心轮廓,颜色为白色;
  3. 将原始图像与掩码图像进行与运算,获取前景;

代码实现

# 创建原始图像大小相同的值为0的数组(黑色图像)
mask=np.zeros(o.shape,np.uint8) 
# 在mask中绘制出实心轮廓,颜色为白色
mask=cv2.drawContours(mask,contours,-1,(255,255,255),-1) 
# 将mask和原始图像进行计算,获取前景
loc=cv2.bitwise_and(o,mask)  

步骤四:结果展示

  1. 展示出绘制了图像轮廓的图像;
  2. 展示出掩码图像;
  3. 展示提取的前景图像;

代码实现

cv2.imshow("contours",img)
cv2.imshow("mask" ,mask)
cv2.imshow("foreground" ,foreground)
cv2.waitKey()
cv2.destroyAllWindows()

使用图像轮廓相关的技术来实现提取图像的前景,主要是因为绘制图像轮廓时可以绘制实心轮廓,在通过一张掩码图像来进行图像运算,根据之前讲过的图像运算的规律,可以将图像的前景提取出来。

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

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

相关文章

使用Arcgis免费获取全国地质数据

使用Arcgis免费使用全国地质数据 如今是大数据并发的时代,并且还是数据大开放的时代。全国地质资料馆开放了大量的地质资料数据,供全民使用。今天我在这里教大家使用免费的数据,帮助我们工作。 全国地质资料馆地址: http://www.ng…

基于广义Benders分解法的综合能源系统优化规划(matlab程序)

目录 1 主要内容 广义benders分解法流程图: 优化目标: 约束条件: 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《综合能源系统协同运行策略与规划研究》第四章内容基于广义Benders分解法的综合能源系统优化规划&…

图学习 [1]

图学习 [1] 图学习的主要任务 节点预测。节点预测任务是指利用图结构中已有的节点和边信息,通过机器学习算法对图中新添加的节点进行分类或回归预测的任务。链路预测。链路预测任务是指利用图结构中已有的节点和边信息,通过机器学习算法预测未来可能存…

【C++初阶】友元 + 内部类 + 匿名对象

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…

欢迎所有用户! Elastic 扩展知识中心和支持中心

作者:Cory Mangini 对于所有云用户,我们有一些好消息:你现在可以访问我们的知识中心,在云试用期间请求技术支持,并通过 Elastic Support Hub 提出账单案例。 这意味着你可以利用我们的 Elasticians 多年来积累的丰富知…

基于html+css的图展示90

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

day20 - 绘制物体的运动轨迹

在我们平常做目标检测或者目标追踪时,经常要画出目标的轨迹图。绘制轨迹图的一种方法就是利用光流估计来进行绘制。 本期我们主要来介绍视频中光流估计的使用和效果,利用光流估计来绘制运动轨迹。 完成本期内容,你可以: 掌握视…

通过js来判断是否是横屏如果是就自刷新页面解决横屏之后只有屏幕一半宽度的问题

判断页面是横屏还是竖屏 window.addEventListener("load", rotate, false);window.addEventListener("onorientationchange" in window ? "orientationchange" : "resize", rotate, false);function rotate() {if (window.orientatio…

首个机器学习实时特征平台测试基准论文被 VLDB 2023 录取

国际顶级数据库学术会议 VLDB 2023 将于 2023 年 8 月份在加拿大温哥华举办。近日,由清华大学、新加坡国立大学、以及 OpenMLDB 社区联合完成的科研成果 - 业界第一个严谨的机器学习实时特征平台测试基准,被大会录取并且受邀在现场报告。论文题目为&…

Mybatis-动态SQL

1.什么是动态SQL? Mabits是一个Java持久化框架,它提供了动态SQL的功能。动态SQL是一种根据不同条件动态生成SQL语句的技术。在Mabits中,动态SQL通常是通过使用一组特殊的标签和代码块来实现的,这些标签和代码块可以根据条件包含或排…

性能测试——jmeter实时压测结果收集

这里写目录标题 前言一、压测监控平台组成二、性能监控平台部署 - InfluxDB三、性能监控平台部署 - JMeter四、性能监控平台部署 - Grafana五、性能监控平台部署 – 运行与结果展示 前言 测试报告 .vs. 压测监控 JMeter原生测试报告带来的“痛苦” • 不具备实时性 • 报告中的…

单体项目偶遇并发漏洞!短短一夜时间竟让老板蒸发197.83元

事先声明:以下故事基于真实事件而改编,如有雷同,纯属巧合~ 眼下这位正襟危坐的男子,名为小竹,他正是本次事件的主人公,也即将成为熊猫集团的被告,嗯?这究竟怎么一回事?欲…

通过白噪声的频谱处理产生任意光谱斜率(f^a)噪声(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

首站中科院!百度商业AI技术创新大赛开启巡回宣讲

近日,百度商业AI技术创新大赛正式启动,并于5月18日起开启高校巡回宣讲。 宣讲会首站落地中国科学院大学,中国科学院大学人工智能学院副院长、教授、博士生导师肖俊教授,百度商业研发主任架构师焦学武,百度商业资深工程…

springboot 集成 Swagger3(速通)

→ springboot 集成 Swagger2 ← 目录 1. 案例2. info 配置3. Docket 配置1. 开关配置2. 扫描路径3. 路径匹配4. 分组管理 4. 常用注解1. 说明2. 案例 1. 案例 这次直接使用 2.5.6 的 spring-boot 。 依赖&#xff1a; <parent><groupId>org.springframework.…

亏损?盈利?禾赛科技Q1财报背后的激光雷达赛道「现实」

随着禾赛科技在去年登陆美股&#xff0c;作为全球为数不多已经开始前装量产交付的激光雷达上市公司&#xff0c;财务数据的变化&#xff0c;也在一定程度上反映了行业的真实状况。 根据禾赛科技最新发布的今年一季度财报显示&#xff0c;公司季度净营收为4.3亿元&#xff08;人…

基于html+css的图展示91

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

电表及配电监控系统的智能化发展

安科瑞虞佳豪 在电力领域&#xff0c;AI渗透率近年来也持续提升。今年3月&#xff0c;国家能源局发布《关于加快推进能源数字化智能化发展的若干意见》&#xff0c;文件中针对电力、、油气等行业数字化智能化转型&#xff0c;明确了指导思想和基本原则&#xff0c;从加快行业转…

Unity之ShaderGraph数据类型

前言 ShaderGraph是Unity引擎中的一个可视化着色器编辑器&#xff0c;它允许开发者使用节点和连接线的方式来创建自定义的着色器。使用ShaderGraph&#xff0c;开发者可以通过简单的拽和连接节点来创建复杂的着色器效果&#xff0c;而无需编写任何代码。 为了更好的学习Shader…

chatgpt赋能python:PythonWOL:简化计算机远程唤醒的一种方法

Python WOL&#xff1a;简化计算机远程唤醒的一种方法 随着人们越来越频繁地远程连接和控制计算机&#xff0c;计算机的远程唤醒功能变得越来越重要。WOL&#xff0c;即“Wake on LAN”&#xff0c;是一种使用网络信号远程唤醒计算机的技术。 在许多情况下&#xff0c;使用WO…