Я строю инструмент обнаружения размывающихся изображений на основе Java с помощью OpenCV. Чтобы
повысить точность, я реализовал метод дисперсии на основе плитки, чтобы оценить локальное размытие, а не глобальное размытие.package com.example.validator;
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class TileBasedBlurDetection {
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static boolean isImageBlurry(String imagePath, double threshold, int tileSize) {
Mat image = Imgcodecs.imread(imagePath, Imgcodecs.IMREAD_GRAYSCALE);
if (image.empty()) {
System.err.println("Could not load image: " + imagePath);
return false;
}
int height = image.rows();
int width = image.cols();
double maxBlurScore = 0;
for (int y = 0; y < height; y += tileSize) {
for (int x = 0; x < width; x += tileSize) {
int roiWidth = Math.min(tileSize, width - x);
int roiHeight = Math.min(tileSize, height - y);
Rect roi = new Rect(x, y, roiWidth, roiHeight);
Mat tile = new Mat(image, roi);
Mat laplacian = new Mat();
Imgproc.Laplacian(tile, laplacian, CvType.CV_64F);
MatOfDouble mean = new MatOfDouble();
MatOfDouble stddev = new MatOfDouble();
Core.meanStdDev(laplacian, mean, stddev);
double variance = Math.pow(stddev.get(0, 0)[0], 2);
if (variance > maxBlurScore) {
maxBlurScore = variance;
}
}
}
System.out.println("Max blur score from tiles: " + maxBlurScore);
return maxBlurScore < threshold;
}
public static void main(String[] args) {
String imagePath = "D:\\id_ card image\\Family Card Sample (ID Card).jpg";
double blurThreshold = 100.0;
int tileSize = 100;
boolean isBlurry = isImageBlurry(imagePath, blurThreshold, tileSize);
System.out.println("Is image blurry? " + isBlurry);
}
}
< /code>
Решение гистограммы запускается здесь < /p>
< /blockquote>
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class ContrastEnhancer {
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
// Enhance contrast using histogram equalization
public static Mat enhanceContrast(Mat inputImage) {
Mat gray = new Mat();
// Convert to grayscale if needed
if (inputImage.channels() > 1) {
Imgproc.cvtColor(inputImage, gray, Imgproc.COLOR_BGR2GRAY);
} else {
gray = inputImage.clone();
}
// Apply histogram equalization
Mat equalized = new Mat();
Imgproc.equalizeHist(gray, equalized);
return equalized;
}
// Compute Laplacian variance to assess sharpness
public static double computeLaplacianVariance(Mat image) {
Mat laplacian = new Mat();
Imgproc.Laplacian(image, laplacian, CvType.CV_64F); // Use 64F for better precision
MatOfDouble mean = new MatOfDouble();
MatOfDouble stddev = new MatOfDouble();
Core.meanStdDev(laplacian, mean, stddev);
return Math.pow(stddev.get(0, 0)[0], 2); // Variance = (stddev)^2
}
public static void main(String[] args) {
String inputPath = "path/to/your/document.jpg"; //
Mat image = Imgcodecs.imread(inputPath);
if (image.empty()) {
System.err.println("Could not load image.");
return;
}
// Enhance contrast
Mat enhanced = enhanceContrast(image);
// Save the enhanced image
Imgcodecs.imwrite("enhanced_output.jpg", enhanced);
System.out.println("Enhanced image saved as enhanced_output.jpg");
// Compute and print Laplacian variance (blur score)
double blurScore = computeLaplacianVariance(enhanced);
System.out.println("Laplacian Variance (Blur Score): " + blurScore);
}
}
< /code>
Гистограмма>
Подробнее здесь: https://stackoverflow.com/questions/795 ... ges-how-to