返回顶部
首页 > 资讯 > 后端开发 > Python >如何使用Python OpenCV提取物体轮廓详解
  • 793
分享到

如何使用Python OpenCV提取物体轮廓详解

2024-04-02 19:04:59 793人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

通常提取物体的轮廓时,图像都存在噪声,提取效果并不理想。如提取下图的轮廓时, 提取代码: import cv2 img = cv2.imread("mouse.png") cv

通常提取物体的轮廓时,图像都存在噪声,提取效果并不理想。如提取下图的轮廓时,

提取代码:

import cv2
 
img = cv2.imread("mouse.png")
cv2.imshow("origin",img)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary = cv2.threshold(gray,128,255,cv2.THRESH_BINARY)
cv2.imshow("binary",binary)
 
contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHaiN_APPROX_SIMPLE)
cv2.drawContours(img,contours,-1,(0,0,255),3)
cv2.imshow("result", img)
cv2.waiTKEy(0)

 提取效果:

可以看出存在非常严重的噪声干扰。因此,提取轮廓之前需要过滤噪声的干扰。

首先,进行对图像进行均值滤波(低通滤波),去除噪声

blured = cv2.blur(img,(5,5))
cv2.imshow("blur",blured)

 

使用floodfill来去掉目标周围的背景,泛洪填充类始于ps的魔棒工具,这里用来清除背景。

mask = np.zeros((h+2, w+2), np.uint8)       #掩码长和宽都比输入图像多两个像素点,泛洪填充不会超出掩码的非零边缘  
#进行泛洪填充
cv2.floodFill(blured, mask, (10,10), (255,255,255), (2,2,2),(3,3,3),8)
cv2.imshow("floodfill", blured)

  floodFill函数解析

  • img:为待使用泛洪算法的图像
  • mask:为掩码层,使用掩码可以规定是在哪个区域使用该算法,如果是对于完整图像都要使用,则掩码层大小为原图行数+2,列数+2.是一个二维的0矩阵,边缘一圈会在使用算法是置为1。而只有对于掩码层上对应为0的位置才能泛洪,所以掩码层初始化为0矩。【dtype:np.uint8】
  • seed:为泛洪算法的种子点,也是根据该点的像素判断决定和其相近颜色的像素点,是否被泛洪处理。
  • newvalue:是对于泛洪区域新赋的值(B,G,R)
  • (loDiff1,loDiff2,loDiff3):是相对于seed种子点像素可以往下的像素值,即seed(B0,G0,R0),泛洪区域下界为(B0-loDiff1,G0-loDiff2,R0-loDiff3)
  • (upDiff1,upDiff2,upDiff3):是相对于seed种子点像素可以往上的像素值,即seed(B0,G0,R0),泛洪区域上界为(B0+upDiff1,G0+upDiff2,R0+upDiff3)
  • flag:为泛洪算法的处理模式:
  •     低八位 控制算法的连通性,是以seed点为中心,接着判断周围的几个像素点,再将泛洪区域像素点周围的几个像素点进行考虑。 一般为4,8;默认为4
  •     中间八位 与掩码层赋值密切相关,一般使用(255<<8)使中间8位全位1,则值为255,也就是掩码层对应原图的泛洪区域的部分被由原来的初值0赋值成255,如果中间8位为0,则赋值为1.
  •     高八位 由OpenCV宏参数指定
    • cv2.FLOODFILL_FIXED_RANGE:改变图像,填充newvalue
    • cv2.FLOODFILL_MASK_ONLY:不改变原图像,也就是newvalue参数失去作用,而是改变对应区域的掩码,设为中间八位的值

然后转换成灰度图

 gray = cv2.cvtColor(blured,cv2.COLOR_BGR2GRAY)  
 cv2.imshow("gray", gray)  

此时目标图像周围有写不光滑,还有一些噪声,因此进行开闭运算,得到比较光滑的目标

 #定义结构元素  
 kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(50, 50))
 #开闭运算,先开运算去除背景噪声,再继续闭运算填充目标内的孔洞
 opened = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)  
 closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)  
 cv2.imshow("closed", closed) 

