当前位置:   article > 正文

Sobel(索贝尔),Scharr(沙尔)和Laplacian(拉普拉斯)算子——python实现_python sobel

python sobel

1.Sobel(索贝尔)(高斯):通过对X,Y方向求梯度

(1)首先求解X方向的导;
(2)再求Y方向的导;
(3)最终结果:|G|=|Gx|+|Gy|;


2.具体实现原理过程

(1)如果对X方向求梯度,使用如下面这样的卷积核
在这里插入图片描述对图像中的像素值进行卷积(点乘):
在这里插入图片描述
(2)如果对Y方向求梯度,使用如下面这样的卷积核
在这里插入图片描述
对图像中的像素值进行卷积(点乘):
在这里插入图片描述
在这里插入图片描述


3.代码实战

import os
import cv2
import numpy as np

def SobelFilter(img_path='images/chess.png'):
    img_src=cv2.imread(img_path)
    img=cv2.resize(src=img_src,dsize=(450,450))
    img_dy=cv2.Sobel(src=img,ddepth=-1,dx=1,dy=0,ksize=5)
    img_dx=cv2.Sobel(src=img,ddepth=-1,dx=0,dy=1,ksize=5)
    img_dx_dy=img_dx+img_dy
    # img_dx_dy=cv2.add(img_dx,img_dy)
    cv2.imshow('img_src',img_src)
    cv2.imshow('img_dx',img_dx)
    cv2.imshow('img_dy',img_dy)
    cv2.imshow('img_dx_dy',img_dx_dy)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def detectSobelFilter():
    cap=cv2.VideoCapture(0)
    while cap.isOpened():
        OK,frame=cap.read()
        if OK:
            img = cv2.resize(src=frame, dsize=(450, 450))
            img_dy = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=5)
            img_dx = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=0, dy=1, ksize=5)
            img_dx_dy = img_dx + img_dy
            cv2.imshow('object',img_dx_dy)
        else:
            print('为检测到物体')
        if cv2.waitKey(1)&0XFF==27:
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    print('Pycharm')
    SobelFilter()
    # detectSobelFilter()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

对下面这张图分别进行X和Y方向求梯度进行测试:
在这里插入图片描述
在这里插入图片描述
实时测试:
在这里插入图片描述


2.Scharr(沙尔算子)算子

(1)与索贝尔不同的是kernel的值不同,沙尔只支持kernel(3,3),所以函数中的kernel不需要设置;
(2)沙尔只能求X方向或者Y方向的边缘。

函数:Scharr(src, ddepth, dx, dy, dst=None, scale=None, delta=None, borderType=None)
(1)src:输入的原始图像;
(2)Ddepth:输出图像的位深,如CV_32F,CV_64F;
(3)Dx:对X方向的求导;
(4)Dy:对Y方向的求导;
(5)Dst:输出的图像;
(6)Scale:缩放尺寸,默认值为1;
(7)Delta:

实例代码

实例代码:


import os
import cv2
import numpy as np

def ScharrFilter(img_path='images/chess.png'):
    img_src=cv2.imread(img_path)
    img=cv2.resize(src=img_src,dsize=(450,450))
    img_dy=cv2.Scharr(src=img,ddepth=-1,dx=1,dy=0)
    img_dx=cv2.Scharr(src=img,ddepth=-1,dx=0,dy=1)
    img_dx_dy=img_dx+img_dy
    # img_dx_dy=cv2.add(img_dx,img_dy)
    cv2.imshow('img_src',img_src)
    cv2.imshow('img_dx',img_dx)
    cv2.imshow('img_dy',img_dy)
    cv2.imshow('img_dx_dy',img_dx_dy)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def detectScharrFilter():
    cap=cv2.VideoCapture(0)
    while cap.isOpened():
        OK,frame=cap.read()
        if OK:
            img = cv2.resize(src=frame, dsize=(450, 450))
            img_dy = cv2.Scharr(src=img, ddepth=cv2.CV_64F, dx=1, dy=0)
            img_dx = cv2.Scharr(src=img, ddepth=cv2.CV_64F, dx=0, dy=1)
            img_dx_dy = img_dx + img_dy
            cv2.imshow('object',img_dx_dy)
        else:
            print('为检测到物体')
        if cv2.waitKey(1)&0XFF==27:
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    print('Pycharm')
    ScharrFilter()
    # detectScharrFilter()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

在这里插入图片描述
在这里插入图片描述


3.拉普拉斯算子

(1)可以同时求X,Y方向的边缘;
(2)对噪音敏感,一般需要先进行去噪再调用拉普拉斯算法(中值或者高斯算法去噪);

函数:Laplacian(src, ddepth, dst=None, ksize=None, scale=None, delta=None, borderType=None):

(1)src:输入的原始图像;
(2)Ddepth:输出图像的位深,如CV_32F,CV_64F;
(3)Dx:对X方向的求导;
(4)Dy:对Y方向的求导;
(5)Dst:输出的图像;
(6)Ksize:卷积核的大小;
(7)Scale:缩放尺寸,默认值为1;

实例代码:

import os
import cv2
import numpy as np

def LaplacianFilter(img_path='images/chess.png'):
    img_src=cv2.imread(img_path)
    img=cv2.resize(src=img_src,dsize=(450,450))
    img=cv2.Laplacian(src=img,ddepth=-1,ksize=5)
    cv2.imshow('img_src',img_src)
    cv2.imshow('img',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def detectLaplacianFilter():
    cap=cv2.VideoCapture(0)
    while cap.isOpened():
        OK,frame=cap.read()
        if OK:
            img = cv2.resize(src=frame, dsize=(450, 450))
            img=cv2.Laplacian(src=img,ddepth=-1,ksize=5)
            cv2.imshow('object',img)
        else:
            print('为检测到物体')
        if cv2.waitKey(1)&0XFF==27:
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    print('Pycharm')
    # LaplacianFilter()
    detectLaplacianFilter()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

在这里插入图片描述
在这里插入图片描述

关于Canny边缘检测:https://mydreamambitious.blog.csdn.net/article/details/125116318

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/69799
推荐阅读
相关标签
  

闽ICP备14008679号