四、opencv常用边缘检测算子-python实现(sobel算子、Scharr算子、拉普拉斯算子、canny算子)

import cv2
import numpy as np
img=cv2.imread("D:/images/ss.jpg",0)

一、sobel算子:

‘’’
Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
src-传入的图像;ddepth-图像深度;dx和dy-求导阶数
ksize-卷积核大小
‘’’

def sobel(img):
    x=cv2.Sobel(img,cv2.CV_16S,1,0)
    y=cv2.Sobel(img,cv2.CV_16S,0,1)
    absX = cv2.convertScaleAbs(x) # 转回uint8 
    absY = cv2.convertScaleAbs(y) 
    dst = cv2.addWeighted(absX,0.5,absY,0.5,0)
    
    #显示结果
    imgs = np.hstack([img,dst])
    cv2.namedWindow('mutil_pic',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('mutil_pic',600,400)
    cv2.imshow("mutil_pic",imgs)
    cv2.waitKey(0)

二、 Scharr算子:

‘’’
当Sobel()函数的参数ksize=-1时,就演变成了3x3的Scharr算子
‘’’

def Scharr(img):
    x=cv2.Sobel(img,cv2.CV_16S,1,0,ksize=-1)
    y=cv2.Sobel(img,cv2.CV_16S,0,1,ksize=-1)
    Scharr_absX = cv2.convertScaleAbs(x) # 转回uint8 
    Scharr_absY = cv2.convertScaleAbs(y) 
    dst = cv2.addWeighted(Scharr_absX,0.5,Scharr_absY,0.5,0)
    
    #显示结果
    imgs = np.hstack([img,dst])
    cv2.namedWindow('mutil_pic',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('mutil_pic',600,400)
    cv2.imshow("mutil_pic",imgs)
    cv2.waitKey(0)

三、拉普拉斯算子:

‘’’
Laplacian函数实现的方法是先用Sobel算子计算二阶x和y导数,再求和。
laplacian = cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
前两个参数是必选参数,其后是可选参数。
src-需要处理的图像;ddepth-图像的深度;ksize-参数是算子的大小(卷积核的大小必须为1,3,5,7);
‘’’

def Laplacian(img):
    laplacian = cv2.Laplacian(img, cv2.CV_16S, ksize=5)
    dst = cv2.convertScaleAbs(laplacian)    # 转回uint8 
    #显示结果
    imgs = np.hstack([img,dst])
    cv2.namedWindow('mutil_pic',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('mutil_pic',600,400)
    cv2.imshow("mutil_pic",imgs)
    cv2.waitKey(0)

四、canny算子:

‘’’
canny = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])
image-需要处理的原图像;threshold1-阈值1,threshold2-阈值2;
较大的阈值2用于检测图像中明显的边缘,第一个阈值来将这些间断的边缘连接起来。
可选参数中aperaperturesize-卷积核的大,而L2gradient参数就是一个布尔值,如果为true,
则就使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开方),
否则使用L1范数(直接将两个方向导数的绝对值相加)。
‘’’

def canny(img):
    blur = cv2.GaussianBlur(img, (3, 3), 0)  # 用高斯滤波处理原图像降噪
    canny = cv2.Canny(blur, 10, 150)  # 50是最小阈值,150是最大阈值
    #canny算法
    imgs = np.hstack([img,canny])
    cv2.namedWindow('mutil_pic',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('mutil_pic',600,400)
    cv2.imshow("mutil_pic",imgs)
    cv2.waitKey(0)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以帮你解答这个问题。 首先,Prewitt 算子是一种常用的一阶边缘检测算子。它可以通过计算像素点周围的灰度值差异来检测图像的边缘。 以下是使用 PythonOpenCV 库进行车道边缘线检测的代码示例,其中包括了 Prewitt 算子实现: ```python import cv2 import numpy as np # 读入原始图像 img = cv2.imread('lane.jpg') # 将原始图像转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 使用 Prewitt 算子进行边缘检测 prewitt_x = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]]) prewitt_y = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]]) edge_x = cv2.filter2D(gray, -1, prewitt_x) edge_y = cv2.filter2D(gray, -1, prewitt_y) edge = cv2.addWeighted(edge_x, 0.5, edge_y, 0.5, 0) # 显示边缘检测结果 cv2.imshow('Edge Detection', edge) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述代码中,我们首先读入了原始图像,并将其转换为灰度图像。然后,我们定义了 Prewitt 算子的 x 和 y 方向卷积核,并使用 cv2.filter2D() 函数进行卷积操作,得到 x 和 y 方向的边缘强度图像。最后,我们使用 cv2.addWeighted() 函数将 x 方向和 y 方向的边缘强度图像按照一定比例加权融合,得到最终的车道边缘线检测结果,并使用 cv2.imshow() 函数进行显示。 需要注意的是,在实际应用中,我们需要对边缘检测结果进行二值化处理,以便进行后续的车道线提取和跟踪等操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小树苗m

您的打赏,是我的动力。

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

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

打赏作者

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

抵扣说明:

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

余额充值