辞書学習のその他の応用

# 概要
スパースモデリング第15章のその他の応用の一部を実装した。

* 線画とテクスチャの分離
* インペインティング
* インパルス雑音の除去 

ノートブック
[ch15-02.ipynb](https://github.com/kibo35/sparse-modeling/blob/master/ch15-02.ipynb)
[ch15-04.ipynb](https://github.com/kibo35/sparse-modeling/blob/master/ch15-04.ipynb)
[ch15-05.ipynb](https://github.com/kibo35/sparse-modeling/blob/master/ch15-05.ipynb)

# 結果

_[K-SVD](https://en.wikipedia.org/wiki/K-SVD)辞書をもちいた局所的モルフォロジ分析（MCA; morphological component analysis）で、線画とテクスチャを分離_
![local_mca.png](https://qiita-image-store.s3.amazonaws.com/0/114365/ce952efd-fce7-aedd-a80d-ad3179a7e39d.png)

_冗長DCT辞書による局所的インペインティングで欠損画素を補間_
![Peppers_recon.png](https://qiita-image-store.s3.amazonaws.com/0/114365/fa7546cf-5a7c-18d3-8f61-80c8f17a1609.png)

数字は[ピーク信号対雑音比（PSNR; peak signal to noise ratio）](https://ja.wikipedia.org/wiki/ピーク信号対雑音比)

_K-SVD辞書による局所的インペインティングで欠損画素を補間_
![Peppers_recon_KSVD.png](https://qiita-image-store.s3.amazonaws.com/0/114365/07fa6bf1-4d36-7711-a091-a3aa9b705b78.png)

* 欠損率25%、50%では冗長DCT辞書によるインペインティングに比べてPSNRが改善した。

_インパルス雑音の除去_
![Peppers_inpulse_recon.png](https://qiita-image-store.s3.amazonaws.com/0/114365/23f911ab-6749-4039-a757-b9a6a74ddc41.png)

* _推定マスク_は、雑音ありの画像とメディアンフィルタで処理した画像の差分を閾値処理したもの
* 推定マスクで検出された画素のみを、ノイズ除去するとPSNRが改善した。
* メディアンフィルタを冗長DCT辞書による局所的インペインティングにかえると少しPSNRが改善した。

# 方法

## K-SVD辞書による局所的MCA
Barbaraに標準偏差10の白色雑音を追加してテスト画像とした。
![barbara_sig10.png](https://qiita-image-store.s3.amazonaws.com/0/114365/5a59514f-4095-12ce-e8fc-f28af99e23a6.png)

K-SVDで辞書学習した。パッチサイズを$8 \times 8$とした。アトムの数を256とした。直交マッチング追跡（OMP; orthogonal matching pursuit）の停止条件を、アトムの数$k_{0}=4$、許容誤差$\epsilon = 8^{2} \times 20^{2}$とした。K-SVDの反復回数を25とした。

画像から抽出したパッチの総数は255,025だった。メモリが不足するためK-SVDの1回の反復に用いるパッチの数は、その10分の1とした。K-SVDに使用するパッチは毎反復、ランダムに抽出した。

K-SVD辞書
![A_KSVD_sig10.png](https://qiita-image-store.s3.amazonaws.com/0/114365/e6825c88-5a49-ae47-d128-3bd830adf8d3.png)

アトムの活性度を以下のように計算した。
$$ Activity(\mathbf{a}) = \Sigma_{i=2}^{n} \Sigma_{j=1}^{n} |a[i, j] - a[i-1, j]| + \Sigma_{i=1}^{n} \Sigma_{j=2}^{n} |a[i, j] - a[i, j-1]| $$活性度の最大値を1に規格化した。活性度が高いアトムはテクスチャ、低いアトムは線画のアトムとした。

アトムの活性度（黒は0、白は1）
![activity.png](https://qiita-image-store.s3.amazonaws.com/0/114365/2760b7af-ee51-1cde-e62b-a06d127f7c51.png)
活性度が0.3未満のアトムは線画、それ以外をテクスチャとした。
![activity_threshold.png](https://qiita-image-store.s3.amazonaws.com/0/114365/4edc14b0-1fe5-0cec-c30e-7c10c5780f5c.png)
濃い灰色は線画のアトム、薄い灰色はテクスチャのアトムである。

線画のアトムとそのスパース表現の係数から、線画の画像を求められる。テクスチャのアトムとそのスパース表現の係数から、テクスチャの画像を求められる。

## 画像のインペインティングとインパルスノイズの除去

Peppersに標準偏差20の白色雑音を追加した。25%、50%、75%の画素をランダムに0クリアし、テスト画像とした。欠損画素の位置は既知とした。
![Peppers_inpaint.png](https://qiita-image-store.s3.amazonaws.com/0/114365/51e9685e-4bd9-b0e5-391a-f20b09ddc334.png)

### 冗長DCT辞書による局所的インペインティング
パッチサイズを$8 \times 8$とした。アトムの数を256とした。欠損画素をマスクしてスパース表現を求めるようOMPを修正した。OMPの停止条件を$k_{0}=4$、$\epsilon = (8^{2}-p) \times 20^{2} \times 1.1$とした。$p$はパッチ内の欠損画素の数である。求めたスパース表現から画像を復元できる。

### K-SVD辞書による局所的インペインティング
K-SVDを以下のように修正した。

2. 欠損画素をマスクするようOMPを修正し、スパース表現を求めた。OMPの停止条件は、冗長DCT辞書による局所的インペインティングの場合と同じとした。
3. 上のスパース表現をもちいて欠損画素を補間した後、K-SVDでアトム、スパース表現を更新した。
4. 2, 3を反復した。

K-SVDの初期値は冗長DCT辞書とした。反復回数15とした。K-SVDに1度の反復にはランダムに抽出した12,800個のパッチを用いた。

欠損25%の画像から求めたK-SVD辞書
![A_KSVD_25.png](https://qiita-image-store.s3.amazonaws.com/0/114365/e01e695d-d793-c000-88be-31506038a12b.png)

欠損50%の画像から求めたK-SVD辞書
![A_KSVD_50.png](https://qiita-image-store.s3.amazonaws.com/0/114365/dc8ebc34-a3c0-742d-f358-eee7848a5e05.png)

欠損75%の画像から求めたK-SVD辞書
![A_KSVD_75.png](https://qiita-image-store.s3.amazonaws.com/0/114365/8aa9f28b-36dc-08c1-c0f5-2b6e921edf55.png)

* 欠損75%の場合、冗長DCT辞書からあまり学習が進まなかった。1反復目は、冗長DCTによるOMPノイズ除去で補間したパッチからアトム、スパース表現を更新するため、欠損75%の場合、そこから学習がすすまなかったと思われる。

## インパルス雑音の除去
ランダムに10%の画素の画素値を+50もしくは-50し、テスト画像とした。画素値を最大255、最小0にクリップした。インペインティングとの違いは、欠損画素の位置がわからない点である。

![Peppers_inpulse.png](https://qiita-image-store.s3.amazonaws.com/0/114365/039d35b1-d41b-642a-07d8-5267ff3077cc.png)

メディアンフィルタでインパルス雑音を除去した。メディアンフィルタのカーネルサイズ$3 \times 3$とした。ノイズありの画像とメディアンフィルタでノイズ除去した画像の差の絶対値が27より大きい画素を、インパルス雑音で汚染された画素とした。

![mask_median.png](https://qiita-image-store.s3.amazonaws.com/0/114365/cf85b9e8-0450-cfd4-13c4-d50912d33fa8.png)

推定マスクで検出された画素にのみメディアンフィルタをかけることでPSNRが改善した。冗長DCT辞書によるOMPノイズ除去でも同様だった。冗長DCT辞書によるOMPノイズ除去のパッチサイズは$8 \times 8$、アトム数は256、OMPの停止条件は$k_{0}=256$、$\epsilon = (8^{2}-p) \times 5^{2} \times 1.1$とした。

# 未実装の応用

* カーブレット変換をもちいた大域的MCA
* 辞書学習による高解像度化（超解像）

# まとめ

* K-SVD辞書による局所的MCAはなかなかうまくいった。カーブレット変換は実務に応用できそうなので調査したい。
* インペインティングは、欠損率が低い場合にはK-SVDをからめて精度を改善できそう。
* インパルス雑音の除去は、メディアンフィルタで十分かな…
* 辞書学習による高解像度化は、実装できなかった…。ディープラーニングでやった方がいいかもしれんけどブラック（ボックス）なので、グレーな辞書学習も魅力的である。

# 参考
[![text.jpg](https://qiita-image-store.s3.amazonaws.com/0/114365/3d7fce75-8111-4cba-c554-59cecfb9c9eb.jpeg)](http://www.kyoritsu-pub.co.jp/bookdetail/9784320123946)