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