見出し画像

「先鋭化」なのに「アンシャープ」??~「アンシャープマスク」とは?

画像の先鋭化処理としても最もよく使われるのが「アンシャープマスク(Unsharp masking)」です。

写真をやる人であればほとんどの人が、聞いたこと・使ったことがあるのではないでしょうか。


「先鋭化」なのに、なぜ「アンシャープ」??

と思われる方もいるかもしれません。


これは、大昔から用いられていた、「ぼかしたネガ(アンシャープマスク)をポジフィルムに重ねて現像するとクッキリする」というフィルム現像テクニックが元になっています。


波形で見てみましょう。

1.なまった波形(元画像)

画像1

2.1をぼかした波形

画像2

3.1-2

画像3

4.1+3

画像4

元のなまった波形のエッジ変化が急峻になっているのが分かると思います。


人の目は輝度変化の解像度は高いですが色解像度は輝度に比べ低いので、一般的には輝度成分のみにアンシャープマスクを適用し、リミット処理をして出力します。

より一般的には、ぼかしの半径と足す量を調整します。
レベルの低い信号には掛けないように閾値を設定する場合も多いです。

実際の画像で見てみましょう。

画像5

元画像 モデル:海老沢一恵

画像6

アンシャープマスク処理後

ノイズが増えてざらついたりすることも不自然さもなく、顔とかがクッキリした感じになっているのが分かると思います。


一応MATLABソースも。

A = imread('kazue55_021.jpg');
Ilab = rgb2lab(A);  % to L*a*b*
Ith = Ilab(:,:,1);  % take L*
Ith(Ith < 2*100/255) = 0;  % set threshold
Iblurer = imgaussfilt(Ith,1);  % make blurer image
Iusm = Ith - Iblurer;  % USM
IusmS = Ith + Iusm;  % add USM components to the source image
Ilab(:,:,1) = IusmS;  % set to the source color image
B = lab2rgb(Ilab);  %  to RGB
imwrite(B,'kazue55_021_USM2.jpg','jpg','Quality',85)

MATLABにはアンシャープマスク関数があるのでそれを使うと一行でできます。 

b = imsharpen(A,'Radius',1,'Amount',1,'Threshold',2/255);

差分を取ってみると0ですね。

max(max(max(abs(uint8(B)-b))))
ans =
 uint8
  0

スレッショルドは足すときに適用しても良いと思います。
本来の処理を考えるとマスク作る段階で自然にスレッショルドが掛かりそうな気がするのでこうしてみましたが。

アンシャープマスクはぼかしたものを重ねるので、単純なシャープ処理に比べ細かいノイズが強調されにくいという特徴があります。

簡単な回路でこのような選択的な処理ができるので、アナログ時代のビデオ機器にもよく搭載されていました。


フィルムだろうがデジタルだろうが、変わらないモノは変わらないんですね。(u_u)


この記事が気に入ったらサポートをしてみませんか?