【Python_Opencv图像处理框架】边缘检测、轮廓检测、图像金字塔

news/2024/5/19 14:21:32/文章来源:https://blog.csdn.net/m0_73222051/article/details/130395127

写在前面

本篇文章是opencv学习的第四篇文章,主要讲解了边缘及轮廓检测的主要操作,并对两种图像金字塔简单的介绍了一下,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正😍


写在中间

一、Canny边缘检测

( 1 )简单介绍

Canny边缘检测是一种常用的图像处理算法,它能够在图像中快速准确地识别出物体的边缘。

边缘检测算法步骤:

首先使用高斯滤波器对原始图像进行滤波,用于去除图像中的噪声然后计算图像的梯度,通过阈值处理以便识别出图像中的边缘接着使用非极大值抑制,避免假阳性和重复检测。最后使用双阈值算法进行边缘连接和筛选

( 2 )操作实现

cv2.Canny(img, 120, 250)

这三个参数是用于Canny边缘检测的阈值参数。其中:

  • img是需要进行边缘检测的图像。

  • 120是低阈值,用于过滤掉弱边缘。

  • 250是高阈值,用于较好地保留强边缘。

在Canny边缘检测中,像素点的灰度值如果大于高阈值,就被认为是强边缘,如果小于低阈值,就被认为是非边缘。如果在两者之间,那么只有与强边缘相连通的像素点才被认为是边缘。通过调整这两个阈值,可以控制检测到的边缘数量和质量。

( 3 )代码实现

import cv2
import matplotlib.pyplot as plt
import numpy as npimg = cv2.imread("D:\python\Program\pythonProject\photos\\bear.png", 0)v1 = cv2.Canny(img, 100, 150)
v2 = cv2.Canny(img, 20, 70)res = np.hstack((v1, v2))  # 拼接cv2.imshow('result', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

( 4 )效果展示

在这里插入图片描述


二、图像金字塔

(1)简单介绍

图像金字塔是一种特殊的多尺度图像结构,它可以在不同尺度下对图像进行表示,从而实现对图像局部特征的提取。

图像金字塔通常由两个部分组成,即高斯金字塔拉普拉斯金字塔

高斯金字塔:可以通过向下采样法得到较小的图片,也可以通过向上采样法得到较大的图片。向下采样法(缩小)向上采样法(增大)拉普拉斯金字塔:则是指将两个相邻尺度的高斯金字塔图像相减得到的亮度差异图像。低通滤波降采样(缩小尺寸)内插(放大尺寸)带通滤波(图像相减)

(2)操作实现

向下采样法:img_down = cv2.pyrDown(img)

向上采样法:img_up = cv2.pyrUp(img_down)

拉普拉斯:img_laplacian = cv2.subtract(img, img_up)

拉普拉斯采样法就是先将原始图像向下采样,接着向上采样,最后将原始图像减去两次采样的结果。

( 3 )代码展示

