【画像処理の基礎】OpenCVでの画像フィルタリングとエッジ抽出を数式ベースで理解する

プログラミング

近年、ディープラーニングなどの華やかなAI技術にばかり注目が集まりがちですが、実運用に耐えうる安定したコンピュータビジョンシステムを構築するには、基盤となる「古典的な画像処理(空間フィルタリング等)」の理論的理解が極めて重要です。

本記事では、OpenCVを使った画像処理の基礎である「画像フィルタリング(平滑化)」と「エッジ抽出(Canny法)」について、その裏でどのような数学的処理(畳み込み演算)が行われているのかを実践的なコードと共に解説します。

1. 空間フィルタリングと「畳み込み演算(Convolution)」とは

画像の性質を変える(ぼかす、エッジを際立たせる等)最も基本的な手法が「空間フィルタリング」です。これは、特定の数値が並んだ小さな行列(カーネル、またはマスクと呼びます)を画像の上でスライドさせながら、各ピクセルの値を計算し直す処理です。これがDeep Learning(CNN)の「C」にあたる技術の原型です。

2. ノイズ除去の王道:ガウシアンフィルタ(Gaussian Blur)

画像に含まれるザラザラとしたノイズ(ホワイトノイズなど)を滑らかにするためによく使われるのがガウシアンフィルタです。中央のピクセルに対する重みが最も大きく、周辺にいくほど重みが小さくなる(正規分布に従う)カーネルを使用します。単なる平均化フィルタよりも、エッジ情報を保ちながら自然にノイズを潰す特徴があります。

import cv2
import matplotlib.pyplot as plt
# オリジナル画像の読み込み(グレースケール)
img = cv2.imread('factory_line.jpg', cv2.IMREAD_GRAYSCALE)
# ガウシアンフィルタの適用
# 第2引数はカーネルサイズ(必ず奇数)、第3引数はX方向の標準偏差(0で自動計算)
gaussian_blur = cv2.GaussianBlur(img, (5, 5), 0)
# 結果のデバッグ表示等に利用...

3. 輪郭を抽出する究極のアルゴリズム:Cannyエッジディテクタ

画像の「輪郭(エッジ)」とは数学的に言えば「ピクセル値の勾配(明るさが急激に変化する場所)」のことです。単純な微分フィルタ(Sobelフィルタなど)をかけるだけではノイズまでエッジとして拾ってしまうため、1986年にJohn F. Cannyが考案した「Canny法」という多段アルゴリズムが現在でも標準として定着しています。

Cannyエッジディテクタの正確な処理フローは以下の通りです。
1. ガウシアンフィルタでノイズを除去する
2. Sobelフィルタで輝度勾配の強度と方向を計算する
3. Non-Maximum Suppression (非最大値抑制) でエッジの線を1ピクセルの細さに薄線化する
4. ヒステリシス閾値処理を使って、信頼しきれない弱いエッジ同士の接続を判定する

# Cannyエッジ抽出アルゴリズムの実行
# 第2引数は下限閾値、第3引数は上限閾値
edges = cv2.Canny(gaussian_blur, threshold1=50, threshold2=150)
# 抽出されたedgesは2値化(0か255)されたNumPy配列となります。
# これをハフ変換(Hough Transform)などに渡し、直線を検出する技術へと繋げます。

まとめ:伝統的アルゴリズムと深層学習の融合

最新のDeep Learningモデルを用いて物体検出を行う前段階として、今回紹介したような空間フィルタリングを使って照明ムラをごまかしたり、強すぎるエッジを緩和したりする前処理を挟むだけで、AIの精度が見違えるほど向上することは多々あります。最新技術と古典技術の両方を身につけることで、優秀なCV(コンピュータビジョン)エンジニアへの道が開けます。

OpenCVに搭載されている数百の関数の理論的背景と実践について網羅的に学びたい方は、以下のオライリー書籍を手元に置いておくことを強く推奨します。

また、Python自体のデータ処理や画像処理エコシステムに関する基礎が不安な方には、こちらが必須の入門書です。

コメント

タイトルとURLをコピーしました