接着转换成二值图以便于获取图像的轮廓

最后进行轮廓提取,抓取到目标

 #找到轮廓
 _,contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)  
 #绘制轮廓
 cv2.drawContours(img,contours,-1,(0,0,255),3)  
 #绘制结果
 cv2.imshow("result", img)

全部代码:

#coding=utf-8
import cv2
import numpy as np
 
img = cv2.imread("temp.jpg")                #载入图像
h, w = img.shape[:2]                        #获取图像的高和宽
cv2.imshow("Origin", img)                   #显示原始图像
 
blured = cv2.blur(img,(5,5))                #进行滤波去掉噪声
cv2.imshow("Blur", blured)                  #显示低通滤波后的图像
 
mask = np.zeros((h+2, w+2), np.uint8)       #掩码长和宽都比输入图像多两个像素点,满水填充不会超出掩码的非零边缘
#进行泛洪填充
cv2.floodFill(blured, mask, (w-1,h-1), (255,255,255), (2,2,2),(3,3,3),8)
cv2.imshow("floodfill", blured)
 
#得到灰度图
gray = cv2.cvtColor(blured,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray", gray)
 
 
#定义结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(50, 50))
#开闭运算,先开运算去除背景噪声,再继续闭运算填充目标内的孔洞
opened = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)
closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)
cv2.imshow("closed", closed)
 
#求二值图
ret, binary = cv2.threshold(closed,250,255,cv2.THRESH_BINARY)
cv2.imshow("binary", binary)
 
#找到轮廓
_,contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#绘制轮廓
 
cv2.drawContours(img,contours,-1,(0,0,255),3)
#绘制结果
cv2.imshow("result", img)
 
cv2.waitKey(0)
cv2.destroyAllwindows()

总结

到此这篇关于如何使用python OpenCV提取物体轮廓的文章就介绍到这了,更多相关Python OpenCV提取物体轮廓内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 如何使用Python OpenCV提取物体轮廓详解

