ラプラシアンフィルタの原理・特徴・計算式

画像処理におけるLaplacian Filter(ラプラシアンフィルタ)の原理や特徴、計算式についてまとめました。

ラプラシアンフィルタとは

ラプラシアンフィルタ(Laplacian Filter)は、二次微分を利用して画像から輪郭を抽出する空間フィルタです。以下の写真はラプラシアンフィルタにより画像から輪郭を抽出した例です。

■入力画像(左)、出力画像(右)

出力画像(フィルタを掛けた後)を見ると、輪郭の部分が白くなっている、つまり画素値が大きいことがわかります。ラプラシアンフィルタの主な特徴は以下のとおりです。

  • 2回微分を行うため、一次微分を利用するフィルタ(ソーベルフィルタなど)と比べて、画素値の変化が激しい箇所を輪郭として強調できます。つまり、画素値の変化が緩やかな箇所(ボケているところ)は輪郭としてほとんど強調しません。
  • 全ての方向の輪郭を一度の畳み込み演算で検出でき、計算量が少ない。(一次微分を利用するフィルタは、2回の畳み込み演算で縦方向と横方向の輪郭を検出し、さらにそれらの2乗和平方根を求める必要があります)
  • 2回微分により画素値の変化が激しい箇所を強調するため、輪郭だけでなくノイズも強調しやすく、ノイズの影響を受けやすいです。そのため、メディアンフィルタやガウシアンフィルタ等の平滑化フィルタで前処理してノイズを抑えることが重要です。

解説動画

ラプラシアンフィルタのカーネルと仕組み

注目画素I(x,y)I(x, y)と周囲の画素値について考えます。

I=[I(x1,y1)I(x,y1)I(x+1,y1)I(x1,y)I(x,y)I(x+1,y)I(x1,y+1)I(x,y+1)I(x+1,y+1)] I=\begin{bmatrix}I(x-1, y-1) & I(x, y-1) & I(x+1, y-1) \\ I(x-1, y) & I(x, y) & I(x+1, y) \\ I(x-1, y+1) & I(x, y+1) & I(x+1, y+1)\end{bmatrix} \quad

デジタル画像は離散データなので、微分は差分で計算することができます。
水平方向および垂直方向の画素値の一次微分Ix,IyI_{x}, I_{y}は次式で表せます。

Ix(x,y)=I(x+1,y)I(x,y)Iy(x,y)=I(x,y+1)I(x,y) I_{x}(x, y)=I(x+1, y)-I(x, y) \\ I_{y}(x, y)=I(x, y+1)-I(x, y)

二次微分Ixx,IyyI_{xx}, I_{yy}はもう一度差分を取ることで計算できます。

Ixx(x,y)={I(x+1,y)I(x,y)}{I(x,y)I(x1,y)}=I(x1,y)2I(x,y)+I(x+1,y)I_{xx}(x, y)= \{I (x+1, y)-I(x, y) \} – \{ I(x, y)-I(x-1, y) \} \\= I(x-1, y)-2I(x, y)+I(x+1, y)

Iyy(x,y)={I(x,y+1)I(x,y)}{I(x,y)I(x,y1)}=I(x,y1)2I(x,y)+I(x,y+1)I_{yy}(x, y)= \{ I(x, y+1)-I(x, y) \} – \{ I(x, y)-I(x, y-1) \} \\= I(x, y-1)-2I(x, y)+I(x, y+1)

よって、ラプラシアン2I(x,y)\nabla^2I(x, y)は以下のように表せます。

2I(x,y)=Ixx(x,y)+Iyy(x,y)=I(x1,y)+I(x,y1)4I(x,y)+I(x+1,y)+I(x,y+1)\nabla^2I(x, y)=I_{xx}(x, y)+I_{yy}(x, y) \\= I(x-1, y)+I(x, y-1)-4I(x, y) + I(x+1, y)+I(x, y+1)

ラプラシアン2I(x,y)\nabla^2I(x, y)の計算結果からカーネルK4K_4は次のように求まります。

K4=[010141010]K_4= \left[ \begin{array}{ccc} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{array} \right]

