Laplacian operator 介紹:一個算子如何看見曲率、擴散與邊界

Laplacian operator 介紹:一個算子如何看見曲率、擴散與邊界


你在影像上找邊緣、在網格上模擬熱傳導,或在圖上做平滑與分群時,背後很可能都遇到 Laplacian operator(拉普拉斯算子)。算子可以先理解成「把一個函數轉成另一個函數的規則」。

它的基本定義是:

Δf=∇⋅(∇f)\Delta f = \nabla \cdot (\nabla f)

在許多教材裡,∇2f\nabla^2 f 也是 Δf\Delta f 的替代記號;這裡的 ∇2\nabla^2 指 scalar Laplacian,不是把 Hessian 矩陣直接寫出來。更實用的讀法是:Laplacian 測量一個位置和周圍相比,有多不平衡。

山頂、碗底、平面,通常會給出不同符號;鞍點也可能讓各方向的二階變化互相抵消。把它放進熱方程,溫度會從高處流向低處;把它離散成像素或圖上的鄰接關係,又變成邊緣偵測與結構分析的工具。

這篇文章只追一條主線:Laplacian 是「局部鄰域差異的二階量」。連續函數、像素網格、一般圖共享這種鄰域比較結構,但尺度、權重、邊界與符號慣例並不完全相同。

1. 先從梯度開始:方向,再到不平衡

對純量場 f(x,y)f(x,y) 取梯度(gradient),得到一個向量:

∇f=(∂f∂x,∂f∂y)\nabla f = \left(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right)

梯度回答:「往哪個方向走,ff 上升最快?」例如把 ff 想成地形高度,梯度箭頭會從谷底指向山頂。

接著對這個向量場取散度(divergence)。散度回答:「這個位置看起來像流出的源頭,還是流入的匯?」梯度的散度就是 Laplacian:

Δf=∇⋅∇f\Delta f = \nabla \cdot \nabla f

例如 f(x,y)=x2+y2f(x,y)=x^2+y^2 時,∇f=(2x,2y)\nabla f=(2x,2y),所以 ∇⋅∇f=∂x(2x)+∂y(2y)=4\nabla\cdot\nabla f=\partial_x(2x)+\partial_y(2y)=4。這個小例子就是「先找每個方向的上升,再計算這些箭頭的淨流出」。

在二維笛卡兒座標中,它一般展開成:

Δf=∂2f∂x2+∂2f∂y2\Delta f = \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2}

三維則再加上 ∂2f/∂z2\partial^2 f / \partial z^2。也就是說,Laplacian 是 Hessian 的 trace,也就是各座標方向二階偏導數的總和;這個定義可參考 MathWorld 的 Laplacian 定義 與 LibreTexts 的 divergence 說明。

二階導數到底在看什麼?

一維先夠了。對曲線 f(x)f(x) 而言:

  • f′′(x)>0f''(x) > 0:曲線局部向上凹,該點低於左右鄰域的平均趨勢,但不單獨保證它是極小值。
  • f′′(x)<0f''(x) < 0:曲線局部向下凹,該點高於左右鄰域的平均趨勢,但不單獨保證它是極大值。
  • f′′(x)=0f''(x) = 0:沿著這個方向沒有淨的二階變化;它可能是直線,也可能只是拐點附近。

因此,Laplacian 不看高度或單一方向的斜率,而看各方向二階變化的總和。這也解釋了為什麼一個平面 f(x,y)=ax+by+cf(x,y)=ax+by+c 的 Laplacian 是零:它有斜率,但沒有二階變化。

2. 最好用的直覺:和鄰居平均值比較

在均勻 Cartesian 網格的內部點上,Laplacian 可以近似成「鄰居總和減去中心點的加權版本」。以二維網格的五點 stencil(五點差分模板)為例,兩個方向等距、網格間距為 hh 時:

Δfi,j≈fi+1,j+fi−1,j+fi,j+1+fi,j−1−4fi,jh2\Delta f_{i,j} \approx \frac{f_{i+1,j}+f_{i-1,j}+f_{i,j+1}+f_{i,j-1}-4f_{i,j}}{h^2}

把分子改寫一下,會更接近直覺:

Δfi,j≈4h2(fi+1,j+fi−1,j+fi,j+1+fi,j−14−fi,j)\Delta f_{i,j} \approx \frac{4}{h^2} \left(\frac{f_{i+1,j}+f_{i-1,j}+f_{i,j+1}+f_{i,j-1}}{4}-f_{i,j}\right)

所以:

  • 中心點比四個鄰居平均值高,Laplacian 為負。
  • 中心點比鄰居平均值低,Laplacian 為正。
  • 中心點和鄰居平均值相同,Laplacian 接近零。

