OpenCV之图像梯度

1. Sobel算子

OpenCV系列—本文底页有多个常用方法链接

1.1 Sobel介绍

cv2.Sobel(src, ddepth, dx, dy, ksize)

  • ddepth:图像的深度
  • dx和dy分别表示水平和竖直方向
  • ksize是Sobel算子的大小

在这里插入图片描述

import cv2  # opencv读取的格式是BGR


def cv_show(img, name):
    cv2.imshow(name, img)
    cv2.waitKey()
    cv2.destroyAllWindows()


img = cv2.imread('../img/pie.png', cv2.IMREAD_GRAYSCALE)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

pie.png原图(右击另存为下载):
在这里插入图片描述

1.2 横向Sobel算子

    采用上述公式中的 G x G_{x} Gx滤波器扫描整张图,提取了左右两边有梯度差的位置,但是横向看圆的上顶端和下顶端的梯度不明显所以呈现图片如下上下端为虚线的圆

sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
cv_show(sobelx, 'sobelx')

结果如下:
在这里插入图片描述

白-黑是正数,黑-白就是负数了,所有的负数会被截断成0,所以要取绝对值。

sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(sobelx, 'sobelx')

加入绝对值后,梯度结果就可以有一个完整的圆:
在这里插入图片描述

1.3 纵向Sobel算子

采用上述公式中的 G y G_{y} Gy滤波器扫描整张图,提取了上下两边有梯度差的位置,但是纵向看圆的左顶端和右顶端的梯度不明显所以呈现图片如左右端为虚线的圆

sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobely = cv2.convertScaleAbs(sobely)
cv_show(sobely, 'sobely')

在这里插入图片描述

1.4 合并横纵向的方法提取更好的边缘的结果

将横向梯度提取滤波器 G x G_{x} Gx与纵向梯度提取滤波器 G y G_{y} Gy相加,即可得到效果较好的圆的边缘梯度信息

sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
cv_show(sobelxy, 'sobelxy')

在这里插入图片描述

不推荐

sobelxy = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy)
cv_show(sobelxy, 'sobelxy')

结果显示,相对于分开使用横纵向算子边缘重影严重:
在这里插入图片描述

1.5 利用1.3方法绘制素描风格

lena.jpg原图,另存为保存:在这里插入图片描述

import cv2  # opencv读取的格式是BGR


img = cv2.imread('../img/lena.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, 'sobelxy')

在这里插入图片描述

2. Scharr算子

在这里插入图片描述

import cv2  # opencv读取的格式是BGR


img = cv2.imread('../img/lena.jpg', cv2.IMREAD_GRAYSCALE)

scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx, 0.5, scharry, 0.5, 0)

二阶动量对纹理细节区分更加丰富结果图如下:
在这里插入图片描述

3. Laplacian算子

在这里插入图片描述

import cv2  # opencv读取的格式是BGR


img = cv2.imread('../img/lena.jpg', cv2.IMREAD_GRAYSCALE)

laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)   

需要配合其他操作共同使用,单个使用的效果不如上面两个算子,结果图如下:
在这里插入图片描述

3. 其他OpenCV系列方法链接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锦鲤AI幸运

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值