上式はラプラシアンフィルタのカーネル(4近傍)となります。
ラプラシアンフィルタのカーネルは、4近傍(上下左右)だけでなく、斜め方向の2次微分も加えた8近傍K8K_8のカーネルも存在します。

K8=[111181111]K_8= \left[ \begin{array}{ccc} 1 & 1 & 1 \\ 1 & -8 & 1 \\ 1 & 1 & 1 \end{array} \right]

4近傍と8近傍の違いは、「微分を取る近傍の画素数」です。

  • 4近傍
    • 注目画素の上下左右の4画素の二次微分を取る
  • 8近傍
    • 注目画素の上下左右だけでなく斜めも加えた8画素の二次微分を取る

最後に、輪郭画像I(x,y)I'(x, y)は次のように計算されます。

I(x,y)=I(x,y)K I'(x, y) = I(x, y) \ast K

ここで、\ast畳み込み演算を示します。

ラプラシアンフィルタの計算例

入力画像IIとラプラシアンフィルタ(4近傍)のカーネルKKが次のように与えられたとき、出力画像II’を求めよ。

I=[0000010100001000000],K=[010141010]I= \left[ \begin{array}{cccc} 0 & 0 & 0 & 0 \\ 0 & 10 & 10 & 0 \\ 0 & 0 & 10 & 0 \\ 0 & 0 & 0 & 0 \end{array} \right], \quad K= \left[ \begin{array}{ccc} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{array} \right]

解説

入力画像IIとカーネルKK畳み込み演算してやると以下のようになります。

I(1,1)=(410)+(110)=30I(2,1)=(410)+(110)+(110)=20I(1,2)=(110)+(110)=20I(2,2)=(410)+(110)=30I'(1,1)=(-4\cdot 10)+(1\cdot 10)=-30 \\ I'(2,1)=(-4\cdot 10)+(1\cdot 10)+(1\cdot 10)=-20 \\ I'(1,2)=(1\cdot 10)+(1\cdot 10)=20 \\ I'(2,2)=(-4\cdot 10)+(1\cdot 10)=-30

入力画像の端の画素値は0、0未満の画素値は0とすると、出力画像II’は次のようになります。

I=[00000000020000000]I’= \left[ \begin{array}{cccc} 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 20 & 0 & 0 \\ 0 & 0 & 0 & 0 \end{array} \right]

関連ページ

【Python/OpenCV】ラプラシアンフィルターで輪郭検出(エッジ抽出)
Python+OpenCVでラプラシアンフィルターを「NumPy」「cv2.filter2D」「cv2.Laplacian」で実装し、輪郭検出する方法をソースコード付きで解説します。
【画像処理超入門】アルゴリズムの仕組みと実装方法を簡単に解説
画像処理超アルゴリズムの仕組みとプログラミングによる実装方法を簡単に解説します。
この記事を書いた人
西住技研

在学中はシステム制御理論や画像処理、機械学習を専攻分野として研究していました。就職後は、プログラミング(Python)を活用したデータ分析や作業自動化に取り組み、現在に至ります。そこで得たノウハウをブログで発信しています。
YoutubeX(旧Twitter)でも情報発信中です

西住技研をフォローする
画像処理

コメント

  1. tatsu より:

    nice!!

  2. それもまた一興 より:

    Iyyの式の2行目 Iが抜けとりまっせ〜

    • 西住技研 管理人 より:

      ※それもまた一興様
      ご指摘ありがとうございます。
      該当箇所を修正致しました。

  3. 画像処理で苦戦中の学生 より:

    計算例のカーネルの左右が1になってませんよー

    • 西住技研 管理人 より:

      ※画像処理で苦戦中の学生 様
      ご指摘ありがとうございます!
      誤記を修正致しました。

  4. 出遅れた学生 より:

    (1)式は前方微分で、(2)式は後方微分になってるんですね。これわかってて表記消したのか、俺の勘違いか

    (2)式1段3段の第4項+じゃないかな。

    • 西住技研 管理人 より:

      コメントありがとうございます!
      ご指摘のとおり{}が無いと計算がおかしくなりますので、修正いたしました。
      ※LaTeXで数式を記載していたのですが、{}がうまく表示されておりませんでした。