一、Sobel算子
dst = cv2.Sobel(src,ddepth,dx,dy,ksize)
- ddepth:图像的深度
- dx和dy 分别表示水平和数值方向
- ksize是Sobel算子的大小 (1、3、5、7)
![在这里插入图片描述](https://img-blog.csdnimg.cn/9d2879f98b6d4410857344c0765a39a8.png) 简单理解,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()
![在这里插入图片描述](https://img-blog.csdnimg.cn/0514a8068d894e449dd1869d9a11be85.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rex5bqm6I-c6bihLei-vumXu-ilvw==,size_9,color_FFFFFF,t_70,g_se,x_16)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize = 3)
cv_show(sobelx)
![在这里插入图片描述](https://img-blog.csdnimg.cn/805757e7ce964060b5c53256c84ae0a3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rex5bqm6I-c6bihLei-vumXu-ilvw==,size_8,color_FFFFFF,t_70,g_se,x_16)
因为是右边减去左边,白减去黑是正数,黑减去白是负数,负数会被截断成0,所以要取绝对值。
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize = 3)
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(sobelx)
![在这里插入图片描述](https://img-blog.csdnimg.cn/b802f17a4b2347d485978e05f8299dd5.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rex5bqm6I-c6bihLei-vumXu-ilvw==,size_7,color_FFFFFF,t_70,g_se,x_16)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
cv_show(sobely)
![在这里插入图片描述](https://img-blog.csdnimg.cn/be86f7b0551145a6ac1f2449443e4af5.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rex5bqm6I-c6bihLei-vumXu-ilvw==,size_8,color_FFFFFF,t_70,g_se,x_16)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
cv_show(sobely)
![在这里插入图片描述](https://img-blog.csdnimg.cn/7828d0762fb6422782ad21110e33a4fa.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rex5bqm6I-c6bihLei-vumXu-ilvw==,size_7,color_FFFFFF,t_70,g_se,x_16)
(2)相加融合
可以观察到融合之后的白色的边界更加凝实,相比于单独的 x 和 y 来说。
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy)
![在这里插入图片描述](https://img-blog.csdnimg.cn/59017453e16049afba3522d7136b9663.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rex5bqm6I-c6bihLei-vumXu-ilvw==,size_7,color_FFFFFF,t_70,g_se,x_16)
如果在程序里边同时设置 dx=1,dy=1,也是同样的达到了 上下左右的融合,但是效果不如单独计算再相加。
sobely = cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
cv_show(sobely)
![在这里插入图片描述](https://img-blog.csdnimg.cn/85f4177079e047eabc7e4fdd4d36df0e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rex5bqm6I-c6bihLei-vumXu-ilvw==,size_7,color_FFFFFF,t_70,g_se,x_16)
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)
![在这里插入图片描述](https://img-blog.csdnimg.cn/5a2498fcdbd5482ead18c919aed91d7e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rex5bqm6I-c6bihLei-vumXu-ilvw==,size_12,color_FFFFFF,t_70,g_se,x_16)
二、Scharr算子
dst = cv2.Scharr(src,ddepth,dx,dy)
- ddepth:图像的深度
- dx和dy 分别表示水平和数值方向
通过卷积算子可以看出,Scharr 和 Sobel 基本上是一样的,但是对于中心点周边的权重大小不一样。相比于Sobel ,对于噪声更加敏感,
显示也相应的更加细致。
![在这里插入图片描述](https://img-blog.csdnimg.cn/7c0c1eac279e45959ecf2bdd1d2f5971.png)
(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)
![在这里插入图片描述](https://img-blog.csdnimg.cn/fbf86293c6d04758811bfce2b5109199.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rex5bqm6I-c6bihLei-vumXu-ilvw==,size_11,color_FFFFFF,t_70,g_se,x_16)
三、Laplacian 算子
dst = cv2.Laplacian(src,ddepth)
- ddepth:图像的深度
(1)程序演示
laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
cv_show(laplacian)
![在这里插入图片描述](https://img-blog.csdnimg.cn/da324f9c4a2f42419aa5a45cf3c35b10.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rex5bqm6I-c6bihLei-vumXu-ilvw==,size_11,color_FFFFFF,t_70,g_se,x_16)
四、三种方法的结果比较
(1)原图
img = cv2.imread("lena1.jpg",cv2.IMREAD_GRAYSCALE)
cv_show(img)
![在这里插入图片描述](https://img-blog.csdnimg.cn/4fb154cb47de46809d36686b69c9321d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rex5bqm6I-c6bihLei-vumXu-ilvw==,size_11,color_FFFFFF,t_70,g_se,x_16)
(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 )
![在这里插入图片描述](https://img-blog.csdnimg.cn/da1a9f6ef4184deeb2f4f832b3f98452.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rex5bqm6I-c6bihLei-vumXu-ilvw==,size_20,color_FFFFFF,t_70,g_se,x_16)
|