画像畳み込みカーネル シミュレーター 戻る
機械学習

画像畳み込みカーネル シミュレーター

3×3カーネルで画像をフィルタする「畳み込み」を体験するツールです。カーネルの種類や画像パターンを切り替えると、入力画像とフィルタ後の出力画像、走査線プロファイルがリアルタイムで変化し、畳み込みニューラルネットワーク(CNN)の心臓部にあたる演算を直感的に理解できます。

パラメータ設定
カーネルの種類
3×3フィルタを選択。効果がプレビューに反映されます
入力画像パターン
畳み込みをかける元画像の形状
カーネル強度
0で恒等、1でカーネル本来の効果、2で誇張
画像解像度 N×N
px
入力・出力画像のピクセル数
入力ノイズ
入力画像に加えるガウスノイズの標準偏差
計算結果
カーネル合計
出力の平均輝度
出力の標準偏差
エッジエネルギー
演算回数
カーネルの効果
畳み込みの走査アニメーション(入力 → 出力)

左が入力画像、右が出力画像。黄色い枠が3×3カーネルのウィンドウで、画像の上を1ピクセルずつスライドしながら、対応する出力ピクセルを順に計算していきます。

実効カーネル係数 K_eff(3×3 の9個)
中央走査線(入力 vs 出力)
理論・主要公式

$$O(i,j)=\sum_{m=-1}^{1}\sum_{n=-1}^{1}K(m,n)\cdot I(i+m,\,j+n)$$

2次元の離散畳み込み。出力ピクセル O(i,j) は、カーネル K の各係数と、その真下にある入力画像 I の3×3近傍ピクセルを掛け合わせて足した値です。

$$K_{\text{eff}}=K_{\text{identity}}+s\,(K-K_{\text{identity}})$$

実効カーネル K_eff は、恒等カーネルと選択したカーネル K を強度 s で線形補間したものです。s=0 で恒等(無変化)、s=1 でカーネル本来の効果になります。

$$\sum K=1\;\Rightarrow\;\text{明るさ保存}, \qquad \sum K=0\;\Rightarrow\;\text{エッジのみ反応}$$

カーネル係数の総和が1なら平坦な領域の明るさを保ち(平滑化・強調)、0なら明るさの変化(エッジ)だけに反応します(微分・特徴抽出)。

画像畳み込みとは

🙋
スマホの写真アプリにある「ぼかし」とか「くっきり」って、内部では何をしているんですか?
🎓
ほぼ全部「畳み込み(コンボリューション)」という1つの演算でできているよ。やることはシンプルで、3×3くらいの小さな数値の表(これをカーネルとかフィルタと呼ぶ)を画像の上にぴったり重ねて、「カーネルの数字とその真下のピクセルの明るさを掛けて、9個全部足す」。その合計が出力画像のそのピクセルの値になる。これをカーネルを1マスずつずらしながら画像全体で繰り返すだけなんだ。
🙋
えっ、たった9個の掛け算と足し算で「ぼかし」も「くっきり」もできちゃうんですか?
🎓
そう、カーネルの中身を変えるだけなんだ。例えば9個全部 1/9 にすると、各ピクセルが「自分と周り8マスの平均」になる——これが平均化ぼかし。逆に中央を 5、上下左右を −1 にすると、周りより自分が明るければさらに明るく強調される——これがシャープ化だ。左の「カーネルの種類」を切り替えて、上のグラフの棒(カーネル係数)と右の出力画像がどう変わるか見てみて。
🙋
エッジ抽出を選ぶと、出力が真っ黒の中に輪郭線だけ光って見えます。あれはなぜですか?
🎓
いい観察だ。エッジ抽出(ラプラシアン)のカーネルは、係数を全部足すと0になる。だから明るさが一定の平らな場所では「同じ値 × 合計0」でちょうど打ち消し合って出力が0、つまり黒になる。明るさが急に変わる輪郭の所だけ打ち消しきれずに値が残る。これが「微分フィルタ」で、合計1のぼかし系とは役割が正反対なんだ。右の「中央走査線」グラフを見ると、入力がなだらかでも出力がエッジでスパイクするのが分かるよ。
🙋
入力ノイズを上げてからガウシアンぼかしをかけると、出力の標準偏差がぐっと下がりますね。これは何を意味するんですか?
🎓
まさにノイズ除去だね。ノイズはピクセルごとにランダムにバラつく成分で、近傍を平均すると正と負が打ち消し合って小さくなる。標準偏差はそのバラつきの大きさだから、ぼかすほど下がる。ただし同時に本物のエッジもなまってしまう。「ノイズは消したいがエッジは残したい」というのが画像処理の永遠のジレンマで、ガウシアンの広がり具合(強度)はそのバランス調整なんだ。
🙋
これって、最近よく聞く「畳み込みニューラルネットワーク(CNN)」と同じものですか?
🎓
演算そのものは完全に同じだよ。違いは「カーネルの数字を誰が決めるか」。このツールではエッジ抽出やぼかしのカーネルを人間が手で書いているけれど、CNNでは大量の画像データを使って、カーネルの9個(もっと大きいことも多い)の数字を学習で自動的に最適化する。しかも1つの層に何十枚ものカーネルを持ち、層を重ねるとエッジ→模様→目や車輪→顔や自動車、と段階的に複雑な特徴を捉えるようになる。畳み込みは、現代の画像認識AIの土台そのものなんだ。

