一、Sobel算子
dst = cv2.Sobel(src,ddepth,dx,dy,ksize)
- ddepth:图像的深度
- dx和dy 分别表示水平和数值方向
- ksize是Sobel算子的大小 (1、3、5、7)
简单理解,Sobel算子可以在两个方向上进行梯度计算,对应的
G
x
G_{x}
Gx? 左右方向和
G
y
G_{y}
Gy? 上下方向。
左右方向: 右减左(从卷积算子可以看出) 上下方向:下减上(从卷积算子可以看出)
(1)程序演示
import cv2
img = cv2.imread("yuan.jpg",cv2.IMREAD_GRAYSCALE)
print(img.shape)
img = cv2.resize(img,(700,700))
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
def cv_show(img):
cv2.imshow('name',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize = 3)
cv_show(sobelx)
因为是右边减去左边,白减去黑是正数,黑减去白是负数,负数会被截断成0,所以要取绝对值。
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize = 3)
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(sobelx)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
cv_show(sobely)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
cv_show(sobely)
(2)相加融合
可以观察到融合之后的白色的边界更加凝实,相比于单独的 x 和 y 来说。
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy)
如果在程序里边同时设置 dx=1,dy=1,也是同样的达到了 上下左右的融合,但是效果不如单独计算再相加。
sobely = cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
cv_show(sobely)
Sobel 算子,对lena 的解析效果。
img = cv2.imread("lena1.jpg",cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy)
二、Scharr算子
dst = cv2.Scharr(src,ddepth,dx,dy)
- ddepth:图像的深度
- dx和dy 分别表示水平和数值方向
通过卷积算子可以看出,Scharr 和 Sobel 基本上是一样的,但是对于中心点周边的权重大小不一样。相比于Sobel ,对于噪声更加敏感,
显示也相应的更加细致。
(1)程序演示(相加融合和上边一样)
img =cv2.imread('lena1.jpg',cv2.IMREAD_GRAYSCALE)
scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
cv_show(scharrxy)
三、Laplacian 算子
dst = cv2.Laplacian(src,ddepth)
- ddepth:图像的深度
(1)程序演示
laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
cv_show(laplacian)
四、三种方法的结果比较
(1)原图
img = cv2.imread("lena1.jpg",cv2.IMREAD_GRAYSCALE)
cv_show(img)
(2)三种方法对比
import numpy as np
img = cv2.imread("lena1.jpg",cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
img =cv2.imread('lena1.jpg',cv2.IMREAD_GRAYSCALE)
scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
vs_slbel_scharr_laplacian = np.hstack((sobelxy,scharrxy,laplacian))
cv_show(vs_slbel_scharr_laplacian )
|