AIの写真補正で、なんで輪郭に縞が出るの?

AIの写真補正で、なんで輪郭に縞が出るの?
目次

くっきりしたのに、輪郭が光る

AIで古い写真を補正すると、ぼやけていた文字や人物の輪郭が見やすくなります。でも拡大してみると、輪郭のすぐ外側に白いふちや薄い縞が並ぶことないですか?

シャープになったはずなのに、境界だけが少し波打って見える。元の写真にはなかった線なので、AIが描き間違えたようにも見えます。

強調しすぎただけでは説明しきれない

画像をくっきりさせる処理は、明るさが急に変わる場所を見つけ、その差を強めます。強くかければ不自然になるわけですが、ここで一つ不思議があります。

輪郭を太くするだけなら、境界の内側か外側が一様に明るくなりそうです。ところが実際に現れるのは、明るい線と暗い線が交互に続く「リンギング」と呼ばれる模様です。増やしたのが明るさの差なのに、なぜ縞として返ってくるのでしょうか。

輪郭を一本の線ではなく、細かさの異なる波の重なりとして置くと、この模様の形を追えそうです。

輪郭を波に分けてみる

画像は、ゆっくり変わる大きな模様から、細かく変わる模様まで、さまざまな波へ分けられます。この分解をフーリエ変換という見方で試してみます。

輪郭のように明るさが急変する場所を再現するには、細かな波まで必要です。画像補正が高い周波数を強めると輪郭は鋭くなりますが、使える波の範囲や強め方に急な境目があると、波どうしが輪郭の前後で強め合ったり打ち消し合ったりします。その結果、境界の外側にも明暗の揺れが残ります。

各波は強さだけでなく、山と谷をどこに置くかという位相を持ちます。フーリエ変換では、その二つを一つの複素係数で扱います。強さが同じでも位相の組み合わせが変われば、波を足し戻した画像は別の形になります。

複素数の掛け算で角度が足される仕組みは、こちらの記事から続けて読めます。

波を増やしても、境界の揺れは残る

明るさが0から1へ突然変わる境界を、有限個の波で作ってみます。使う波の細かさの上限を $N=7$ から $N=31$ へ上げると、全体は本来の段差へ近づきます。しかし境界の近くでは、値が1を少し越え、反対側でも0を下回る揺れが残ります。

明るさ0→1の段差を有限個の正弦波で近似。Nを増やすと揺れは境界へ狭まるが、最初の行き過ぎは約9%残る。
明るさ0→1の段差を有限個の正弦波で近似。Nを増やすと揺れは境界へ狭まるが、最初の行き過ぎは約9%残る。

この現象はギブス現象と呼ばれます。波の数を増やすと縞の幅は狭くなりますが、理想的な打ち切りでは最初の行き過ぎの高さは消えず、段差の約9%へ近づきます。実際の画像処理では、この揺れを抑えるために、高い周波数の強さをいきなり切らず、なだらかに弱める重み付けを使うことがあります。輪郭の鋭さと行き過ぎの少なさは引き換えの関係にあり、どちらを優先するかで仕上がりが変わります。

同じ形は音声の急な切り替わりや、通信で帯域を急に制限した信号にも現れます。対象は写真だけではなく、「急な変化を有限の波で表す」という条件に付いてくる揺れです。

画像では、文字の黒と紙の白が切り替わる境界や、建物と空が接する線で目立ちます。平らな領域に縞が出にくいのは、急な段差を作るための細かな波をあまり必要としないからです。輪郭だけに光るふちが集まる見え方も、波の打ち切りという説明とつながります。

有限個の波で段差を作る

段差を $f(x)$ として、$x<0$ では0、$x>0$ では1とします。この段差を奇数番目の波だけで近似すると、$N$ 番目までの和は次の形です。

$$ S_N(x)=\frac{1}{2}+\frac{2}{\pi}\sum_{\substack{1\le n\le N\\ n\text{が奇数}}}\frac{\sin(nx)}{n} $$

$S_N(x)$ は有限個の波を足して作った明るさ、$n$ は波の細かさ、$N$ はどこまで細かな波を使うかを示します。$\sin(nx)$ は山と谷を繰り返す波で、$1/n$ は細かな波ほど小さくする重みです。平均値1/2を引いた段差を周期的に並べると、半周期ずらした形が符号反転します。この対称性から、偶数番目の波は差し引きゼロになると読めます。図の $N=7$ では実際に足す波は4本、$N=31$ では16本です。$N$ は波の本数ではなく、使う波の細かさの上限を表します。

$N$ を大きくすると境界から離れた場所では0と1へ近づきます。ところが不連続点の近くでは、異なる細かさの波が同じ側へ重なる場所ができます。単位段差に対する最大の行き過ぎは、極限でおよそ $0.08949$、つまり段差の約8.95%です。波を増やすほど揺れる範囲は境界へ集まりますが、高さだけが素直にゼロへ向かうわけではありません。境界からの距離を $N$ 倍して拡大すると、ピーク周辺はほぼ同じ形に重なります。こう見ると、$N$ を増やしても山の高さは変わりにくく、横幅だけが $1/N$ 程度に縮む様子を読み取れます。

AIによる写真補正の縞が、すべて厳密なギブス現象というわけではありません。ぼやけを推定して元へ戻そうとする逆畳み込みの誤差、学習データの癖、シャープ化フィルタなどでも似た模様は生じます。それでも、有限の周波数範囲で急な輪郭を強めるほど、境界の前後に揺れが出やすいという仕組みは共通しています。

くっきりのつまみは、何を増やすのか

画像のシャープさは、輪郭をどれだけ強くするかだけでは決まりません。どの細かさの波を残すか、どこで強調を止めるか、位相をどこまで保つかが一緒に効きます。

そう考えると、補正アプリの「鮮明さ」は、隠れていた輪郭を見つける量というより、有限個の波で段差をどこまで攻めて作り直すかを選ぶつまみなのかもしれません。縞を出さずに輪郭だけを鋭くするには、AIは存在しない細部を足す前に、どこまでが元画像から確かに言える境界なのかを判断できるでしょうか?

よかったらシェアしてね!
  • URLをコピーしました!
目次