第9回 様々なフィルタ処理

※ replitで「You've used up all your Development time」というメッセージが出た人はこちらを参考にして新しくreplitのアカウントを作ってください。
※ 本題に入る前に、必ず動画の連絡 を見てください。

  1. リサイズ
  2. セピア化
  3. エンボス化
  4. モーションブラー

セピア化
セピア色とは、イカ墨に由来する茶褐色 (#6B4A2B) の色で、昔の白黒写真が時間の経過で変色したものを指すこともある。
通常のカラーの写真の各ピクセルの R, G, B の成分に対して

\( \begin{pmatrix} 0.393 & 0.769 & 0.189 \\ 0.349 & 0.686 & 0.168 \\ 0.272 & 0.534 & 0.131 \end{pmatrix} \begin{pmatrix} R \\ G \\ B \end{pmatrix} = \begin{pmatrix} R' \\ G' \\ B' \end{pmatrix} \)

という計算で得られる (R', G', B') の色を作ると、セピア色の画像が得られる。 上記の式のように、画像処理では色成分を説明するとき R, G, B の順に書くのが通例だが、OpenCVでは、画像image の (x, y) の位置のピクセルの各成分は

赤 : image[y, x, 2]
緑 : image[y, x, 1]
青 : image[y, x, 0]

のように順序が逆になる。そのため、
sepia_matrix = np.array([
    [0.131, 0.534, 0.272],
    [0.168, 0.686, 0.349],
    [0.189, 0.769, 0.393]])
のような行列を作って image[y, x] との積を計算すれば、セピア化したときのこのピクセルの色が得られる。

元画像


セピア化した画像

エンボス化
エンボス (emboss) とは浮彫加工のことで、画像処理ではこの用語は画像の明度の情報をもとにして浮彫のような画像を作ることを意味する。
グレースケール化した画像に以下のようなマスクをかけると、
0 0 0
1 0 -1
0 0 0
このように「左より右が暗いところ」が白くなる。


このままではわかりにくいので、出力された画像の一番暗いところの明度が0, 一番明るい所の明度が255になるようにスケールをかけると、このように「暗いところが出っ張っていて、左から光が当たっているような画像」 が得られる。


こういうマスク
0 1 0
0 0 0
0 -1 0
で同様の処理を行うとこういう「暗いところが出っ張っていて、上から光が当たっているような画像」


こういうマスク
1 0 0
0 0 0
0 0 -1
だと「暗いところが出っ張っていて、左上から光が当たっているような画像」になる。


モーションブラー
モーションブラーとは、撮影時にカメラがブレたために起こるような効果を画像処理で加えるもの。
この処理で使うカーネルは第5回のガウシアンフィルタに似ている。
ブレの方向を向いた単位ベクトル (長さが1のベクトル) を \((m_x, m_y)\) とすると、参照ピクセルから \((x, y)\) だけずれた位置でのマスクの値は
\( \begin{eqnarray} \frac{1}{\sqrt{2\pi\sigma^2}}\exp\left(-\frac{(xm_y-ym_x)^2}{2\sigma^2}\right) \end{eqnarray} \)
に比例した値になる。カーネルの大きさが41x41、\((m_x, m_y)\) の向きが (1, 1) の場合のこの値をグラフで表わすと

のようになる。赤は \(\sigma=1\)、青は \(\sigma=10\) の場合のもので、\(\sigma\) が小さいと「カメラが動いた向き」に沿った位置にあるピクセルだけが計算に含まれ、そこから離れたピクセルがほぼ無視されるのに対し、\(\sigma\) が大きくなるとそれ以外のピクセルの影響も大きくなることがわかる。\(\sigma\) が充分に大きくなれば、結果は単純な移動平均フィルタによるぼかしに近づく。

\(\sigma=1\) の場合


\(\sigma=10\) の場合

課題

課題解答
戻る