import cv2
img = cv2.imread("D:\python\Program\pythonProject\photos\\bear.png", 0)img_down = cv2.pyrDown(img)  # 向下采样
img_up = cv2.pyrUp(img_down)  # 向上采样
img_laplacian = img - img_up  # 拉普拉斯金字塔
cv2.imshow('Original', img)
cv2.imshow('Down', img_down)
cv2.imshow('Up', img_up)
cv2.imshow('Laplacian', img_laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()

(3)效果展示

原图:

在这里插入图片描述

向下采样:

在这里插入图片描述

向上采样:

在这里插入图片描述

拉普拉斯金字塔:

在这里插入图片描述


三、轮廓检测

( 1 )简单介绍

轮廓检测是指在图像中检测出所有轮廓,并将它们可视化。下面是 OpenCV 中轮廓检测的基本步骤:

  1. 读取图像:使用cv2.imshow()函数读取图像。

  2. 转换为灰度图像:为了检测出轮廓,需要将图像转换为灰度图像。可以使用 cv2.cvtColor() 函数将图像从 BGR 颜色空间转换为灰度颜色空间。

  3. 二值化:使用 cv2.threshold() 函数将灰度图像转换为二值图像。这一步可以将图像中的白色区域和黑色区域分开。

  4. 轮廓检测:使用 cv2.findContours() 函数检测出图像中的所有轮廓。这个函数可以返回一个轮廓列表,其中每个轮廓是一个由点组成的数组。

  5. 可视化:使用drawContours() 函数将轮廓可视化。这个函数可以将轮廓画在原始图像上,或者将轮廓绘制在其他图像上,以便进一步分析和处理。

( 2 )操作实现

轮廓检测:contours, hierarchy = cv2.findContours(img,mode,method)

img:要查找区域的二值图像

mode:几种常用图像模式

cv2.RETR_EXTERNAL:只检测最外层轮廓线。
cv2.RETR_LIST:检测所有轮廓线,但不建立轮廓之间的等级关系。
cv2.RETR_CCOMP:检测所有轮廓线,并建立两层轮廓间的等级关系(外层和内层)。
cv2.RETR_TREE:检测所有轮廓线,并重构轮廓之间的嵌套结构。

method:轮廓逼近方法

cv2.CHAIN_APPROX_NONE:存储所有轮廓点,意味着不存在轮廓线之间的点的冗余。cv2.CHAIN_APPROX_SIMPLE:仅存储水平、竖直和对角线上的端点,使得轮廓线之间的点更加紧凑。

contours是一个列表,包含了所有找到的轮廓,每个轮廓是一个列表,包含了轮廓的坐标信息(即起点、终点、长度等)

hierarchy是一个字典,包含了每个轮廓的层级关系,即从父节点到子节点的层级关系

轮廓绘制:cv2.drawContours(copy, contours, -1, (0, 0, 255), 1)

参数含义:绘制图像,轮廓,轮廓索引,颜色模式(BGR),线条宽度

( 3 )代码实现

# 边缘检测
img = cv2.imread("D:\python\Program\pythonProject\photos\A5.png")# 转灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 转二值图
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  # 二值化操作,像素值大于127的点用225表示,小于阈值使用0表示# 轮廓检测
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)# 轮廓绘制
copy = img.copy()
res = cv2.drawContours(copy, contours, -1, (0, 0, 255), 2)cv2.imshow('Laplacian', res)
cv2.imwrite("D:\python\Program\pythonProject\photos\Figure_12.png", res)
cv2.waitKey(0)
cv2.destroyAllWindows()

( 4 )效果展示

在这里插入图片描述


写在后面

👍🏻 点赞,你的认可是我创作的动力!
⭐ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 sizeof, size_t, strlen

C语言 sizeof, size_t, strlen 文章目录 C语言 sizeof, size_t, strlen一. sizeof1.1 返回结构体长度 二. size_t三. sizeof 和 strlen 一. sizeof 返回一个结构体或者类型所占的内存字节数 1.1 返回结构体长度 这里我编写了2个结构体,区别在于数组问题 #include …

基于本地知识构建简易的chatPDF

Langchain chatglm-6b 文章目录 Langchain chatglm-6b前言一、实验记录1.1 环境配置1.2 代码理解1.3 补充内容 二、总结 前言 介绍:一种利用 ChatGLM-6B langchain 实现的基于本地知识的 ChatGLM 应用 Github: https://github.com/imClumsyPanda/langchain-Chat…

《个人博客部署上线教程一》Halo搭建个人博客网站

Halo搭建个人博客网站 一、docker部署Halo 目前测试了两种方法安装Halo,第一种是使用Jar包安装:提供JAR包资源,不过因为使用jar包部署需要Java11才可以,我本机使用的是Java8,所以暂时不做调整。第二种是通过docker安装。 1.1 启…

if条件语句

if条件语句 条件测试 test 测试表达式是否成立,若成立返回0,否则返回其他数值 格式1 :test 条件表达式;格式2 :[ 条件表达式 ] echo $?参数作用-d测试是否为目录 (Directory)-e测试目录或文件是否存在(Exist)-f测…

【java笔记】java多线程

目录 一、概念 1.1 什么是进程? 1.2 什么是线程? 1.3 什么事多线程? 1.4 进程和线程的关系 二、线程对象的生命周期 三、实现线程有两种方式 3.1 继承 java.lang.Thread,重写 run方法 3.2 实现 java.lang.Runnable 接口…

八、vue_options之computed、watch属性选项

一、computed计算属性使用 (1)复杂data的处理方式 (2)computed 计算属性 computed计算属性初体验: 在我们通过Vue调用createApp方法传入一个对象的时候,我们之前写了data属性、methods属性,这…

HTB-Time

HTB-Time 信息收集80端口 立足pericles -> root 信息收集 80端口 有两个功能,一个是美化JSON数据。 一个是验证JSON,并且输入{“abc”:“abc”}之类的会出现报错。 Validation failed: Unhandled Java exception: com.fasterxml.jackson.core.JsonPa…

