@pochi3123

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

C# OpenCVで画像のピント評価が対象サイズに依存する問題

解決したい問題

C#とOpenCVで画像のピント評価(フォーカスレベル測定)を行う際に、計測対象の大きさによって結果が変動する問題が発生しています。具体的には:

  • 計測対象が小さい → フォーカスレベル値が大きくなる

  • 計測対象が大きい → フォーカスレベル値が小さくなる

対象の大きさに関係なく、フォーカスレベルを平等に評価したいです。
解決方法を教えて下さい。

該当するソースコード

// needleRectはRotatedRectを使って得た計測対象の範囲が入っている。
 public void DetectNeedleSharpness(Mat sourceImage, Rect needleRect)
 {
     if (sourceImage == null || needleRect == null || sourceImage.Empty() ||
needleRect.Width <= 0 || needleRect.Height <= 0)
     {
         return;
     }

     // 入力画像(CV_8U)
     Mat roi = new Mat(sourceImage, needleRect);

     // Z-score正規化
     Scalar mean, stddev;
     Cv2.MeanStdDev(roi, out mean, out stddev);
     if (stddev.Val0 > 1e-6)
     {
         roi -= new Scalar(mean.Val0);
         Cv2.Divide(roi, new Scalar(stddev.Val0), roi);
     }

    
     // 針のエッジを検出するためのフィルタを適用
     Mat laplacianImage = new Mat();

     Cv2.Laplacian(roi, laplacianImage, MatType.CV_32F, 3);
    
     // 平均と標準偏差を計算
     Cv2.MeanStdDev(laplacianImage, out Scalar _, out Scalar stddev);

     double sharpness = stddev2.Val0 * stddev.Val0
 }

試した方法とその結果

  • LaplacianとSobel画像の一致度で評価
    → 対象サイズによる差は改善されず

  • ROIを固定サイズにリサイズして評価
    → 図形が潰れてしまい公平な判定ができない

0 likes

1Answer

「フォーカスレベル」の正当な求め方(?)は知りませんが

// (面積の平方根で除算)

なんてことをするならば,それはそうだろうという気がします.

1Like

Comments

  1. @pochi3123

    Questioner

    クロスポストはマナー違反のようですね。taratailの記事は削除申請を送っております。失礼いたしました。

    // (面積の平方根で除算)

    を修正しましたが、依然としてフォーカスレベルは図形の大きさに依存します。
    修正前のsharpness
    図形が小さいとき : 約20
    大きいとき : 約4

    修正後のsharpness
    図形が小さいとき : 約1
    大きいとき : 約0.25

Your answer might help someone💌