文章目录
- 前言
- 一、一阶导数算子:sobel算子
- 二、二阶导数算子:拉普拉斯算子
- 三.Canny算子
前言
参考视频:opencv教程(跟着视频敲了一遍代码)
参考教材:《数字图像处理基础》 作者:朱虹
一、一阶导数算子:sobel算子
在python里调用sobel算子的指令如下例子所示:
sobelx=cv2.Sobel(X1,cv2.CV_64F,1,0,ksize=3)
其中X1是导入的图像(一般为灰度图),ksize是sobel算子的大小.
1,0表示算的是水平的梯度;0,1则表示算的是垂直的梯度
完整例子:
import cv2
import numpy as np
X1=cv2.imread('dog.jpg',0)
sobelx=cv2.Sobel(X1,cv2.CV_64F,1,0,ksize=3)
sobely=cv2.Sobel(X1,cv2.CV_64F,0,1,ksize=3)
res=np.hstack((sobelx,sobely))
cv2.imshow('dog',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果:
视频里还讲到一种水平操作和垂直操作互相叠加的用法:
import cv2
X1=cv2.imread('dog.jpg',0)
sobelx=cv2.Sobel(X1,cv2.CV_64F,1,0,ksize=3)
sobelx=cv2.convertScaleAbs(sobelx)
sobely=cv2.Sobel(X1,cv2.CV_64F,0,1,ksize=3)
sobely=cv2.convertScaleAbs(sobely)
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv2.imshow('dog',sobelxy)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果直接把sobel=cv2.Sobel(X1,cv2.CV_64F,1,0,ksize=3)里面的dx,dy直接设为1,1呢:
import cv2
X1=cv2.imread('dog.jpg',0)
sobelxy=cv2.Sobel(X1,cv2.CV_64F,1,1,ksize=3)
sobelxy=cv2.convertScaleAbs(sobelxy)
cv2.imshow('dog',sobelxy)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果可能不太好。
当然一阶算子还不止这一个
二、二阶导数算子:拉普拉斯算子
import cv2
X1=cv2.imread('dog.jpg',0)
laplacian=cv2.Laplacian(X1,cv2.CV_64F)
y=cv2.convertScaleAbs(laplacian)
cv2.imshow('dog',y)
cv2.waitKey(0)
cv2.destroyAllWindows()
当然二阶算子也还不止这一个
三.Canny算子
v1=cv2.Canny(X1,80,150)
其中X1为输入的图像(一般是灰度图像),后面两个参数是可以设定的双阈值(minval和maxval)。
前面那个参数(这里是80),如果图像中的梯度值小于80,就会被舍弃。后面那个参数(这里是150),如果图像中的梯度值大于150,就会保留,处理为边界。
minval和maxval设置的小,保留边界的条件越低,图像中边界越多
以下为一个实验的例子:
import cv2
import numpy as np
X1=cv2.imread('dog.jpg',0)
v1=cv2.Canny(X1,100,170)
v2=cv2.Canny(X1,80,150)
v3=cv2.Canny(X1,50,100)
res=np.hstack((v1,v2,v3))
cv2.imshow('1',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
可以看到从V1到V3,边界保留的条件越来越轻松,图像中的细节也越来越多。