透明な画像にボックス ブラーを適用しようとしていますが、エッジの周りに「暗いハロー」が表示されます。
Jerry Huxtableはこの問題について簡単に言及しており、問題が発生したことを示す非常に優れたデモがあります。
しかし、私の人生では、「事前に乗算されたアルファ」がどのように問題を解決できるかを理解できません。次に、非常に単純な例を示します。私は 1 つの赤と 1 つの緑のピクセルを含む 3x3 の画像を持っています。
実際には、残りのピクセルは透明です。
次に、画像に 3x3 ボックス ブラーを適用します。簡単にするために、中央のピクセルの新しい値のみを計算します。ボックス ブラーが機能する方法は、9 位置の正方形 (カーネルと呼ばれる 3x3) があるため、カーネル内の各ピクセルの 1/9 を取得し、それを合計することです。
そう
finalRed = 1/9 * red1 + 1/9 * red2 + 1/9 * red3+ ... + 1/9 * red9
finalGreen = 1/9*green1 + 1/9*green2 + 1/9*green3+ ... + 1/9*green9
finalBlue = 1/9* blue1 + 1/9* blue2 + 1/9* blue3+ ... + 1/9* blue9
finalAlpha = 1/9*alpha1 + 1/9*alpha2 + 1/9*alpha3+ ... + 1/9*alpha9
この非常に単純化された例では、計算は非常に単純になります。
finalRed = 1/9 * 255
finalGreen = 1/9 * 255
finalBlue = 0
finalAlpha = 1/9*255 + 1/9*255
これにより、次の最終的な色の値が得られます。
finalRed = 28
finalGreen = 28
finalBlue = 0
finalAlpha = 56 (22.2%)
この色は暗すぎる。Photoshop で同じ 3x3 ピクセルの画像に対して 3px ボックス ブラーを実行すると、次のような結果が得られます。
白の上に表示すると、どちらがより明確になります:
実際には、透明なテキストを含むビットマップでボックスぼかしを実行しています。テキストは、フリンジの周りが暗くなっています。
私はPixelFormat32bppARGB
フォーマットされているGDI +ビットマップから始めています
3x3 畳み込みカーネルを適用するときに「事前に乗算されたアルファ」を使用するにはどうすればよいですか?
次の理由から、回答には新しいフォーラムを含める必要があります。
final = 1/9*(pixel1+pixel2+pixel3...+pixel9)
間違った答えを得ています。
編集:より簡単な例は次のとおりです。
0..1 の範囲の色とアルファ値でこの計算を実行します。
ボックス ブラー畳み込みフィルターを中央のピクセルに適用します。
ARGB'
= 1/9 * (0,1,0,1) + 1/9 * (0,0,0,0) + 1/9 * (0,0,0,0) +
1/9 * (0,1,0,1) + 1/9 * (0,0,0,0) + 1/9 * (0,0,0,0) +
1/9 * (0,1,0,1) + 1/9 * (0,0,0,0) + 1/9 * (0,0,0,0);
= (0, 0.11, 0, 0.11) + (0,0,0,0) + (0,0,0,0) +
(0, 0.11, 0, 0.11) + (0,0,0,0) + (0,0,0,0) +
(0, 0.11, 0, 0.11) + (0,0,0,0) + (0,0,0,0)
= (0, 0.33, 0, 0.33)
これにより、かなり透明な濃い緑色が得られます。
これは私が期待するものではありません。比較すると、Photoshop の Box Blur は次のようになります。
事前に乗算されたアルファであると想定(0, 0.33, 0, 0.33)
し、乗算を解除すると、次のようになります。
(0, 1, 0, 0.33)
これは、私の完全に不透明な例に適しています。しかし、部分的に透明なピクセルを使用し始めたときにどうすればよいかわかりません。