在对图像进行边缘检测时,常常使用各种算子完成,下面给出几种常见的算子,坎尼算子、索贝尔算子和拉普拉斯算子的代码。
# -*- coding: utf-8 -*-
"""
Created on Mon Jan 10 13:58:57 2022
@author: 2540817538(有问题请联系此QQ)
python 3.8.8
"""
import cv2
img_0 = cv2.imread('C:/Users/25408/Desktop/p1.jpg',1)
img = cv2.cvtColor(img_0,cv2.COLOR_BGR2GRAY)
cv2.namedWindow('gray', 0)#加入该语句可以拖动窗口大小
cv2.imshow('gray',img)
cv2.waitKey()
#sobel算子
x = cv2.Sobel(img,cv2.CV_16S,1,0)
#即Sobel函数求完导数后会有负值,还有会大于255的值。而原图像是uint8,
y = cv2.Sobel(img,cv2.CV_16S,0,1)
#即8位无符号数,所以Sobel建立的图像位数不够,会有截断。
#因此要使用16位有符号的数据类型,即cv2.CV_16S。
X = cv2.convertScaleAbs(x) # 转回uint8
Y = cv2.convertScaleAbs(y)
soble = cv2.addWeighted(X,0.5,Y,0.5,0)
cv2.namedWindow("soble", 0)
cv2.imshow("soble",soble)
cv2.waitKey(0)
cv2.destroyAllWindows()
#拉普拉斯算子
gray_lap = cv2.Laplacian(img,cv2.CV_16S,ksize = 3)
laplacian = cv2.convertScaleAbs(gray_lap)
cv2.namedWindow('laplacian', 0)
cv2.imshow('laplacian',laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()
#canny算子
img_gs = cv2.GaussianBlur(img,(3,3),0) #用高斯平滑处理原图像降噪。
canny = cv2.Canny(img_gs, 50, 150) #最大最小阈值
cv2.namedWindow('Canny', 0)
cv2.imshow('Canny', canny)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果:
原图:
索贝尔算子:
拉普拉斯算子:
坎尼算子: