【要約】透過PNGの縁に残る「色のフリンジ」をPythonで自動除去する [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
コーダーがWebサイトの素材制作において、切り抜いた透過PNGを背景に合成した際、輪郭に不自然な色の縁(フリンジ)が現れる問題に直面した。等倍では気づきにくいが、拡大や回転を行うと、アンチエイリアス部分に元の背景色が混ざり、汚れとして目立つ。
- ・Photoshopの「マット削除」は、指定した単色を基準とするため、背景色が複雑な場合に不十分である。
- ・切り抜き後の回転や拡大といった後工程の再サンプリングにより、汚染が再発・拡散する可能性がある。
// Approach
著者は、半透明ピクセルの色を、最も近い「信頼できる不透明なピクセル」の色で置き換えるアルゴリズムをPythonで実装した。Alpha値を維持したままRGB値のみを差し替えることで、輪郭の形状を保つアプローチをとっている。
- ・PillowとNumPyを用いて画像をRGBA配列として読み込む。
- ・Alpha値が250以上のピクセルを「信頼できるピクセル」として定義する。
- ・
scipy.ndimage.distance_transform_edtを用い、信頼できないピクセルから最も近い信頼できるピクセルの座標を算出する。 - ・算出された座標のRGB値を、元のAlpha値と組み合わせて再構成する。
// Result
著者はこの手法により、画像の輪郭の滑らかさを維持したまま、不要な色のにじみを除去することに成功した。デザインツールでの手作業による試行錯誤を、プログラムによる確実な処理へと置き換える手段を提示している。
- ・Photoshopの機能では取りきれなかった、複雑な背景由来の汚れを効果的にクリーンアップできた。
- ・境界のアンチエイリアス(階調)を保持できるため、輪郭がガタガタになる副作用を回避している。
- ・数行のコードで実装可能であり、画像処理の自動化プロセスへの導入が容易である。
Senior Engineer Insight
> 実戦的な画像処理パイプラインにおいて、非常に有用なアプローチだ。Photoshop等のGUIツールでは限界がある「微細な色の汚染」を、数学的な最近傍探索で解決する点は合理的である。ただし、大量の画像をバッチ処理する場合、
distance_transform_edt の計算コストとメモリ消費に留意すべきだ。また、alpha >= 250 という閾値の固定は、入力画像の品質に依存するため、運用環境ではヒストグラム解析等に基づいた動的な閾値設定を検討すべきである。