|
●概要 複数のフィルタの組合せや、画像演算を伴う処理である。 ●アンシャープ 筆者も誤解していたが、非シャープ化ではなく、シャープ化処理である。アンシャープ(ボケ)画像を原画から差し引いて、ボケ成分をなくし、シャープにする手法である。単純な先鋭化フィルタを掛けるより、高品質な先鋭化画像が得られる。印刷による原理的なボケを補正するために行われる処理で、以下のように行う。 先鋭化画像 = 原画 + 係数 * [原画 - ボケ画像]閾値処理 ボケ画像を求めたり、画像間演算したりで時間は掛かる処理となる。 ○ボケ画像 Gaussianフィルタを掛ける。Gaussianフィルタは二次元ガウス分布のことで、アンシャープでは、効果が及ぶ範囲を半径と称し、ピクセル距離の標準偏差で表す。 ・二次元ガウス分布 G(x, y) = 1/(2πσ2) * Exp(-(x2+y2)/2σ2) で求められる。数学的に無限遠からの算出であるが、適度に打ち切れば良い。ライブラリではσによりその都度算出している。 ・実用の分布を求める x、yの範囲は結局、空間フィルタの縦横サイズになるので、余り大きいと演算時間が掛かりすぎる。範囲は、σでほぼ決まるので、σ毎に最適なサイズを決めればよい。筆者の実験では、以下の式が得られた。 アルゴリズム
M = 8 * σ - 1 Mは、x、yの幅、つまり、正方形フィルタのサイズ。実際には、M 以上の奇数にし、正規化している。σ = 4 にすると、M = 31 となり、かなり大きなフィルタとなる。下図は、指定のパラメータに従った二次元ガウス分布を求めるツールの実施例である。
左上はマトリクスサイズ、左下はσ、右下はΣG(x, y) ○ボケとの差分 原画のRGB成分からボケのRGB成分をそれぞれ引く。結果は正負に及ぶので、絶対値が閾値より大きい時だけ処理を行い、小さいときは元の画素のままとする。最後に、RGB値にするための閾値処理を行う。 ●暗号化/復号化 指定された任意の文字列の各文字コードを、ある一次式で結合、変換し、その値を秘密の素数で除算した剰余を乱数の種にし、発生した乱数列で、画素値の置換えと、画素位置の置換えをしている。画素値を乱数で置き換えただけでは、元画像の幻影が僅かに残ってしまうので、画素位置の置換えを追加した。文字は、半角、全角、漢字など任意。 乱数表は、元の整数に1:1の写像とならないと、復元できない。処理としては、連続数列を乱数にてシャッフルしている。 乱数関数は、ある方法で種を与えると、必ず同じ乱数を生成する。これを利用して復号化している。先ほどの乱数表の逆のものを生成あるいは、逆読みして同じ処理をしている。C++版あり。
|