基于opencv的边缘检测方法
1、梯度运算
用OpenCV的形态变换( 膨胀、腐蚀、开运算和闭运算)函数morphologyEx
梯度运算即膨胀结果-腐蚀结果:
【注意】对于二值图像来说,必须是前景图像为白色,背景为黑色,否则需要进行反二值化处理
import cv2
import matplotlib.pyplot as plt
import numpy as np##读入图片
im1 = cv2.imread(r"fiction\xiaozhu.jpg", cv2.IMREAD_GRAYSCALE)
#创建一个5行5列的值全为1 的卷积核
k = np.ones((5,5),np.uint8)
##进行梯度运算
r = cv2.morphologyEx(im1, cv2.MORPH_GRADIENT, k)##图像展示
plt.subplot(1,2,1)
plt.imshow(im1, cmap="gray")
plt.axis("off")
plt.subplot(1,2,2)
plt.imshow(r, cmap= "gray")
plt.axis("off")
plt.show()
2、sobel算子
可以计算不同方向的梯度,梯度运算如下图所示:
得出x方向的梯度值和y方向的梯度值后,通过G = sqr(GX2 + GY2)或G = |GX|+G|Y|得到整幅图像的梯度。
cv2.Sobel参数:
【注意】
1、如果梯度为负数,会无法显示,所以计算完梯度之后需要进行取绝对值处理。
2、同时计算x方向和y方向的梯度,通常没有分别计算两个方向梯度后,进行后处理效果好,通常用cv2.addWeighted(src1, alpha, src2, beta, gamma)进行修正。
3、卷积核大小只能为奇数。
import cv2
import numpy as npim1 = cv2.imread(r"fiction\xiaozhu1.jpg",cv2.IMREAD_GRAYSCALE)
##默认卷积核为3*3,如果写cv2.Sobel(im1, 0, 1, 0)的话,只能取到一侧边界,另一侧边界值为负,会被规整成0
sobelx = cv2.Sobel(im1, cv2.CV_64F, 1, 0,ksize=3)
sobely = cv2.Sobel(im1, cv2.CV_64F, 0, 1,ksize=3)
##取绝对值
cv2.convertScaleAbs(sobelx)sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
##同时取x、y的sobel算子没有单独计算x、y然后相加的效果好
sobel_tmp = cv2.Sobel(im1, cv2.CV_64F, 1, 1)
cv2.convertScaleAbs(sobel_tmp)cv2.namedWindow("dx=1", 0)
cv2.namedWindow("dy=1", 0)
cv2.namedWindow("after addWeighted", 0)
cv2.namedWindow("dx=1,dy=1", 0)
cv2.imshow("dx=1", sobelx)
cv2.imshow("dy=1", sobely)
cv2.imshow("after addWeighted", sobelxy)
cv2.imshow("dx=1,dy=1", sobel_tmp)
cv2.waitKey(0)
cv2.destroyAllWindows()
3、scharr算子
类似sobel算子,但是卷积核系数不同,离目标点越近的像素权重越大,边缘提取的效果比sobel算子好
二者效果对比如下:
import cv2im1 = cv2.imread(r"fiction\xiaozhu.jpg", cv2.IMREAD_GRAYSCALE)
##Scharr算子提取边缘,scharr相较于sobel算子,靠近核心部分的权值较大,边缘提取的效果更好,x与y不能同时为1
im1x = cv2.Scharr(im1, cv2.CV_64F, 1, 0)
im1y = cv2.Scharr(im1, cv2.CV_64F, 0, 1)
im1x = cv2.convertScaleAbs(im1x)
im1y = cv2.convertScaleAbs(im1y)
im1ScharryXY = cv2.addWeighted(im1x, 0.5, im1y, 0.5, 0)##拉普拉斯算子
imLap = cv2.Laplacian(im1,cv2.CV_64F)
imLap = cv2.convertScaleAbs(imLap)##对比sobel算子提取边缘的效果
im1SobelX = cv2.Sobel(im1, cv2.CV_64F, 1, 0)
im1SobelY = cv2.Sobel(im1, cv2.CV_64F, 0, 1)
im1SobelX = cv2.convertScaleAbs(im1SobelX)
im1SobelY = cv2.convertScaleAbs(im1SobelY)
im1SobelXY = cv2.addWeighted(im1SobelX, 0.5, im1SobelY, 0.5, 0)##sobel算子模拟scharr算子进行边缘提取
im1So_SC_X = cv2.Sobel(im1, cv2.CV_64F, 1, 0, -1)
im1So_SC_Y = cv2.Sobel(im1, cv2.CV_64F, 0, 1, -1)
im1So_SC_X = cv2.convertScaleAbs(im1So_SC_X)
im1So_SC_Y = cv2.convertScaleAbs(im1So_SC_Y)
im1So_SC_XY = cv2.addWeighted(im1So_SC_X, 0.5, im1So_SC_Y, 0.5, 0)cv2.namedWindow("im1ScharryXY", 0)
cv2.namedWindow("im1SobelXY", 0)
cv2.namedWindow("im1So_SC_XY", 0)
cv2.namedWindow("imLap", 0)
cv2.imshow("im1ScharryXY", im1ScharryXY)
cv2.imshow("im1SobelXY", im1SobelXY)
cv2.imshow("im1So_SC_XY", im1So_SC_XY)
cv2.imshow("imLap", imLap)
cv2.waitKey(0)
cv2.destroyAllWindows()
依次为scharry算子、sobel算子、sobel仿scharry、拉普拉斯算子结果
4、canny边缘检测
原理:
1、高斯滤波去噪声
2、平滑后的图像用sobel算子计算梯度,梯度方向如下图所示:
梯度方向一般都与边界垂直,
一般归类为四个方向:垂直、水平,两个对角线
3、去除所有非边界点
4、滞后阈值
选取两个阈值,maxVal和minVal
5、用法,其实就一个函数,cv2.Canny()
import cv2im1 = cv2.imread(r"fiction\pig2.jpg", cv2.IMREAD_UNCHANGED)
im1 = cv2.Canny(im1, 128, 256)
im2 = cv2.Canny(im1, 0, 256)
im3 = cv2.Canny(im1, 0, 128)
im4 = cv2.Canny(im1, 0, 10)cv2.namedWindow("128_256",0)
cv2.namedWindow("0_256",0)
cv2.namedWindow("0_128",0)
cv2.namedWindow("0_10",0)
cv2.imshow("128_256",im1)
cv2.imshow("0_256",im2)
cv2.imshow("0_128",im3)
cv2.imshow("0_10",im4)
cv2.waitKey(0)
5、拉普拉斯金字塔
原图像减去(原图->向下采样->向上采样)
两次采样后图像会被平滑
import cv2im1 = cv2.imread(r"fiction\xiaozhu.jpg", cv2.IMREAD_GRAYSCALE)##向下取样,长、宽各变为1/2
im1Low = cv2.pyrDown(im1)##向上取样,长、宽各变为原来2倍,会变模糊
im1High = cv2.pyrUp(im1Low)##拉普拉斯金字塔结果
lapPyr = im1-im1Highcv2.namedWindow("im1Low",0)
cv2.namedWindow("im1High",0)
cv2.namedWindow("im1",0)
cv2.namedWindow("lapPyr",0)cv2.imshow("im1",im1)
cv2.imshow("im1Low",im1Low)
cv2.imshow("lapPyr",lapPyr)
cv2.imshow("im1High",im1High)cv2.waitKey(0)
cv2.destroyAllWindows()
依次为原图、向下取样一次、向上取样、原图-向上取样结果
可多层构造拉普拉斯金字塔
5、findContours
这是个轮廓检测的方法,注意,边缘和轮廓是不一样的,边缘不一定连续,但是轮廓是连续的。
import cv2o = cv2.imread(r"fiction\xiaozhu.jpg", cv2.IMREAD_GRAYSCALE)
co = cv2.imread(r"fiction\xiaozhu.jpg", cv2.IMREAD_UNCHANGED)
cco = co.copy()
max_threshold,img = cv2.threshold(o,127,255,cv2.THRESH_BINARY)
##findcounters:原始图像、轮廓检测方式(只检测外轮廓、等级树形式等)、轮廓近似方式
##查找、绘制过程中会改变原图像
counters, hieraichy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
r = cv2.drawContours(co, counters, -1, (255,0,0),6)cv2.namedWindow("o", 0)
cv2.namedWindow("r", 0)
cv2.imshow("o", cco)
cv2.imshow("r", r)
cv2.waitKey(0)
cv2.destroyAllWindows()
6、高通滤波
利用傅里叶变换,将o转化为频域
低频为内部信息,高频为边缘信息
通过高通滤波器得到边缘信息
#低频为内部信息,高频为边缘信息import cv2
import matplotlib.pyplot as plt
import numpy as npo = cv2.imread(r"fiction\xiaozhu.jpg", cv2.IMREAD_GRAYSCALE)
##利用傅里叶变换,将o转化为频域,cv2.DFT_COMPLEX_OUTPUT返回双通道的结果,包含幅度和频率,第一个通道是实数部分,第二个通道为虚数部分
#dft = cv2.dft(np.float32(o), flags=cv2.DFT_COMPLEX_OUTPUT)dft = np.fft.fft2(o)#将频域0点移动到中心
dft1 = np.fft.fftshift(dft)# result = 20*np.log(cv2.magnitude(dft1[:,:,0], dft1[:,:,1]))
#
# plt.subplot(2,2,1)
# plt.imshow(o, cmap="gray")
#
# plt.subplot(2,2,2)
# plt.imshow(result,cmap="gray")
#
# plt.show()##通过高通滤波器得到边缘信息
rows,cols = o.shape
crow,ccols = int(rows/2),int(cols/2)dft1[crow-3:crow+30,ccols-30:ccols+30] = 0ishift = np.fft.ifftshift(dft1)iimg = np.fft.ifft2(ishift)iimg = np.abs(iimg)plt.subplot(1,2,1)
plt.imshow(o,cmap="gray")plt.subplot(1,2,2)
plt.imshow(iimg,cmap="gray")plt.show()
相关文章:
基于opencv的边缘检测方法
1、梯度运算 用OpenCV的形态变换( 膨胀、腐蚀、开运算和闭运算)函数morphologyEx 梯度运算即膨胀结果-腐蚀结果: 【注意】对于二值图像来说,必须是前景图像为白色,背景为黑色,否则需要进行反二值化处理 …...
视频封装格式篇(TS)
本篇介绍下TS的封装格式。 1.什么是TS? TS(Transport Stream,传输流),一种常见的视频封装格式,是基于MPEG-2的封装格式(所以也叫MPEG-TS),后缀为.ts。 2.TS的分层结构 …...
静态路由+DHCP实验(四路由器八PC)
一.200.1.1.0/24子网划分 1.划分八个子网 2.选用前5个,第五个子网再划分4个子网作为骨干 二.规划路由 三.配置(下一跳) 1.先依次实现四个路由器之间全网可通 2.为路由器配置地址池,使用全局模式获取dhcp,指定网关…...
数据挖掘(作业汇总)
目录 环境配置 实验1 数据 作业2 环境配置 实验开始前先配置环境 以实验室2023安装的版本为例: 1、安装anaconda:(anaconda自带Python,安装了anaconda就不用再安装Python了) 下载并安装 Anaconda3-2022.10-Windows-x86_64.ex…...
基于微信小程序的图书馆选座系统源码
开发环境及工具: 大等于jdk1.8,大于mysql5.5,idea(eclipse),微信开发者工具 技术说明: springboot mybatis 小程序 代码注释齐全,没有多余代码,适合学习(…...
K8S 三种探针 readinessProbe、livenessProbe和startupProbe
一、POD状态 Pod 常见的状态 Pending:挂起,我们在请求创建pod时,条件不满足,调度没有完成,没有任何一个节点能满足调度条件。已经创建了但是没有适合它运行的节点叫做挂起,这其中也包含集群为容器创建网络…...
Android 设置背景颜色透明度
前言 本章是对设计给出的颜色做透明度的处理 原因 一般情况下我们是不需要做处理的,那为什么又需要我们做透明度呢,原因就是咱们的设计小哥哥、小姐姐们没有自己做处理,如果处理了的话,我们直接使用设计标注的AHEX颜色就行&a…...
聚类算法层次聚类
###cluster.py #导入相应的包 import scipy import scipy.cluster.hierarchy as sch from scipy.cluster.vq import vq,kmeans,whiten import numpy as np import matplotlib.pylab as plt #生成待聚类的数据点,这里生成了20个点,每个点4维: pointsscipy.randn(20,4) #加一…...
js 数据类型
1.概念 数据类型指的是可以在程序中存储和操作的值的类型,每种编程语言都有其支持的数据类型,不同的数据类型用来存储不同的数据,例如文本、数值、图像等。 JavaScript 是一种动态类型的语言,在定义变量时不需要提前指定变量的类…...
多级评论单表结构设计
这里的多级,本质上其实也就二级,例如微博的评论, 一级评论: 对微博的评论 二级评论: 对微博下的评论的回复评论 ,这里包括二种 1. 回复的是一级评论, 2, 回复的是二级评论 效果如下 表数据 查…...
Mac M1通过VMWare Fusion安装Centos7记录(镜像和网络有大坑)
以前用linux系统基本都在我的服务器上或者是在win上进行,从没有在M1上进行创建,因此走了一些坑吧,这里会列出我的详细安装步骤。 下载镜像 镜像的下载网站:https://www.centos.org/download/ 在该网站中,不管是Every…...
女生适合当程序员吗?
在这个节日里,让我们来讨论一个比较热门的话题吧。女生到底适不适合当程序员? 在开启这个话题前,我们先来认识一位伟大的女性吧。 阿达洛芙莱斯(Augusta Ada King)是著名英国诗人拜伦之女,她本职是一位数…...
昇腾AI机器人发布,12家企业、5家高校签约,昇腾AI开发者创享日全国巡展沈阳首站成功举办
“创未来,享非凡”昇腾AI开发者创享日2023年全国巡回首站活动成功举办,本次活动由辽宁省科技厅指导,由沈阳市科技局、浑南区人民政府、沈阳高新区管理委员会、华为技术有限公司共同主办,沈阳昇腾人工智能生态创新中心承办…...
anaconda如何改变虚拟环境安装路径
1、查看anaconda的环境配置(对应结果如下图所示) conda config --show 或者 conda info 查看虚拟环境安装位置的结果如上图所示 2、修改配置语法 conda config --add key value #添加语法 conda config --remove key value #删除语法 其中࿰…...
根据卫星运动矢量计算轨道六根数
前言 STK软件在给定六根数时,可求得卫星位置和速度矢量,但有时我们通过星历参数得到卫星的位置和速度矢量,希望能够反演得出卫星轨道的六根数。从而方便对该卫星轨道进行仿真模拟。 计算过程 给定卫星在J2000坐标系下的的位置矢量r和速度矢…...
关于微信小程序安装npm的过程,从下载到小程序内部安装完成
1.先从官网下载nodejs 网站为Node.js (nodejs.org),选择左边第一个2 然后一直next,选默认就行 选择自己喜欢的路径我的是D:\nodejs-v18.12.1 3 下载完成后,先在安装文件夹中新建两个文件夹 node_cache node_global 4 配置一下环境变量&…...
IO-操作系统
用户态和内核态 现代操作系统,为了保护系统的安全,都会划分出内核空间和用户空间,或者我们经常说的内核态和用户态。简单来说,就是划分为内核态和用户态两个等级,运行在用户态的进程大都是一些应用程序,能够…...
Downie 4 4.6.12 MAC上最好的一款视频下载工具
Downie for Mac 简介 Downie是Mac下一个简单的下载管理器,可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 Downie 4 Downie 4 for Mac Downie 4 for Mac软件特点 支持许多站点 -当前支持1000多个不同的站点&…...
unity 玩家移动时idle和run动画频繁切换
项目场景: unity 控制玩家移动 问题描述 idle和run动画频繁切换 void Movement(){ xVelocity Input.GetAxisRaw("Horizontal"); anim.SetFloat("speed",Mathf.Abs(rb.velocity.x));//跑动动画 if(xVelocity !0){ transform.localScal…...
小程序 table组件
最近有在小程序中用table的需求,但是没有找到有符合要求的组件,所以自己弄了一个,能满足基本需求。 组件下载:https://download.csdn.net/download/weixin_67585820/85047405 引入 "usingComponents": {"table": "…...
利用摄影测量进行地形建模的介绍
一、前言 从一个地方到另一个地方的地球表面由连续和突然的海拔变化组成,个人和社会都必须应对这些变化。 水从高山和丘陵向下流,从溪流流入河流,形成三角洲,最终汇入大海。 三维 (3D) 地面信息的获取和表示一直是与行星表面相关的…...
中文代码138
邢唷?? > ? ? ? ? ? ? ?R o o t E n t r y ? F 喹8N"a? ? S u m m a r y I n f …...
JQuery用法
JQuery 优点 : (1)提供了强大的功能函数 (2)解决浏览器兼容性问题 (3)实现丰富的 UI 和插件 (4)纠正错误的脚本知识… 1、Jquery对象 $ 符号在 jQuery 中代表对 jQuery 对象的引用,…...
Python采集热门城市景点数据+简单制作数据可视化图
人生苦短,我用python 真的好想出去玩啊!!! 春游啊这是!!! 万物复苏的好季节!!! python 安装包资料:点击此处跳转文末名片获取 一、模块使用: …...
VUE-cli搭建项目
vue-cli 官方提供的一个脚手架,用于快速生成一个 vue 的项目模板;预先定义好的目录结构及基础代码,就好比咱们在创建 Maven 项目时可以选择创建一个骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速;…...
Feign返回值统一处理
背景 服务端的接口一般有固定的返回格式,有数据、返回码和异常时错误信息。结构如下 Data public class BaseResponse<T> {private String code;private String message;private T data;public boolean isSuccess() {return "SUCCESS".equals(cod…...
探究如何在Linux系统中修改进程资源限制:四种方法调整进程限制,让你的系统高效运行(包含应用层getrlimit和setrlimit API)
探究如何在Linux系统中修改进程资源限制1.进程资源限制的概念2.修改进程资源限制的意义与应用场景1.软限制与硬限制2.常见资源限制类型Linux中的资源限制1.ulimit命令a. 语法及选项b. 示例与应用2./etc/security/limits.conf配置文件a. 配置文件结构b.示例与应用3. 使用cgroups…...
9.5. 机器翻译与数据集
笔记 9.5. 机器翻译与数据集 — 动手学深度学习 2.0.0 documentation 1.下载文件 读文件 2.处理数据 在所有标点符号前面加空格 后面用于分割 因为法语英语可能有半角全角的字符区分用utf编码的方式统一成半角字符的空格 3.因为分隔用的是空格split 所有vocab是没有空格的 …...
跟着凯新生物2 Arm PEG Biotin,2-Branched PEG Biotin,生物素-聚乙二醇-二臂/支,学试剂知识
中英文名:2 Arm/Branched PEG Biotin,2 ArmPEG Biotin,二臂/支 PEG 生物素一、Product specifications: 1.CAS No:N/A 2.Packaging specification:10mg,25mg,50mg, flexible packagi…...
react组件进阶(四)
文章目录1. 组件通讯介绍2. 组件的 props3. 组件通讯的三种方式3.1 父组件传递数据给子组件3.2 子组件传递数据给父组件3.3 兄弟组件4. Context5. props 深入5.1 children 属性5.2 props 校验5.3 props 的默认值6. 组件的生命周期6.1 组件的生命周期概述6.2 生命周期的三个阶段…...
网站seo技术能不能赚钱/营销技巧和营销方法培训
GPIO是指通用输入输出接口(general-purpose input/output),以前的板子是26针,4B型号是40针,每根针的含义从各种文档中找了几个图。 针的序号与GPIO的序号是不一样的。有些针是固定的含义,3.3V电压、5V电压…...
三网合一 做网站/seo自动推广工具
1. 问题现象 在对项目中的clickhouse数据库进行查询的时候,提示:Too many simultaneous queries,如下图: 2. 问题原因 根据以往数据库的使用经验,确定应该是当前正在执行的查询数过多,超过了数据库的最…...
wordpress支付配置/太原网站开发
面包屑导航的作用是不言而喻的,现在一般大大小小的网站都会做一个面包屑导航功能,这不仅有益于用户的体验,而且对于百度SEO优化来说也是比较重要的!那么ZBlogPHP网站的面包屑导航该怎样写呢?在网上流传最广泛的一种比较…...
网站页面设计费用/运营怎么做
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL也是一个免费的软件。 下载 首先登录MySQL的官网:MySQL :: Developer Zone 点击do…...
如何建设网站推广平台/百度账号人工申诉
数据内容:2014-2015年四川省、重庆市(川渝地区)零售商销售数据 数据格式:.csv格式 数据量:152万条 数据字段: a) YEARMONTH:销售年月 b) STORE_NAME:商店名称 c) LOCAL_CHANNEL_TYPE…...
头像制作 设计 文字/seo实战培训视频
详解Android中的屏幕方向 博客分类: Android AndroidXML 详解Android中的屏幕方向 屏幕方向 是对Activity而言的,所以你可以在AndroidManifest.xml 文件中,通过<activity> 标记的screenOrientation属性进行设定,例…...