本文链接: https://lsjlt.com/news/117898.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用Python OpenCV提取物体轮廓详解
    通常提取物体的轮廓时,图像都存在噪声,提取效果并不理想。如提取下图的轮廓时, 提取代码: import cv2 img = cv2.imread("mouse.png") cv...
    99+
    2024-04-02
  • 基于python如何使用OpenCV进行物体轮廓排序
    小编给大家分享一下基于python如何使用OpenCV进行物体轮廓排序,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1 引言在进行图像处理过程中,我们经常会遇到一些和物体轮廓相关的操作,比如求目标轮廓的周长面积等,我们直接...
    99+
    2023-06-22
  • 基于python使用OpenCV进行物体轮廓排序
    目录1 引言2 栗子2.1 读取图像2.2 获取轮廓2.3 轮廓排序2.4 其他结果3 总结1 引言 在进行图像处理过程中,我们经常会遇到一些和物体轮廓相关的操作,比如求目标轮廓的周...
    99+
    2024-04-02
  • Python图像处理之如何实现目标物体轮廓提取
    这篇文章将为大家详细讲解有关Python图像处理之如何实现目标物体轮廓提取,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1 引言目标物体的边缘对图像识别和计算机分析十分有用。边缘可以勾画出目标物体,使观察...
    99+
    2023-06-20
  • Python图像处理之目标物体轮廓提取的实现方法
    目录1 引言2 原理3 Python实现1)读入彩色图像2) 彩色图像灰度化3)二值化4)提取轮廓4 总结1 引言 目标物体的边缘对图像识别和计算机分析十分有用。边缘可以勾画出目标物...
    99+
    2024-04-02
  • python如何使用opencv提取光流详解
    目录前言提取帧提取flow光流环境配置结果总结前言 光流flow特征中包含了一个视频当中运动相关的信息,在视频动作定位当中光流特征使用的比较多,所以记录一下提取光流特征的方法。 使用...
    99+
    2024-04-02
  • 如何利用Python+OpenCV实现简易图像边缘轮廓检测(零基础)
    目录前言函数基础与三方库cv.threshold(pic,thresh,maxvalue,model)cv.findContours(待处理图片,model(提取模式),method...
    99+
    2024-04-02
  • 如何使用Python OpenCV实现人物动漫化效果
    这篇文章主要介绍如何使用Python OpenCV实现人物动漫化效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!效果展示第一组古风美女原图效果图啊......西湖的水 我的泪......这张图动漫化的超级...
    99+
    2023-06-26
  • 详解python  OpenCV如何使用背景分离方法
    目录目标理论实现代码分析结果目标 在本章中,将学习: 背景分离(Background Subtraction)OpenCv函数cv2.VideoCapture, cv2.Backgr...
    99+
    2023-05-17
    python OpenCV背景分离 python OpenCV
  • Python如何使用opencv进行手势识别详解
    目录前言原理程序部分附另一个手势识别实例总结前言 本项目是使用了谷歌开源的框架mediapipe,里面有非常多的模型提供给我们使用,例如面部检测,身体检测,手部检测等。 原理 首先...
    99+
    2024-04-02
  • 详解Python使用OpenCV如何确定一个对象的方向
    目录1.代码实现2.输出图像3.了解坐标轴4.计算0到180度之间的方向在本教程中,我们将构建一个程序,该程序可以使用流行的计算机视觉库 OpenCV 确定对象的方向(即以度为单位的...
    99+
    2024-04-02
  • 详解在OpenCV中如何使用图像像素
    目录切片操作获取感兴趣区域的坐标值使用切片操作裁剪图像1.加载并显示原始图像2.获取图像的空间维度3.裁剪图像4.使用尺寸将部分图像设置为特定颜色。总结 像素是计算机视觉中图像的重要...
    99+
    2024-04-02
  • python 详解如何使用GPU大幅提高效率
    cupy我觉得可以理解为cuda for numpy,安装方式pip install cupy,假设 import numpy as np import cupy as cp ...
    99+
    2024-04-02
  • 使用Discuz取消验证码功能如何提升用户体验?
    使用Discuz取消验证码功能如何提升用户体验? 随着互联网的发展,验证码验证系统已成为防止恶意程序和机器人攻击的重要手段。然而,有时验证码验证也会给用户带来不便,尤其是在日常浏览和访...
    99+
    2024-03-10
    验证码 用户 discuz
  • 详解如何使用numpy提高Python数据分析效率
    目录1、数组初始化2、数组元素计算3、数组元素提取NumPy是Python语言的一个第三方库,其支持大量高维度数组与矩阵运算。 作为python科学计算领域的三剑客之一,numpy在...
    99+
    2023-05-15
    Python numpy提高数据分析效率 Python提高数据分析效率 Python numpy数据分析 Python numpy
  • 使用python如何提取JSON数据指定内容
    目录如何提取JSON数据指定内容假设我们要获取'pic_str'里的数据1、JSON数据为字符串类型2、JSON数据为字典类型如何提取复杂JSON的数据 例...
    99+
    2024-04-02
  • 如何使用Python从字符串中提取数字?
    在Python中,有时候需要从字符串中提取特定的数字信息,这种操作很常见。例如,从一篇新闻报道中提取新闻发布日期、从一篇小说中提取章节编号等。那么,如何使用Python从字符串中提取数字呢?本文将介绍几种方式。 阅读更多:Python...
    99+
    2023-08-31
    mysql 数据库 python
  • 如何利用Python和OpenCV对图像进行加水印详解
    目录前言🌌 第 1 步:导入 OpenCV 并读取logo和要应用水印的图像💨 第 2步:计算两个图像的高度和宽度🚀 第 3 步:将水...
    99+
    2024-04-02
  • 如何使用js获取扩展名详解
    目录一、使用正则表达式二、使用String中的split方法三、使用String的lastIndexOf方法四、附获取文件扩展名的另两种方法总结一、使用正则表达式 function...
    99+
    2024-04-02
  • 详解如何使用Python网络爬虫获取招聘信息
    目录前言项目目标项目准备反爬措施项目实现效果展示小结前言 现在在疫情阶段,想找一份不错的工作变得更为困难,很多人会选择去网上看招聘信息。可是招聘信息有一些是错综复杂的。而且不能把全部...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作