以下代码在大多数情况下会在一组图像中找到最佳焦点图像,但在某些图像中,它会为图像返回更高的值,这对我的眼睛来说更加模糊。
我在 Linux 和/或 Mac 上使用 OpenCV 3.4.2。
import org.opencv.core.*;
import org.opencv.imgproc.Imgproc;
import static org.opencv.core.Core.BORDER_DEFAULT;
public class LaplacianExample {
public static Double calcSharpnessScore(Mat srcImage) {
/// Remove noise with a Gaussian filter
Mat filteredImage = new Mat();
Imgproc.GaussianBlur(srcImage, filteredImage, new Size(3, 3), 0, 0, BORDER_DEFAULT);
int kernel_size = 3;
int scale = 1;
int delta = 0;
Mat lplImage = new Mat();
Imgproc.Laplacian(filteredImage, lplImage, CvType.CV_64F, kernel_size, scale, delta, Core.BORDER_DEFAULT);
// converting back to CV_8U generate the standard deviation
Mat absLplImage = new Mat();
Core.convertScaleAbs(lplImage, absLplImage);
// get the standard deviation of the absolute image as input for the sharpness score
MatOfDouble median = new MatOfDouble();
MatOfDouble std = new MatOfDouble();
Core.meanStdDev(absLplImage, median, std);
return Math.pow(std.get(0, 0)[0], 2);
}
}
这是两张使用相同照明(荧光,DAPI)的图像,从显微镜载玻片下方拍摄,同时尝试自动聚焦在载玻片顶部表面的涂层/掩模上。
我希望有人可以向我解释为什么我的算法无法检测到不太模糊的图像。谢谢!