1、拉普拉斯变换

拉普拉斯变换的定义为: L a p l a c i a n = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 Laplacian = \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2} Laplacian=x22f+y22f

就是对原图像的 x方向 和 y方向,分别做 2阶偏导数,然后相加。

以上的拉普拉斯变换公式,应用在连续的函数中,我们应该都会求解的,但是在图像这个离散的二维环境中,怎么做拉普拉斯变化呢,具体怎么计算呢?我们往下看:

我们知道连续的一阶导函数公式如下:

f ′ ( x 0 ) = l i m Δ x → 0 f ( x 0 + Δ x ) − f ( x 0 ) Δ x f'(x_0) = lim_{\Delta x \rightarrow 0} \frac{f(x_0+\Delta x) - f(x_0)}{\Delta x} f(x0)=limΔx0Δxf(x0+Δx)f(x0)

那么,离散的一阶导函数公式为:

f ′ ( x 0 ) = l i m Δ x → 1 f ( x 0 + Δ x ) − f ( x 0 ) Δ x = f ( x 0 + 1 ) − f ( x 0 ) f'(x_0) = lim_{\Delta x \rightarrow 1}\frac{f(x_0+\Delta x) - f(x_0)}{\Delta x} = f(x_0+1)-f(x_0) f(x0)=limΔx1Δxf(x0+Δx)f(x0)=f(x0+1)f(x0)

所以,图像在 x , y x, y x,y 两个方向上的一阶偏导数分别为:
∂ f ∂ x = f ( x + 1 , y ) − f ( x , y )   ∂ f ∂ y = f ( x , y + 1 ) − f ( x , y ) \frac{\partial f}{\partial x} = f(x+1 ,y) - f(x, y) \\ \ \\ \frac{\partial f}{\partial y} = f(x, y+1) - f(x, y) xf=f(x+1,y)f(x,y) yf=f(x,y+1)f(x,y)

然后,在一阶偏导函数的基础上,求二阶偏导函数。因为在求一阶偏导函数的时候,我们是通过 x+1 的形式来近似求 x点 的偏导的,直观上来讲,有点偏右了,所以在求二阶导函数的时候,我们让 x = x − 1 x=x-1 x=x1 来近似 x x x 点,更为恰当,所以,在 x , y x, y x,y 方向上的二阶偏导数分别为:
∂ 2 f ∂ x 2 = ∂ [ f ( x + 1 , y ) − f ( x , y ) ] ∂ x   = ∂ f ( x + 1 , y ) ∂ x − f ( x , y ) ∂ x   = [ f ( x + 1 , y ) − f ( x ) ] − [ f ( x , y ) − f ( x − 1 , y ) ]   = f ( x − 1 , y ) + f ( x + 1 , y ) − 2 f ( x , y )   ∂ 2 f ∂ y 2 = ∂ [ f ( x , y + 1 ) − f ( x , y ) ] ∂ y   = ∂ f ( x , y + 1 ) ∂ y − f ( x , y ) ∂ y   = [ f ( x , y + 1 ) − f ( x , y ) ] − [ f ( x , y ) − f ( x , y − 1 ) ]   = f ( x , y − 1 ) + f ( x , y + 1 ) − 2 f ( x , y ) \begin{aligned} \frac{\partial^2 f}{\partial x^2} &= \frac{\partial [f(x+1, y) - f(x, y)] }{\partial x} \\ \ \\ &= \frac{\partial f(x+1, y)}{\partial x} - \frac{f(x, y)}{\partial x} \\ \ \\ &= [f(x+1,y) - f(x)] - [f(x, y) - f(x-1, y)] \\ \ \\ &=f(x-1, y) + f(x+1, y) - 2 f(x, y)\\ \ \\ \frac{\partial^2 f}{\partial y^2} &= \frac{\partial [f(x, y+1) - f(x, y)] }{\partial y} \\ \ \\ &= \frac{\partial f(x, y+1)}{\partial y} - \frac{f(x, y)}{\partial y} \\ \ \\ &= [f(x, y+1) - f(x,y)] - [f(x,y) - f(x,y-1)] \\\ \\ &=f(x,y-1) + f(x,y+1) - 2 f(x,y) \end{aligned} x22f    y22f   =x[f(x+1,y)f(x,y)]=xf(x+1,y)xf(x,y)=[f(x+1,y)f(x)][f(x,y)f(x1,y)]=f(x1,y)+f(x+1,y)2f(x,y)=y[f(x,y+1)f(x,y)]=yf(x,y+1)yf(x,y)=[f(x,y+1)f(x,y)][f(x,y)f(x,y1)]=f(x,y1)+f(x,y+1)2f(x,y)

再由拉普拉斯算子的定义,把上面的两个式子求和,就得到了:
L a p l a c i a n = f ( x − 1 , y ) + f ( x + 1 , y ) + f ( x , y − 1 ) + f ( x , y + 1 ) − 4 f ( x , y ) Laplacian = f(x-1, y) + f(x+1, y) + f(x,y-1) + f(x,y+1) - 4 f(x, y) Laplacian=f(x1,y)+f(x+1,y)+f(x,y1)+f(x,y+1)4f(x,y)

上面的式子,用在图像里,可以看作是 上、下、左、右点的求和,减去中心点的4倍。所以,对图像做拉普拉斯变换,可以看作是 用原图像 与下面的模板做卷积运算,下面的这个模版(mask / filter)也就是拉普拉斯算子了。

在这里插入图片描述


2、拉普拉斯算子(Laplacian 算子)

Laplacian 算子 (拉普拉斯算子)是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的边缘锐化。

在这里插入图片描述

计算像素点P5的近似二阶导数值入下: P 5 l a p = ( P 2 + P 4 + P 6 + P 8 ) − 4 ⋅ P 5 P5_{lap} = (P2 + P4 + P6 + P8) - 4 \cdot P5 P5lap=(P2+P4+P6+P8)4P5

上面介绍的默认的拉普拉斯算子 只考虑了上下左右的情况,并没有考虑斜对角线方向的情况,如果连斜对角线的情况也考虑进来的话,我们就有了 拓展版的拉普拉斯算子:

在这里插入图片描述

默认的拉普拉斯算子只在 90度方向上存在旋转不变性,而拓展模版则在45度方向上也具有旋转不变性。


opencv 中 函数原型:

dst_img = cv2.Laplacian(src_img, ddepth, dx, dy, ksize, scale, delta)

参数:

  • dst_img:结果图像
  • src_img:原始图像
  • ddepth:输出图像的深度。 默认是1,采用的是3x3的核。
  • dx:x方向上的求导阶数,值为0时,表示在该方向上没有求导
  • dy:y方向上的求导阶数,值为0时,表示在该方向上没有求导
  • ksize:Sobel核的大小。该值为-1时,会使用Scharr算子进行计算。
  • scale:代表计算导数值时的缩放因子。默认值是1,表示没有缩放。
  • delta:代表加到目标图像上的亮度值。默认值是0。

举例:

import cv2

src_img = cv2.imread("sobel.bmp", 0)
laplacian = cv2.Laplacian(src_img, cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)

cv2.imshow('src_img', src_img)
cv2.imshow('sobel_y', laplacian)
cv2.waitKey()
cv2.destroyAllWindows()

输出为:
在这里插入图片描述

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