よくある質問

画像の畳み込みは、小さな数値の格子(カーネル、ここでは3×3)を画像の上で1ピクセルずつスライドさせ、各位置で「カーネルの値とその真下にある近傍ピクセルの値を掛けて全部足す」演算です。出力ピクセルの値は O(i,j)=ΣΣ K(m,n)·I(i+m,j+n) で求まります。カーネルの中身を変えるだけで、ぼかし・シャープ化・エッジ抽出など全く異なる効果が得られます。
カーネル係数の総和は出力の明るさを決めます。合計が1のカーネル(恒等・平均化ぼかし・ガウシアン・シャープ化)は、平坦な領域の明るさをそのまま保ちます。合計が0のカーネル(ラプラシアンのエッジ抽出やソーベル)は、明るさが一定の領域では出力が0になり、明るさが変化する場所(エッジ)にだけ反応します。前者は平滑化や強調、後者は微分(特徴抽出)に使われます。
CNNの畳み込み層が行う計算は、まさにこのツールと同じ「カーネルを画像上でスライドさせる畳み込み」です。違いは、エッジ抽出やぼかしのようなカーネルを人間が手で決めるのではなく、CNNが学習データから誤差逆伝播でカーネルの数値(重み)を自動で最適化する点です。1つの層が何十枚ものカーネルを持ち、層を重ねることでエッジ→模様→部品→物体と段階的に特徴を捉えます。
3×3カーネルを画像の端のピクセルに当てると、カーネルの一部が画像の外側にはみ出します。本ツールは端のピクセルを複製(クランプ)して外側を埋める方式を採用しています。ほかにゼロで埋める(ゼロパディング)、画像を折り返す、循環させる方式もあります。CNNではゼロパディングが一般的で、パディングの有無で出力画像のサイズが変わります。

実世界での応用

画像認識AI(CNN):畳み込みは、物体検出・顔認識・医療画像診断・自動運転の「目」など、現代の画像系AIのほぼ全てを支える基本演算です。CNNの最初の層は本ツールのエッジ抽出やソーベルに近いカーネルを自然に学習し、後段の層がそれを組み合わせて模様・部品・物体を表現します。カーネルが小さく重みを共有するため、全結合ネットワークより圧倒的にパラメータが少なく、学習も効率的です。

写真・映像の編集:スマートフォンのカメラアプリや画像編集ソフトの「シャープ」「ぼかし」「ノイズ除去」「輪郭強調」は、いずれも畳み込みカーネルの応用です。ガウシアンぼかしは背景ぼかしやモザイクの前処理に、アンシャープマスク(シャープ化の一種)はピントの甘い写真の補正に使われます。動画でも各フレームに同じカーネルをかけることで手ぶれ低減や質感調整を行います。

産業用画像検査・コンピュータビジョン:工場の外観検査では、ソーベルやラプラシアンでエッジを抽出し、製品の傷・欠け・位置ずれを検出します。OCR(文字認識)の前処理、ロボットビジョンの特徴点抽出、衛星画像の境界線抽出など、ルールベースの画像処理でも畳み込みは中心的な道具です。CAEの分野でも、計算結果の可視化画像から等値線を抽出する用途などで使われます。

科学・工学の信号処理:畳み込みは画像だけでなく、1次元の時系列信号にも同じ考え方で適用できます。移動平均によるノイズ平滑化、微分フィルタによる変化点検出、ぼけ画像の復元(デコンボリューション)など、計測データの前処理に広く使われます。畳み込みは線形時不変システムの応答そのものであり、信号処理・制御工学の基礎理論とも直結しています。

よくある誤解と注意点

まず多いのが、「畳み込みと相関を混同する」ことです。数学的に厳密な畳み込みはカーネルを上下左右に反転(180°回転)してから重ねますが、画像処理やCNNの実装では反転しない「相関(クロスコリレーション)」を使うのが一般的です。本ツールも対称なカーネルが多いため両者の差は出ませんが、ソーベルやエンボスのような非対称カーネルでは符号や向きが反転します。論文や教科書を読むときは、その「畳み込み」が反転ありかなしかを確認してください。

次に、「カーネルの合計値を意識しない」こと。合計が1からずれた平滑化・強調カーネルを使うと、画像全体が明るくなったり暗くなったりします。平均化ぼかしを「9個全部1」のまま割り算を忘れると、出力が9倍になって真っ白に飽和します。逆にエッジ抽出のカーネルは合計0であることに意味があり、平坦部を確実に黒くします。カーネルを自作するときは、まず係数の総和が狙いどおり(1か0か)になっているかを必ず確認しましょう。

最後に、「境界処理とクリッピングを軽視する」こと。画像の端ではカーネルがはみ出すため、ゼロ埋め・端の複製・折り返しのどれを選ぶかで端の数ピクセルの結果が変わります。また、シャープ化やエッジ抽出は0未満や1超の値を生むことがあり、表示前に[0,1]へクリップ(クランプ)する必要があります。クリップを忘れると黒つぶれ・白飛びや色の反転が起き、CNNでも極端な値が学習を不安定にします。畳み込みの式そのものより、こうした「端」と「範囲」の処理がバグの温床になりがちです。

使い方ガイド

  1. 入力画像またはサンプル画像を選択し、適用するカーネルタイプ(シャープ化・ソーベル・エンボスなど)をドロップダウンから選択する
  2. strengthNum(強度)を0~100の範囲で調整してカーネル係数を倍率化し、gridNNum(グリッドサイズ)で走査ウィンドウを3×3に固定したまま処理対象領域を変更する
  3. noiseLvNum(ノイズレベル)を加えて実画像の劣化シナリオをシミュレートし、各カーネルの堅牢性をカーネル合計・出力の標準偏差・エッジエネルギーの統計値で定量評価する

具体的な計算例

512×512ピクセルグレースケール画像にソーベルカーネル(垂直方向:[-1,0,1;-2,0,2;-1,0,1])を適用、strength=80、noiseLv=15%の場合、出力の標準偏差は約42.3、エッジエネルギーは18540、演算回数は262144回。strength=120に上げるとエッジエネルギーは約27800に増加し、CNN内の特徴抽出層における勾配強調効果の非線形性を観察できます。

実務での注意点