低代码是开发的未来,还是只能解决边角问题的鸡肋?

随着互联网行业寒冬期的到来,降本增效、开源节流几乎成为了全球互联网厂商共同的应对措施,甚至高薪酬程序员的“35岁危机”一下子似乎变成了现实。程序员的高薪吸引了各行各业的“跨界选手”,是编程门槛降低了吗?不全是&#xff0…

Linux Ansible管理变量、管理事实、管理机密

目录 Ansible变量 变量定义范围 变量类型 定义变量并引用 事实变量与魔法变量 事实变量 魔法变量 Ansible加密 ansible-vault参数 ansible-vault举例 Ansible变量 Ansible支持利用变量来存储值,并且可以在Ansible项目的所有文件中重复使用这些值 变量可能…

Hadoop3.2.4+Hive3.1.2+sqoop1.4.7安装部署

目录 一、软件包 二、JDK部署 1.JDK解压 2.设置环境变量 3.环境验证 4.分发JDK相关文件至Node_02、Node_03 5.环境生效 三、Zookeeper部署 1.Zookeeper解压 2.Zookeeper配置 3.创建myid文件 4.设置环境变量并添加映射 5.分发ZooKeeper 相关文件至Node_02、Node_0…

Qt — Graphics/View框架

文章目录 前言一、Qt图形系统介绍二、Graphics/View框架 前言 Qt的Graphics/View框架被用来存放、显示二维图形元素,处理那些对图形元素进行操作的交互命令。 一、Qt图形系统介绍 Qt 应用程序的图形界面包含各种控件,比如窗口、按钮、滚动条等。所有这…

【单目标优化算法】沙猫群优化算法(Matlab代码实现)

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

4月24日~4月26日学习总结

一,刷题目情况,已经完成了8道题目,对于其中一些题目做一下题解。 这个题目的意思是找到的两个位置l和r,为了做到这个数组的l到r的子数组经过排序后,会变成输入的另外一个数组,这个题目的思路就是首先找到在…

服务(第十篇)Nginx和tomcat反向代理(动静分离)

正向代理: 当用户想访问某一网址时,用户先访问代理服务器,然后由代理服务器向目标网址发送请求最终将数据返回代理服务器,最后代理服务器将数据返回给用户这一过程我们称之为正向代理。 反向代理:基本流程是与正向代理…

(04)基础强化:接口,类型转换cast/convert,异常处理,传参params/ref/out,判断同一对象

一、复习 1、New的截断是指什么? new除了新开空间创建初始化对象外,还有一个隐藏父类同名方法的作用。 当子类想要隐藏父类同名的方法时用new,用了new后父类同名方法将到此为止,后面 继承的…

centos7部署FastDFS服务

一、安装需要的相关依赖 yum -y install make cmake gcc gcc-c 因为我的服务器已经安装了gcc,所以略去 使用gcc -v查看版本 yum -y install zip unzip 安装性能事件通知库 yum -y install libevent 安装nginx依赖 yum -y install libevent yum -y install zli…

最新版TensorFlow的GPU版本不支持原生Windows系统(大坑预警)

一、前言 首先需要说明,按照官方中文文档安装是无法正常检测到GPU的。因为TensorFlow 2.10是支持原生Windows系统GPU环境的最后版本,默认安装的版本都比较高。 中文文档没有说明,英文文档是有提到的: (我在GitHub上找…

操作系统之进程同步和互斥

目录 什么是进程同步和进程互斥 进程互斥的软件实现方法 进程互斥的硬件实现方法 互斥锁 信号量机制 用信号量实现进程互斥和同步 生产者消费者问题 多生产者多消费者问题 吸烟者问题 读者写者问题 哲学家进餐问题 管程 死锁 什么是进程同步和进程互斥 进程同步 进…

Scala之模式匹配与隐式转换

目录 模式匹配: 基础语法如下: 模式守卫: 类型匹配: 对象匹配 样例类: 偏函数: 偏函数的化简写法: 偏函数的使用: 隐式转换: 官方定义: 个人理解&…

Linux-使用mobaxterm连接虚拟机ubuntu

一、准备工作 VMware:16.0.0 Ubuntu:18.4 MobaxTerm:链接:https://pan.baidu.com/s/1dNsahe9wO5KrWlWXtNqT0A?pwdaz39 提取码:az39 二、实操 1.检查系统是否安装ssh service sshd status 如果显示未安装&#xff0…