OpenCv算子

目录

一、索贝尔(sobel)算子

二、沙尔(Scharr)算子

 三、拉普拉斯算子


一、索贝尔(sobel)算子

边缘的定义:

边缘是像素值发生跃迁的位置,是图像的显著特征之一,在图像特征提取、对象检测、模式识别等方面都有重要的作用。

sobel算子对图像求一阶导数。一阶导数越大,说明像素在该方向的变化越大,边缘信号越强

OpenCv算子_第1张图片

OpenCv算子_第2张图片

案例代码如下:

import cv2
import numpy as np

img = cv2.imread('6.jpg')

# 计算水平方向的梯度,只有垂直方向的边缘
dx = cv2.Sobel(img,cv2.CV_64F,dx = 1,dy = 0,ksize=5)
# 计算垂直方向的梯度,只有水平方向的边缘
dy = cv2.Sobel(img,cv2.CV_64F,dx = 0,dy = 1,ksize=5)

# 可利用numpy的加法,直接整合两张图片
dst = dx + dy
# 也可利用opencv的加法
dst = cv2.add(dx,dy)
# 使用addWeighted也可以
dst = cv2.addWeighted(dx,0.5,dy,0.5,gamma=0)

cv2.imshow('dx',np.hstack((dx,dy,dst)))

# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()

二、沙尔(Scharr)算子

  •  ​​​​​Scharr算子只支持3*3的kernel所以没有kernel参数了
  • Scharr算子只能求x方向或y方向的边缘
  • Sobel算子的ksize设为-1就是Scharr算子
  • Scharr擅长寻找细小的边缘一般用的较少

案例代码如下:

import cv2
import numpy as np

img = cv2.imread('6.jpg')

# 计算水平方向的梯度,只有垂直方向的边缘
dx = cv2.Scharr(img,cv2.CV_64F,dx = 1,dy = 0)
# 计算垂直方向的梯度,只有水平方向的边缘
dy = cv2.Scharr(img,cv2.CV_64F,dx = 0,dy = 1)

# 可利用numpy的加法,直接整合两张图片
dst = dx + dy
# 也可利用opencv的加法
dst = cv2.add(dx,dy)
# 使用addWeighted也可以
dst = cv2.addWeighted(dx,0.5,dy,0.5,gamma=0)

cv2.imshow('dx',np.hstack((dx,dy,dst)))

# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()

 三、拉普拉斯算子

  • 可以同时求两个方向的边缘
  • 对噪音敏感一般需要先进行去噪再调用拉普拉斯
import cv2
import numpy as np

img = cv2.imread('6.jpg')

dst = cv2.Laplacian(img,-1,ksize=3)

cv2.imshow('img',np.hstack((img,dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下:

OpenCv算子_第3张图片

你可能感兴趣的:(Opencv,opencv,人工智能,计算机视觉)