OPEN CV 图像处理中Sobel算子、Scharr算子和Laplacian算子的相关介绍

目录

1.提要:

2.Sobel算子:

 3.Scharr算子

 4.Laplace算子

 5.算子的相关实现


1.提要:

        这几个算子是用图像梯度,解决图像处理中如图像边界的寻找和确定、的相关问题。

2.Sobel算子:

        Sobel 算子是一个离散微分算子。 它计算图像强度函数梯度的近似值。Sobel 算子结合了高斯平滑和微分。在计算Sobel算子的时候要进行水平和垂直两个方向上进行梯度检测,水平变化:

 其中,左边部分为3*3的卷积核函数,因为奇数的核函数锚点比较容易得到,所以一般选择3*3这样的,I里面的内容就是图片的像素的rgb值,通常在0-255直之间。两者相乘得到的内积取绝对值后得到横向变化的值。垂直方向也一样:

 最后把得到的Gx和Gy相加得到最后值:

 3.Scharr算子

       当kernel内核的大小为 3 时,上面显示的 Sobel 内核可能会产生明显的不准确(毕竟,Sobel 只是导数的近似值)。 OpenCV 通过使用 Scharr() 函数解决了大小为 3 的内核的这种不准确性。 这与标准 Sobel 函数一样快但更准确,使用方法与上面的类似:

OPEN CV 图像处理中Sobel算子、Scharr算子和Laplacian算子的相关介绍_第1张图片

 4.Laplace算子

          拉普拉斯算子是二阶微分线性算子,在图像边缘处理中,二阶微分的边缘定位能力更强,锐化效果更好,因此在进行图像边缘处理时,直接采用二阶微分算子而不使用一阶微分。其核函数如下

OPEN CV 图像处理中Sobel算子、Scharr算子和Laplacian算子的相关介绍_第2张图片

 5.算子的相关实现

        1.原图素材:

OPEN CV 图像处理中Sobel算子、Scharr算子和Laplacian算子的相关介绍_第3张图片

 2.sobel算子:

import cv2
import matplotlib.pyplot as plt
import  numpy as np
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == "__main__":
    # img = cv2.imread(r'E:\iu.png')  # 读取方式默认为BGR
    # cv_show('image',img)
    #灰度图读取
    img2 = cv2.imread(r'E:\iu.png',cv2.IMREAD_GRAYSCALE)#灰度图
    # cv_show('image2',img2)
    # print(img.size)#像素点个数
    # print(img.shape)  #图像维度
    sobelx = cv2.Sobel(img2,cv2.CV_64F,0,1,ksize=3)#水平Gx
    sobelx = cv2.convertScaleAbs(sobelx)
    sobely = cv2.Sobel(img2, cv2.CV_64F, 1, 0, ksize=3)  # 垂直Gy
    sobely = cv2.convertScaleAbs(sobely)
    cv_show('sobelx',cv2.addWeighted(sobelx,0.5,sobely,0.5,0))#相加两者权重各位0.5,0是偏置项

结果:

OPEN CV 图像处理中Sobel算子、Scharr算子和Laplacian算子的相关介绍_第4张图片

3. Scharr算子

代码:

import cv2
import matplotlib.pyplot as plt
import  numpy as np
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == "__main__":
    # img = cv2.imread(r'E:\iu.png')  # 读取方式默认为BGR
    # cv_show('image',img)
    #灰度图读取
    img2 = cv2.imread(r'E:\iu.png',cv2.IMREAD_GRAYSCALE)#灰度图
    # cv_show('image2',img2)
    # print(img.size)#像素点个数
    # print(img.shape)  #图像维度
    scharrx = cv2.Scharr(img2,cv2.CV_64F,0,1)#水平Gx
    scharrx = cv2.convertScaleAbs(scharrx)
    scharry = cv2.Scharr(img2, cv2.CV_64F, 1, 0)  # 垂直Gy
    scharry = cv2.convertScaleAbs(scharry)
    cv_show('scharr',cv2.addWeighted(scharrx,0.5,scharry,0.5,0))#相加两者权重各位0.5,0是偏置项




结果:

OPEN CV 图像处理中Sobel算子、Scharr算子和Laplacian算子的相关介绍_第5张图片

4.Laplace算子 

代码:

import cv2
import matplotlib.pyplot as plt
import  numpy as np
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == "__main__":
    # img = cv2.imread(r'E:\iu.png')  # 读取方式默认为BGR
    # cv_show('image',img)
    #灰度图读取
    img2 = cv2.imread(r'E:\iu.png',cv2.IMREAD_GRAYSCALE)#灰度图
    # cv_show('image2',img2)
    # print(img.size)#像素点个数
    # print(img.shape)  #图像维度
    # scharrx = cv2.Scharr(img2,cv2.CV_64F,0,1)#水平Gx
    # scharrx = cv2.convertScaleAbs(scharrx)
    # scharry = cv2.Scharr(img2, cv2.CV_64F, 1, 0)  # 垂直Gy
    # scharry = cv2.convertScaleAbs(scharry)
    # cv_show('scharr',cv2.addWeighted(scharrx,0.5,scharry,0.5,0))#相加两者权重各位0.5,0是偏置项
    Laplacian = cv2.Laplacian(img2,cv2.CV_64F)
    Laplacian = cv2.convertScaleAbs(Laplacian)
    cv_show('laplacian', Laplacian)



结果:

OPEN CV 图像处理中Sobel算子、Scharr算子和Laplacian算子的相关介绍_第6张图片

最后大家自行对比结果,图片是随便找的,大家也可以替换 

你可能感兴趣的:(图像处理,图像处理,计算机视觉,人工智能)