NL-Means (NLM)でカラー画像を雑音除去する際の注意点に気がつきました。OpenCV2のfastNLMeansDenoigingColored()で、修善寺桜とメジロの写真の雑音除去を行った所、桜の花弁やしべの色が飛んでしまいました。
原因を考えてみたのですが、おそらくfastNLMeansDenoigingColoredの内部ではRGBを輝度値(L)に変換した後、パッチ間の類似度を計算し、RGBすべてのチャンネルに対して共通の重みで平滑化を行っているのではないかと考えました。その結果、花弁やしべの色がパッチ間の類似度の計算にあまり反映されずに色が薄まってしまったと考えられます。
そこで、RGBそれぞれのチャンネルに対して独立にNLMを適用すればこの問題を回避できるのはないかと考え実験してみました。
色チャンネル毎にNLMを適用することで花弁やしべの色を保存しながら雑音が除去できているのがわかります。
ソースコードは以下です。
https://github.com/kibo35/restoration/blob/master/NLM/nlm_for_each_color.py
(追記)
ktgw0316様、ご指摘ありがとうございました。デバッグして頂いたコードで退色の問題が解決されることを確認いたしました。
fastNLMeansDenoigingColoredで処理後の画像が退色したように見えたのは,第二引数のdstが抜けていたためでした。