四、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)

你可能感兴趣的:(opencv,opencv,python)