はじめに
テスト投稿も兼ねて最近調べて試したことのメモを載せます。
問題などあれば指摘していただけるとありがたいです。
目的:画像中の陰(shade)を除去
画像処理ド素人がスマホで撮影したノート等の写真をきれいにするアプリ的な動きをするものを自分でも作ってみたいと思い立ちました。
まずは画像中にどうしても入ってしまう陰が邪魔なので、これを取り除きます。
影と書くとsilhouetteの意味合いが強くなるそうなので、shadeの意味を込めて陰と表記します。
処理
https://www.jstage.jst.go.jp/article/iieej/36/3/36_3_204/_article/-char/ja/
こちらの論文を参考に、「凹凸係数」を利用して影を除去します。
凹凸係数は画像中のそれぞれの画素を周囲の画素の平均値で除算することで求められ、フィルタサイズより大きい勾配を平坦にすることができるもののようです。
なので今回「陰の除去」と書きましたが、カラー画像だと陰だけでなく色も飛んでしまうことが考えられます。
環境
OS:Windows8.1
言語:Python3.6
実装
import cv2
import numpy as np
img = cv2.imread("image.jpg")
ksize = 51
blur = cv2.blur(img, (ksize, ksize))
rij = img/blur
index_1 = np.where(rij >= 0.98)
index_0 = np.where(rij < 0.98)
rij[index_0] = 0
rij[index_1] = 1
cv2.imwrite("rij_image.png", rij*255) # rijの値は0~1になるはずなので255倍
論文に書かれている通りに実装します。
※ksize=51は特に根拠なく適当な数字なので、あとで変えて比較します。
※rijの値は0~1になるはずとしていますが、単純に除算しているだけなので実際は1以上の値になることがあります。
試行
この2枚の画像についてそれぞれ上記の処理にかけてみます。
風景写真の方は今回の目的には必要ありませんが、色も陰扱いで消えるだろうということで試してみます。
どちらも手持ちのiPhone7で撮影したもので、画像サイズは4032*3024(3024*4032)です。
上記をそのまま実行すると以下のような状態になります。
パッと見綺麗なので、二値化をちゃんとやればもっと良い感じになるんじゃないでしょうか。
風景写真の方はやはり空の色がかなり消えています。海の部分は波や砂浜の陰影的な部分が残るようです。
ksizeの値をいろいろ変えて試した結果が以下です。
文字写真の方だけ載せます。順に、ksize=3, 21, 51, 151, 351です。値は適当です。