例如中心值是 1010、四個鄰居都是 66,則 Δhf=(24−40)/h2=−16/h2\Delta_h f=(24-40)/h^2=-16/h^2;如果四個鄰居的平均也是 1010,結果就是 00。連續公式看起來像微積分;離散公式則像一個很小的 local filter,每次只看上下左右四格。SciPy 的 LaplacianNd 文件 也把這類網格 Laplacian 視為離散線性算子。

import numpy as np


def laplacian_2d(field, spacing=1.0):
    """五點差分;邊界先保留為 NaN,避免假裝知道外部值。"""
    result = np.full_like(field, np.nan, dtype=float)
    h2 = spacing**2
    result[1:-1, 1:-1] = (
        field[:-2, 1:-1]
        + field[2:, 1:-1]
        + field[1:-1, :-2]
        + field[1:-1, 2:]
        - 4 * field[1:-1, 1:-1]
    ) / h2
    return result

程式裡最容易被忽略的不是那個 -4,而是邊界。下面這段 helper 只計算內部點,NaN 不是邊界條件的實作;若要解 PDE,仍需另外施加 Dirichlet condition(固定邊界值)、Neumann condition(固定法向變化率或熱流),或 periodic boundary(首尾相接)。數值解的形狀,往往很受邊界條件影響。

3. 為什麼 Laplacian 會出現在熱方程?

想像一個薄金屬板:某個像素大小的區域突然很熱,周圍比較冷。熱不會因為「中心點很熱」就憑空消失;它會沿著溫度梯度流動。對均勻、各向同性的材料,若溫度場是 u(x,y,t)u(x,y,t)、熱擴散係數 α\alpha 為常數,且沒有內部熱源,把守恆律和 Fourier heat conduction law(傅立葉熱傳導定律)接起來,就得到:

∂u∂t=αΔu\frac{\partial u}{\partial t} = \alpha \Delta u

這是 heat equation(熱方程),也可視為擴散方程的一種形式。若材料參數隨位置改變,通常要保留散度形式 ∂tu=∇⋅(α∇u)\partial_tu=\nabla\cdot(\alpha\nabla u);有內部熱源時還要加上 source term。可參考 擴散模型的推導 與 二維熱方程。

符號現在很有意義:

  • 如果某處是尖銳的熱峰,Δu<0\Delta u<0,所以 ∂u/∂t<0\partial u/\partial t<0,熱峰會下降。
  • 如果某處是低於鄰域的凹洞,Δu>0\Delta u>0,所以該處會升溫。
  • 反覆更新後,尖峰與凹洞被抹平,場變得更平滑。

用最簡單的 Forward Euler time step 寫,就是:

ui,jt+1=ui,jt+λ(ui+1,jt+ui−1,jt+ui,j+1t+ui,j−1t−4ui,jt)u^{t+1}_{i,j}=u^t_{i,j} + \lambda\left(u^t_{i+1,j}+u^t_{i-1,j}+u^t_{i,j+1}+u^t_{i,j-1}-4u^t_{i,j}\right)

其中 λ=αΔt/h2\lambda=\alpha\Delta t/h^2。對二維均勻五點模板的顯式更新,常見穩定條件是 0≤λ≤1/40\leq\lambda\leq1/4;實作時通常留一點餘裕。網格加密時,允許的 Δt\Delta t 大致要按 h2h^2 縮小。這和「把每個格子往鄰居平均值拉近一點」完全相同;Laplacian 在這裡直接決定每個網格點的瞬時變化率。

因此,數值擴散有一個工程上的界線:不能任意調大 λ\lambda。這個穩定性條件適用於均勻網格與這個顯式更新式;換成非均勻網格或隱式方法,條件會改變。

4. 影像裡的 Laplacian:邊緣是二階導數的轉折

把灰階影像想成一個二維純量場:每個像素是 I(x,y)I(x,y)。物體邊界附近,亮度會快速改變。Sobel 這類方法估計一階導數;Laplacian 則把 xx、yy 方向的二階導數加總,因此常在邊緣附近出現 zero-crossing(零交叉)或正負急遽變化。這不是把 Sobel 的輸出直接再微分;兩者是不同的微分濾波器。可參考 OpenCV 的 Laplace Operator 教學。

OpenCV 的 Laplacian() 對影像計算:

ΔI=∂2I∂x2+∂2I∂y2\Delta I = \frac{\partial^2 I}{\partial x^2} + \frac{\partial^2 I}{\partial y^2}

在最小的 3×33\times3 情況,常見的核心可以寫成:

