目录
2.应用:
1.边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点,往往以轮廓的形式表现出来
2.分类:边缘检测大幅度减少了数据量,删除了不相干的信息,保留图像重要的结构属性,它大幅可以分为两类
1>基于搜索:通过寻找图像一阶导数中最大值来检测边界利用计算结果估计边缘局部方向,通常采用梯度方向,利用此方向找到局部梯度模最大值,代表算法是Sobel算子和Scharr算子
2>基于零穿越:通过寻找图像二阶导数零穿越来寻找边界,代表算法为Laplacian算子
Sobel边缘检测算法相对简单,实际应用时效率比canny要高,但是没有其精确,Sobel算子是高斯平滑和微分操作的结合体,其抗噪声能力强,当对效率要求较高,而对细纹理不太关心时,普遍应用Sobel算子
将图像I与基数大小的模板进行卷积,当模板大小为3时,垂直变化以及水平变化:


基于以上两个结果,求出每一点:

注意:当内核大小为3时,Sobel算子会产生比较明显误差,需要使用Scharr算法(只有大小为3核)

Sobel_x_y=cv.Sobel(src,ddepth,dx,dy,dst,ksize,scale,delta,borderType)
参数:
dx,dy指求导的阶数,取值为0(表示没有求导),1
ksize:卷积核大小,为奇数,默认是3,当为-1时,演变成3*3Scharr算子
scale:缩放导数比例常数,默认没有
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
img=cv.imread('cat.png',0)
#显示原图
#plt.imshow(img,cmap=plt.cm.gray)
#plt.show()
#计算Sobel卷积结果
x=cv.Sobel(img,cv.CV_16S,1,0)#cv.CV_16S表示图像转换成16位有符号数据类型
y=cv.Sobel(img,cv.CV_16S,0,1)
#将数据进行转换会uint8形式
Sobel_x=cv.convertScaleAbs(x)
Sobel_y=cv.convertScaleAbs(y)
#利用函数将结果进行合成
result=cv.addWeighted(Sobel_x,0.5,Sobel_y,0.5,0)
#t图像显示
#plt.imshow(result,cmap=plt.cm.gray)
#plt.show()
#利用Scharr算子
x1=cv.Sobel(img,cv.CV_16S,1,0,ksize=-1)
y1=cv.Sobel(img,cv.CV_16S,0,1,ksize=-1)
Sobel_x1=cv.convertScaleAbs(x1)
Sobel_y1=cv.convertScaleAbs(y1)
result1=cv.addWeighted(Sobel_x1,0.5,Sobel_y1,0.5,0)
plt.imshow(result1,cmap=plt.cm.gray)
plt.show()



Laplacian算子是利用二阶导来检测边缘,不连续函数二阶导数计算:

则卷积核大小为:

laplacian=cv.Laplacian(src,ddepth,dst,ksize,scale,delta,borderType)
ddepth:图像的深度,-1表示和原图像深度相同,目标图像的深度大于等于原图像
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
img=cv.imread('cat.png',0)
#显示原图
#plt.imshow(img,cmap=plt.cm.gray)
#plt.show()
#计算Laplacian卷积结果
laplacian=cv.Laplacian(img,cv.CV_16S)
#数据进行转换成uint8形式
result=cv.convertScaleAbs(laplacian)
plt.imshow(result,cmap=plt.cm.gray)
plt.show()


1>噪声去除:由于边缘检测很容易受到噪声的影响,所以首先使用5 * 5高斯滤波器去除噪声
2>计算图像梯度:对平滑后的图像使用Sobel算子计算水平方向和竖直方向的一阶导数(Gx 和Gy)。根据得到的这两幅梯度,找到边界梯度和方向
3>非极大值抑制:在获得梯度的方向和大小之后,对整幅图像进行扫描,去除那些非边界上的点。对每一个像素进行检查,看这个点的梯度是不是周围具有相同梯度方向的点中最大的
4>滞后阈值:确定真正的边界,设置两个阈值: minVal 和maxVal。当图像的灰度梯度高于maxVal时被认为是真的边界,低于minVal的边界会被抛弃
canny=cv.Canny(src,threshold1,threshold2)
threshold1:较小的阈值minval,threshold2:较大的阈值maxval
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
img=cv.imread('cat.png',0)
#plt.imshow(img,cmap=plt.cm.gray)
#plt.show()
canny=cv.Canny(img,0,100)
plt.imshow(canny,cmap=plt.cm.gray)
plt.show()


