热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PythonOpencv实现单目标检测的示例代码

这篇文章主要介绍了PythonOpencv实现单目标检测的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着

一 简介

目标检测即为在图像中找到自己感兴趣的部分,将其分割出来进行下一步操作,可避免背景的干扰。以下介绍几种基于opencv的单目标检测算法,算法总体思想先尽量将目标区域的像素值全置为1,背景区域全置为0,然后通过其它方法找到目标的外接矩形并分割,在此选择一张前景和背景相差较大的图片作为示例。

环境:python3.7 opencv4.4.0

二 背景前景分离

1 灰度+二值+形态学 轮廓特征和联通组件

根据图像前景和背景的差异进行二值化,例如有明显颜色差异的转换到HSV色彩空间进行分割。

1 原图

2 灰度化

3 二值化

4 形态学处理

5 提取轮廓并找出目标外接矩形

代码封装:

def get_roi_contours(image_path, morph_size, num_morph):
  """
  参数详解:
  image_path:所需处理图片路径
  morph_size:形态学处理核的大小
  num_morph:进行形态学处理的次数
  """
  image = cv2.imread(image_path, cv2.IMREAD_COLOR)
  #灰度转换
  gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  #二值化
  threhold, binary_image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
  #形态学操作
  kernel = cv2.getStructuringElement(shape=cv2.MORPH_RECT, ksize=morph_size)
  morph_image = cv2.morphologyEx(binary_image, cv2.MORPH_CLOSE, kernel)
  for i in range(num_morph-1):
    morph_image = cv2.morphologyEx(morph_image, cv2.MORPH_CLOSE, kernel)
  #查找轮廓
  contours, hierarchy = cv2.findContours(morph_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  #选取轮廓面积最大的轮廓
  area = 0
  max_area_index = 0
  for j in range(len(contours)):
    if area 

6 通过联通组件找到外接矩形
代码封装:

def get_roi_ConCom(image_path, morph_size, num_morph):
  """
  参数详解:
  image_path:所需处理图片路径
  morph_size:形态学处理核的大小
  num_morph:进行形态学处理的次数
  """
  image = cv2.imread(image_path, cv2.IMREAD_COLOR)
  #灰度转换
  gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  #二值化
  threhold, binary_image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
  #形态学操作
  kernel = cv2.getStructuringElement(shape=cv2.MORPH_RECT, ksize=morph_size)
  morph_image = cv2.morphologyEx(binary_image, cv2.MORPH_CLOSE, kernel)
  for i in range(num_morph-1):
    morph_image = cv2.morphologyEx(morph_image, cv2.MORPH_CLOSE, kernel)
  #联通组件查询
  numlabels, components_img, stats, centers = cv2.connectedComponentsWithStats(morph_image, 8)
  #获取除背景外的所有联通组件
  stats_without_back = stats[1:]
  #获取除背景外的所有联通组件的面积最大值
  max_area = np.max(stats_without_back, axis=0)[-1]
  #获取面积最大联通组件的index
  max_area_index = stats_without_back[:, -1]==max_area
  rect = stats_without_back[max_area_index]
  return np.squeeze(rect)[0:4]

2 Kmeans聚类实现前景和背景的分离

1 kmeans聚类后的图像,由于簇的中心是随机初始化的,所以目标的像素值可能为0,也可能为1,若采用opencv的findContours则要求前景像素值为1。

2 利用轮廓特征找外接矩形

由于Kmeans随机初始化簇中心导致前景目标像素不确定,采用边缘提取的方法再查找轮廓。

边缘图:

代码封装:

def get_roi_Kmeans(image_path):
  image = cv2.imread(image_path, cv2.IMREAD_COLOR)
  image_data = image.reshape(-1, 3).astype(np.float32) #必须要转成浮点类型进行计算
  #簇内平方和,标签和每个簇的中心
  criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 10, 1)
  interia, label, centers = cv2.kmeans(image_data, 2, None, criteria, 5, cv2.KMEANS_RANDOM_CENTERS)
  #二值化,将标签为0的转换为255,即是目标
  label[label==0] = 255
  label[label==1] = 0
  #转换数据类型,轮廓查找要是uint8类型数据
  thresh_img = label.reshape(image.shape[0:2]).astype(np.uint8)
  x_grad = cv2.Sobel(thresh_img, cv2.CV_32F, 1, 0)
  y_grad = cv2.Sobel(thresh_img, cv2.CV_32F, 0, 1)

  x_grad = cv2.convertScaleAbs(x_grad) #ax + b 线性变换
  y_grad = cv2.convertScaleAbs(y_grad)
  
  dst = cv2.add(x_grad, y_grad, dtype=cv2.CV_16S) #将两种sobel的加起来就可以得到整个边缘
  dst = cv2.convertScaleAbs(dst)
  plt.imshow(dst, cmap="gray")
  #轮廓查找目标必须为1
  contours, hierarchy = cv2.findContours(dst, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  #获取外接矩形
  rect = cv2.boundingRect(contours[0])
  return rect

三 总结

单目标检测较为简单,只要合理利用目标和背景的差异便可将其分离出来。当然单目标检测的方法还有很多,比如有目标模板的时候可以采用模板匹配或者均值漂移,有足够的数据集时也可采用机器学习和深度学习方法。

到此这篇关于Python Opencv实现单目标检测的示例代码的文章就介绍到这了,更多相关Opencv 单目标检测内容请搜索编程笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程笔记!

原文链接:https://blog.csdn.net/wahjk/article/details/108434047


推荐阅读
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 本文探讨了卷积神经网络(CNN)中感受野的概念及其与锚框(anchor box)的关系。感受野定义了特征图上每个像素点对应的输入图像区域大小,而锚框则是在每个像素中心生成的多个不同尺寸和宽高比的边界框。两者在目标检测任务中起到关键作用。 ... [详细]
author-avatar
静静敲代码
很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有