二、图像运算的补充---边缘检测

12 篇文章 0 订阅 ¥9.90 ¥99.00

在OpenCV中,边缘检测的方法有以下几种:
Sobel
Scharr
Laplace
Canny
其中前三种的边缘检测是带方向的

1.Sobel:
cvw.Sobel(filename,ddepth,dx,dy,dst=None,ksize=None,scale=None,delta=None,borderType=None)

ddepth:图像颜色深度(不甚了解
针对不同的输入图像,输出目标图像有不同的深度,具体组合如下:

  • 若src.depth() = CV_8U, 取ddepth =-1/CV_16S/CV_32F/CV_64F
  • 若src.depth() = CV_16U/CV_16S, 取ddepth =-1/CV_32F/CV_64F
  • 若src.depth() = CV_32F, 取ddepth =-1/CV_32F/CV_64F
  • 若src.depth() = CV_64F, 取ddepth = -1/CV_64F

dx:int类型的,表示x方向的差分阶数,1或0
dy:int类型的,表示y方向的差分阶数,1或0

kSize:模板大小,对于Sobel算子这里的取值为1,3,5,7,当不输入的时候,默认为3。特殊的,当kSize = 1的时候,采用的模板为13或者31 而非平时的那些格式

2.Scharr:
Scharr(src, ddepth, dx, dy, dst=None, scale=None, delta=None, borderType=None)

参数和Sobel算子一致,不过,该函数与Sobel的区别在于,Scharr仅作用于大小为3的内核。具有和sobel算子一样的速度,但结果更为精确


例子:对比两种方法的效果
import cv2 as cv
import numpy as np

img = cv.imread("color.jpg")

gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)

sobel_x = cv.Sobel(gray,cv.CV_8U,1,0)
sobel_y = cv.Sobel(gray,cv.CV_8U,0,1)
sobel = cv.Sobel(gray,cv.CV_8U,1,1)

scharr_x = cv.Scharr(gray, cv.CV_8U, 1, 0)
scharr_y = cv.Scharr(gray, cv.CV_8U, 0, 1)


cv.imshow("src", img)
cv.imshow("Sobel_x", sobel_x)
cv.imshow("Sobel_y", sobel_y)
cv.imshow("Sobel", sobel)
cv.imshow("Scharr_x", scharr_x)
cv.imshow("Scharr_y", scharr_y)


cv.waitKey(0)
cv.destroyAllWindows()

3.Laplace:
Laplacian(src,ddepth,dst=None,ksize=None,scale=None,delta=None,borderType=None)
scale:Double类型的,计算拉普拉斯可选比例因子,有默认值1
delta:加到输出像素的值,默认为0
borderType:边界模式。默认BORDER_DEFAULT

例子:使用ksize = 3来对吧sobel和laplace

import cv2 as cv
import numpy as np

img = cv.imread("color.jpg")

gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)

sobel = cv.Sobel(gray,cv.CV_8U,1,1)
laplace = cv.Laplacian(gray, cv.CV_8U,ksize = 3)

cv.imshow("laplace", laplace)
cv.imshow("Sobel", sobel)

cv.waitKey(0)
cv.destroyAllWindows()

看上去laplace是sobel的升级版
4.canny
Canny(filename,threshold1,threshold2,edges =None,apertureSize = None,L2gradient = None)
threshold1:int类型,低阈值
threshold2:int类型,高阈值
edeges:单通道存储边缘的输出图像
apertureSize:Sobel算子内核Size大小
L2gradiend:Bool类型的,为真表示使用更精确的L2范数进行计算(两个方向的倒数的平方再开放),为假表示用L1范数(直接将两个方向导数的绝对值相加)

例子:`import cv2 as cv
import numpy as np

img = cv.imread(“color.jpg”)

gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)

#高斯滤波
gauss = cv.GaussianBlur(gray, (3,3), 1)

cv.imshow(“Gauss”,gauss)

canny = cv.Canny(gray,0,200)

cv.imshow(“Canny”,canny)

cv.waitKey(0)
cv.destroyAllWindows()`
在这里插入图片描述

————————————————
最后,感谢博主的分享。
原文链接:https://blog.csdn.net/qq_34711208/article/details/81703341

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值