Laplacian算子是一种根据二阶导数的边际检测算子,它能够经过核算图画像素在水平和垂直方向上的二阶导数之和来检测图画中的边际。具体来说,Laplacian算子能够用下面的卷积核表明:

  0  1  0
  1 -4  1
  0  1  0

在运用Laplacian算子之前,需求先将图画进行灰度化处理,然后对图画进行卷积操作。卷积的公式如下:

output(x, y) = sum(kernel(i, j) * input(x + i - 1, y + j - 1))

其间,input表明输入图画,output表明输出图画,kernel表明Laplacian算子的卷积核。

除了直接运用Laplacian算子进行卷积之外,还能够经过先对图画进行高斯滤波来按捺噪声,然后再运用Laplacian算子进行边际检测。这种办法被称为LoG算法(Laplacian of Gaussian)。

下面是一个Python完成的Laplacian算子代码示例:

import cv2
import numpy as np
# 读取图画
img = cv2.imread('image.jpg')
# 将图画转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 界说Laplacian算子的卷积核
kernel = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])
# 运用Laplacian算子进行卷积
laplacian = cv2.filter2D(gray, -1, kernel)
# 显现原始图画和边际检测成果
cv2.imshow('Original', img)
cv2.imshow('Laplacian Edge Detection', laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()

需求注意的是,因为Laplacian算子对噪声比较灵敏,因此在实践运用中,通常需求对图画进行预处理来下降噪声的影响。

关于噪声比较灵敏,可能会发生虚伪的边际。

在实践运用中,咱们常常需求对图画进行预处理,以下降噪声对边际检测的影响。常用的预处理办法包括高斯滑润和中值滤波等。

高斯滑润是一种根据高斯函数的滤波器,其主要思维是经过对像素点周围必定范围内的像素进行加权平均,来下降噪声的影响。高斯滑润能够用卷积运算完成,具体操作如下:

  1. 界说高斯函数

    ![image.png](p1-juejin.byteimg.com/tos-cn-i-k3… bf5df69174394422b63071162aba445c~tplv-k3u1fbpfcp-watermark.image?)

    其间,(x,y)(x,y)表明像素点的位置,\sigma表明高斯函数的标准差。

  2. 根据高斯函数生成卷积核

    图像识别之边缘检测Laplacian算子

    其间,KK表明生成的卷积核,∑i,jG(i,j)\sum_{i,j} G(i,j)表明一切权重之和。

  3. 对图画进行卷积操作

    图像识别之边缘检测Laplacian算子

其间,II表明原始图画,IsmoothI_{smooth}表明滑润后的图画。

代码完成如下(以OpenCV为例):

import cv2
import numpy as np
# 加载图画
img = cv2.imread('test.jpg')
# 界说卷积核巨细和标准差
ksize = (5, 5)
sigma = 1.5
# 生成高斯卷积核
kernel = cv2.getGaussianKernel(ksize, sigma)
# 对图画进行卷积操作
img_smooth = cv2.filter2D(img, -1, kernel)
# 显现图画
cv2.imshow('Original', img)
cv2.imshow('Smooth', img_smooth)
cv2.waitKey(0)
cv2.destroyAllWindows()

中值滤波是一种根据像素邻域的滤波器,其主要思维是将像素点周围必定范围内的像素排序后取中值作为当时像素的值,以去除孤立的噪声点。中值滤波能够用滑动窗口完成,具体操作如下:

  1. 界说窗口巨细,例如 333\times3555\times5 等。窗口巨细应该根据图画噪声的程度和分辨率来挑选。
  2. 将窗口移动到图画上的每一个像素,以此作为窗口的中心点。
  3. 对窗口内的一切像素的灰度值进行排序。
  4. 取排序后中心的值作为当时像素的灰度值。
  5. 将一切像素都进行相同的操作,得到一个新的图画。

下面是中值滤波的Python代码完成:

import numpy as np
import cv2
# 界说中值滤波函数
def median_filter(img, kernel_size):
    # 获取图画宽、高
    height, width = img.shape[:2]
    # 仿制原始图画,以便不改动原始图画
    new_img = img.copy()
    # 核算滤波器半径
    radius = kernel_size // 2
    # 对每一个像素进行滤波
    for i in range(radius, height - radius):
        for j in range(radius, width - radius):
            # 获取窗口内的像素
            window = img[i - radius:i + radius + 1, j - radius:j + radius + 1]
            # 对窗口内的像素进行排序,并取中心值
            new_img[i, j] = np.median(window)
    return new_img
# 读取图画
img = cv2.imread("lena.jpg", cv2.IMREAD_GRAYSCALE)
# 中值滤波处理
median_img = median_filter(img, 3)
# 显现图画
cv2.imshow("Original Image", img)
cv2.imshow("Median Filtered Image", median_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

上述代码中,median_filter 函数用于完成中值滤波,承受两个参数:待处理的图画和滤波器巨细。函数运用 numpy 库中的 median 函数核算窗口内像素的中值,并将其赋给中心像素。函数返回处理后的图画。最终,咱们读取一张灰度图画,运用 median_filter 函数进行中值滤波处理,然后显现原始图画和处理后的图画。

运算速度比较慢,需求运用高斯滑润等预处理操作来下降噪声和运算量

因为Laplacian算子关于噪声比较灵敏,噪声会导致算法检测出虚伪的边际。而高斯滑润能够减少噪声的影响,同时也能够对图画进行滑润处理,以便更好地检测边际。

具体来说,能够运用高斯滑润算法对图画进行预处理,然后再运用Laplacian算子进行边际检测。高斯滑润算法的公式如下:

图像识别之边缘检测Laplacian算子

其间,xxyy表明像素在图画中的位置,\sigma是高斯分布的标准差。该公式表明了一个二维高斯分布,用于对图画进行滑润处理。能够在代码中运用该公式生成高斯滤波器,对图画进行卷积操作以到达滑润处理的效果。

代码示例如下(运用Python和OpenCV库):

import cv2
import numpy as np
# 读取图画
img = cv2.imread('image.jpg', 0)
# 高斯滤波器
kernel = cv2.getGaussianKernel(5, 0)
kernel = kernel * kernel.T
# 高斯滑润处理
img_smooth = cv2.filter2D(img, -1, kernel)
# Laplacian算子
laplacian = cv2.Laplacian(img_smooth, cv2.CV_64F)
# 显现成果
cv2.imshow('Original', img)
cv2.imshow('Smoothed', img_smooth)
cv2.imshow('Laplacian', laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例代码中,咱们首要运用cv2.imread()函数读取一张灰度图画。然后运用cv2.getGaussianKernel()函数生成一个巨细为5×5的高斯滤波器,再对图画进行卷积操作,得到滑润处理后的图画。接着,运用cv2.Laplacian()函数对滑润后的图画进行Laplacian边际检测,得到边际图画。最终运用cv2.imshow()函数显现原图、滑润处理后的图画和边际检测后的图画。