Улучшите качество подписи, извлеченной с помощью OpenCV из отсканированного листа бумаги.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Улучшите качество подписи, извлеченной с помощью OpenCV из отсканированного листа бумаги.

Сообщение Anonymous »

Я извлек подпись из отсканированного листа бумаги. Пользователи знают, что подпись должна быть только на белом листе бумаги.
Я реализовал обрезку подписи из загруженного изображения с помощью Java-библиотеки OpenCV.
Я хочу улучшить качество извлеченной подписи. Я понял, что лучшая версия вместе с исходным файлом — это версия в оттенках серого (grayROI). Например, я бы сделал фон белее.
Не могли бы вы подсказать, как я могу улучшить окончательный вид подписи?

Код: Выделить всё

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;

import org.apache.commons.io.FilenameUtils;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.utils.Converters;

import nu.pattern.OpenCV;

public static synchronized void extractSignature(File signature) {

if (signature == null)
return;

String fileExtension = FilenameUtils.getExtension(signature.getName());

// check if the file extension is correct!
if (!fileExtension.toLowerCase().equals("jpg") && !fileExtension.toLowerCase().equals("jpeg") && !fileExtension.toLowerCase().equals("png")) {
return;
}

try {

if (!isLoaded) {
OpenCV.loadLocally();
isLoaded = true;
}

} catch (Exception e) {
System.out.println(e.toString());
}

// Load image
Mat image = Imgcodecs.imread(signature.getPath());
Mat imageOriginal = image.clone();

// Convert image to HSV color space
Mat hsv = new Mat();
Imgproc.cvtColor(image, hsv, Imgproc.COLOR_BGR2HSV);

// Define lower and upper bounds for color threshold
Scalar lower = new Scalar(90, 38, 0);
Scalar upper = new Scalar(145, 255, 255);

// Threshold the HSV image to get only desired colors
Mat mask = new Mat();
Core.inRange(hsv, lower, upper, mask);

// Find contours
List contours = new ArrayList();
Mat hierarchy = new Mat();
Imgproc.findContours(mask, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);

// Combine all contours into one and get bounding box
MatOfPoint allContours = new MatOfPoint();
for (MatOfPoint contour : contours) {
List
  pts = contour.toList();
allContours.push_back(new MatOfPoint(Converters.vector_Point_to_Mat(pts)));
}

Rect boundingBox = Imgproc.boundingRect(allContours);

// Add 5 pixels to each dimension of the bounding box
int padding = 10;
int x = Math.max(boundingBox.x - padding, 0);
int y = Math.max(boundingBox.y - padding, 0);
int width = Math.min(boundingBox.width + 2 * padding, image.cols() - x);
int height = Math.min(boundingBox.height + 2 * padding, image.rows() - y);
Rect paddedBoundingBox = new Rect(x, y, width, height);

// Extract ROI
//Mat ROI = new Mat(imageOriginal, boundingBox);
Mat ROI = new Mat(imageOriginal, paddedBoundingBox);

// Convert ROI to grayscale
Mat grayROI = new Mat();
Imgproc.cvtColor(ROI, grayROI, Imgproc.COLOR_BGR2GRAY);

// Apply histogram equalization to improve contrast
Mat equalizedROI = new Mat();
Imgproc.equalizeHist(grayROI, equalizedROI);

// Apply adaptive thresholding to binarize the image
Mat binaryROI = new Mat();
Imgproc.adaptiveThreshold(grayROI, binaryROI, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY, 11, 2);

// Apply morphological transformations to improve the signature appearance
Mat morphROI = new Mat();
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2, 2));
Imgproc.morphologyEx(binaryROI, morphROI, Imgproc.MORPH_CLOSE, kernel);
Imgproc.morphologyEx(morphROI, morphROI, Imgproc.MORPH_OPEN, kernel);

// Save and display images
Imgcodecs.imwrite(FileUtils.getSignaturesFolder().getAbsolutePath() + File.separator + signature.getName(), ROI);
Imgcodecs.imwrite(FileUtils.getSignaturesFolder().getAbsolutePath() + File.separator + "morphROI.jpg", morphROI);
Imgcodecs.imwrite(FileUtils.getSignaturesFolder().getAbsolutePath() + File.separator + "grayROI.jpg", grayROI);
Imgcodecs.imwrite(FileUtils.getSignaturesFolder().getAbsolutePath() + File.separator + "binaryROI.jpg", binaryROI);
Imgcodecs.imwrite(FileUtils.getSignaturesFolder().getAbsolutePath() + File.separator + "equalizedROI.jpg", equalizedROI);

return;
}
Вот пример исходного изображения:
[img]https://i. sstatic.net/8M3B5OAT.jpg[/img]

Я получаю такой результат:
Изображение


Подробнее здесь: https://stackoverflow.com/questions/787 ... heet-paper
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»