我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题
我正在使用rubydaemongem。想知道如何向停止操作添加一些额外的步骤?希望我能检测到停止被调用,并向其添加一些额外的代码。任何人都知道我如何才能做到这一点? 最佳答案 查看守护程序gem代码,它似乎没有用于此目的的明显扩展点。但是,我想知道(在守护进程中)您是否可以捕获守护进程在发生“停止”时发送的KILL/TERM信号...?trap("TERM")do#executeyourextracodehereend或者你可以安装一个at_exit钩子(Hook):-at_exitdo#executeyourextracodehe
我有一个定义类的Ruby脚本。我希望脚本执行语句BoolParser.generate:file_base=>'bool_parser'仅当脚本作为可执行文件被调用时,而不是当它被irbrequire(或通过-r在命令行上传递)时。我可以用什么来包装上面的语句,以防止它在我的Ruby文件加载时执行? 最佳答案 条件$0==__FILE__...!/usr/bin/ruby1.8classBoolParserdefself.generate(args)p['BoolParser.generate',args]endendif$0==_
我有以下字符串,我想检测那里的换行符。但是Ruby的字符串方法include?检测不到它。我正在运行Ruby1.9.2p290。我哪里出错了?"/'ædres/\nYour".include?('\n')=>false 最佳答案 \n需要在双引号内,否则无法转义。>>"\n".include?'\n'=>false>>"\n".include?"\n"=>true 关于Ruby无法检测字符串中的换行符,我们在StackOverflow上找到一个类似的问题: h
文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3
我有一个连接到服务器的rubytcpsocket客户端。在发送数据之前如何检查套接字是否已连接?我是否尝试“拯救”断开连接的tcpsocket,重新连接然后重新发送?如果是这样,有没有人有一个简单的代码示例,因为我不知道从哪里开始:(我很自豪我设法在rails中获得了一个持久连接的客户端tcpsocket。然后服务器决定杀死客户端,一切都崩溃了;)编辑我已经使用此代码解决了一些问题-如果未连接,它将尝试重新连接,但如果服务器已关闭则不会处理这种情况(它将继续重试)。这是正确方法的开始吗?谢谢defself.write(data)begin@@my_connection.write(
我在一台Windows764位机器上使用Sass和Ruby(最新版本),我正在我的家庭服务器上处理一个共享文件夹。(但是,我不得不承认问题本身也出现在服务器上,因为我试图安装Ruby并直接-watch服务器上的文件)。问题如下:如果我第一次保存,检测到变化,我的style.css被直接覆盖。之后,我总是需要保存多达7次才能覆盖style.css。每次都会检测到更改,但不会编译任何内容。这是一个屏幕:>>>Sassiswatchingforchanges.PressCtrl-Ctostop.overwritestyle.css>>>Changedetectedto:E:/Websites
我所在的团队负责管理公司面向公众的云平台。我们拥有大量运行面向互联网的VM的用户群。我想对我们的地址空间进行自动扫描,看看是否有人在运行Rails应用程序,这样我就可以通知他们升级他们的Rails版本,以避免本周出现的严重安全漏洞。我注意到在某些Apache部署中,有一个有用的PassengerHeader:X-Powered-By:PhusionPassenger(mod_rails/mod_rack)2.0.3然而,这并不可靠。我想知道是否有一种可靠的方法来检测在Web服务器后面运行的Rails,无论是使用响应header还是某种可以确定的GET/POST。谢谢!