OpenCVSharp4で凹凸係数法による影の除去

はじめに

凹凸係数 rij とは、各画素 xij をその周辺の平均輝度 Rij で除することで得られる係数である。

カーネル(2n+1)×(2n+1)としたとき、凹凸係数 rij は次式で求まる。
rij=xijRijRij=1(2n+1)2p=nnq=nnxi+p,j+q=blurn×n(xij)
blurは平均値ぼかしである。
(※論文で触れられてないが Rij=0 のゼロ除算はどう定義しよう?)

方法

  1. 画像をグレースケールで読み込む
  2. 平均輝度Rijを求める
  3. 凹凸係数rijを求める
  4. 凹凸係数rijに二値化処理を行う

プログラム

using System;  
using OpenCvSharp;  

namespace 凹凸係数法 {  
    class Program {  
        static void Main(string[] args) {  
            //①画像をグレースケールで読み込み  
            Mat src = new Mat(@"D:\8f10.jpeg", ImreadModes.Grayscale);  
            //Cv2.ImShow("src", src);  
            src.ConvertTo(src, MatType.CV_32FC1);  

            //②平均輝度を算出  
            Mat R = new Mat();  
            Cv2.Blur(src, R, new Size(21, 21));  

            //③凹凸係数を算出  
            Mat r = new Mat();  
            Cv2.Divide(src, R, r);  
            r *= 127;  
            r.ConvertTo(r, MatType.CV_8UC1);  

            //④二値化する  
            Mat dst = new Mat();  
            Cv2.Threshold(r, dst, 0.98, 255, ThresholdTypes.Otsu);  
            dst.ConvertTo(dst, MatType.CV_8UC1);  

            dst.ImWrite(@"D:\dst.png");  
            Cv2.WaitKey();  
        }  
    }  
}  

結果


画像引用

f:id:negizoku:20200920231456p:plain



参考

https://www.jstage.jst.go.jp/article/iteac/2004/0/2004__2-5-1_/_article/-char/ja
https://www.jstage.jst.go.jp/article/iieej/36/3/36_3_204/_pdf/-char/ja
https://qiita.com/fallaf/items/1c5387a79027b2ec64b0