小白学python(opencv边缘检测)

小白学python(opencv边缘检测)


边缘检测就是将图像的边缘提取并检测出来,有以下几种方法:

边缘检测算子类别

边缘检测算子:

一阶导数: Roberts、Sobel、Prewitt
二阶导数: Laplacian、Log/Marr、(Kirsch、Nevitia)
非微分边缘检测算子: Canny

在这里插入图片描述

(又是数学方面,还是靠百度)

Canny()

OpenCV-Python 中 Canny()已经封装好API,直接调用就已经很方便了,而且效果也是相当不错的。

步骤:
彩色图像转换为灰度图像(以灰度图或者单通道图读入)
对图像进行高斯模糊(去噪)
计算图像梯度,根据梯度计算图像边缘幅值与角度
沿梯度方向进行非极大值抑制(边缘细化)
双阈值边缘连接处理
二值化图像输出结果
"""
cv2.Canny(image,            # 输入原图(必须为单通道图)
          threshold1, 
          threshold2,       # 较大的阈值2用于检测图像中明显的边缘
          [, edges[, 
          apertureSize[,    # apertureSize:Sobel算子的大小
          L2gradient ]]])   # 参数(布尔值):
                              true: 使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开放),
                              false:使用L1范数(直接将两个方向导数的绝对值相加)。
"""
(这里函数借鉴大佬的思路)

函数:

def edge_demo(image):  #边缘检测
    blurred = cv.GaussianBlur(image,(3,3),0)
    gray = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY)
    # x
    xgrad = cv.Sobel(gray,cv.CV_16SC1,1,0)
    # y
    ygray = cv.Sobel(gray,cv.CV_16SC1,0,1)

    edge_out = cv.Canny(xgrad,ygray,50,150)
    cv.imshow("edge",edge_out)
    #输出彩色图片
    dst = cv.bitwise_and(image,image,mask= edge_out)
    cv.imshow("image",dst)

结果:
在这里插入图片描述
其实这里canny参数中直接放原图(不处理)也可以,如:

def edge_demo2(image):  #边缘检测2

    edge_out = cv.Canny(image,50,150)
    cv.imshow("edge",edge_out)
    #输出彩色图片
    dst = cv.bitwise_and(image,image,mask= edge_out)
    cv.imshow("image",dst)

在这里插入图片描述
(啧啧啧可见函数的强大)

Sobel()

Sobel的是一阶微分算子,也就是图像的一阶导数,
根据导数的定义,变化越明显的地方,梯度也大,自然
也就对应了图像的边缘。
dst = cv2.Sobel(img, ddepth, dx, dy, [ksize])
img为原始灰度图像;
ddepth为图像深度,也就是图像的位数
dx表示x方向;dy表示y方向;两者一般配合使用
    如果是(1,0)表示求x方向梯度,如果是(0,1)表示y方向的梯度;
ksize表示核的大小,一般为默认参数
def Sobel_demo(image): #缘检测Sobel
    sobelx = cv.Sobel(image, cv.CV_64F, 1, 0)  #沿着x,y取阴影
    sobely = cv.Sobel(image, cv.CV_64F, 0, 1)
    sobelx = cv.convertScaleAbs(sobelx)  #将负值取绝对值
    sobely = cv.convertScaleAbs(sobely)
    sobelxy = cv.addWeighted(sobelx, 0.5, sobely, 0.5, 0) #,将两个方向的梯度带权重相加
    cv.imshow("sobel",sobelxy)

结果:
在这里插入图片描述

Scharr()

和Sobel一样的,只是卷积核不一样,操作完全相同。

def scharr_demo(image): #缘检测scharr
    scharrx = cv.Scharr(image, cv.CV_64F, 1, 0)
    scharry = cv.Scharr(image, cv.CV_64F, 0, 1)
    scharrx = cv.convertScaleAbs(scharrx)
    scharry = cv.convertScaleAbs(scharry)
    scharrxy = cv.addWeighted(scharrx, 0.5, scharry, 0.5, 0)
    cv.imshow("scharr", scharrxy)

结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mcl19909949541

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值