[0101−41010]\begin{bmatrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{bmatrix}

你可以把它看成前面的五點 stencil,只是把 hh 和輸出縮放先收進實作裡。

import cv2

image = cv2.imread("input.png", cv2.IMREAD_GRAYSCALE)
if image is None:
    raise FileNotFoundError("input.png not found")
blurred = cv2.GaussianBlur(image, (3, 3), sigmaX=0)
laplace_response = cv2.Laplacian(
    blurred, cv2.CV_64F, ksize=1, borderType=cv2.BORDER_DEFAULT
)

這裡先 Gaussian blur 是因為二階導數對高頻雜訊很敏感;不先處理雜訊,細小的像素抖動也可能被放大成假邊緣。cv2.Laplacian() 回傳的是帶正負號的二階 response,不是已經二值化的 edge map;若要產生邊緣候選,還要取絕對值、正規化、閾值化或檢測 zero-crossing。ksize=1 才對應上面展示的 3×33\times3 kernel;其他 kernel size 會使用不同的 Sobel-derived kernel。OpenCV 的預設 BORDER_DEFAULT 也會參與影像邊界的 extrapolation。

5. Graph Laplacian:把鄰居從像素換成節點

前面假設鄰居排在規則網格上。若資料是社交網路、交通網路或知識圖,節點沒有固定的上下左右,仍然可以做同一件事:只要知道誰和誰相鄰。

以下先限定在無向、非負權重的圖。令 AA 是 adjacency matrix(鄰接矩陣),DD 是 degree matrix(度數矩陣),其中 DiiD_{ii} 是節點 ii 的連線權重總和。graph Laplacian 通常定義為:

L=D−AL = D-A

對節點訊號 xx 作用時:

(Lx)i=∑j∼iwij(xi−xj)(Lx)_i = \sum_{j\sim i} w_{ij}(x_i-x_j)

這幾乎就是「我和鄰居差多少」的加總。若相鄰節點的訊號相近,(Lx)i(Lx)_i 通常接近零;若節點訊號偏離鄰居的加權平均,且各項差異沒有互相抵消,∣(Lx)i∣|(Lx)_i| 才會大。NetworkX 的 laplacian_matrix 也採用 L=D−AL=D-A 這個定義。

這裡要特別留意符號慣例:

  • 偏微分方程常把 Δ\Delta 寫成五點模板的中心係數 −4-4,它對平滑方程很自然。
  • 對非負權重的無向圖,L=D−AL=D-A 是對稱正半定矩陣,特徵值非負;有向圖或 signed graph 需要另外確認定義。

在間距為 hh 的規則四鄰域網格內部點,未正規化的圖 Laplacian 通常滿足:

Lgraph=4I−A=−h2ΔhL_{\text{graph}}=4I-A=-h^2\Delta_h

因此熱擴散若改用 graph Laplacian 表示,更新式要寫成 x˙=−(α/h2)Lgraphx\dot{x}=-(\alpha/h^2)L_{\text{graph}}x。不能只記「差一個負號」;尺度因子、權重與邊界慣例也會影響對應關係。把數學公式搬進 NumPy、SciPy 或圖學習框架時,先確認套件採用哪一種 convention,否則熱會反向擴散或平滑項會變成放大差異。

Graph Laplacian 也把局部差異接到全域結構:對非負權重的無向圖而言,Laplacian 的零特徵值個數對應連通分量;連通圖的第二小特徵值與 Fiedler vector(用來描述圖如何切成兩群的特徵向量)則可用來理解圖的切割與連通強度。可參考 NetworkX 的 laplacian_spectrum 與 algebraic_connectivity。

6. 三個常見誤解

「Laplacian 就是把所有二階導數相加」

在直角座標、純量函數、各方向尺度一致時,這個說法沒錯。但換成極座標、曲面、非均勻網格或加權圖,導數與鄰接權重都要跟著幾何改變。公式的座標形式不是永遠只有 fxx+fyyf_{xx}+f_{yy}。

「Laplacian 為零代表函數是常數」

不對。f(x,y)=x2−y2f(x,y)=x^2-y^2 的 Laplacian 是 2−2=02-2=0,但它明顯不是常數。Δf=0\Delta f=0 的函數稱為 harmonic function(調和函數);它表示局部值符合某種平均性,而不是整張圖完全沒有變化。可參考 LibreTexts 對 harmonic function 的說明。

「Laplacian 的輸出可以直接拿來更新任何系統」

也不對。影像流程要處理雜訊、資料型別、縮放與 zero-crossing;PDE 需要指定邊界條件與穩定的時間步長;圖資料則要確認權重、方向與符號 convention。Laplacian 給的是局部二階反應,後面的物理或資料語境決定如何解讀它。

結語:記住一個鄰域問題

遇到 Laplacian,可以先做三個檢查:

  1. 這個位置和它的鄰居相比,是凸、凹,還是大致平衡?
  2. 這個鄰域是連續座標、像素網格,還是一般圖?
  3. 目前採用的符號、尺度與邊界條件是什麼?

在連續場裡,答案是各方向二階變化的總和;在熱方程裡,答案變成流動方向;在像素網格裡,答案變成局部高通反應;在圖裡,答案則是節點和鄰居訊號的差異。

這些方法的共同點,是把鄰居之間的差異交給後續語境解讀:幾何、物理,或資料結構。它們的離散矩陣並不自動互換;讀清楚 convention,才是使用 Laplacian 時最值得保留的習慣。

References