Corregir una distorsión de perspectiva de la imagen del documento en .NET

Categoría del blog: Imaging.NET

08.12.2023

Actualmente, es muy frecuente fotografiar la imagen del documento con la cámara del teléfono. Evidentemente, es bastante difícil colocar la cámara de forma óptima sobre el documento fotografiado, por lo que casi todas las imágenes capturadas presentan distorsiones de perspectiva.

Aquí hay un ejemplo de imágenes de documentos rotados, capturados por la cámara de un teléfono inteligente moderno:
Imagen de documento capturada con la cámara del teléfono
Imagen de documento capturada con la cámara del teléfono


Casi todos los sistemas diseñados para trabajar con documentos electrónicos requieren imágenes que no estén rotadas ni distorsionadas. Por lo tanto, surge la tarea de corregir (enderezar) las imágenes que se rotan o distorsionan.
VintaSoft Document Cleanup .NET Plug-in 7.3 (VintaSoft Imaging .NET SDK 12.3) se agregó con un comando destinado a la corrección de distorsiones de perspectiva en imágenes de documentos.

DocumentPerspectiveCorrectionCommand se puede utilizar para resolver los siguientes problemas:

Nota: DocumentPerspectiveCorrectionCommand devuelve un buen resultado si el borde de la imagen del documento tiene un contraste aceptable, es decir, el borde del documento es fácilmente visible para el ojo humano.

Aquí hay un ejemplo de una imagen de documento corregida que fue procesada por DocumentPerspectiveCorrectionCommand:
Imagen del documento corregida procesada por DocumentPerspectiveCorrectionCommand
Imagen del documento corregida procesada por DocumentPerspectiveCorrectionCommand



Aquí hay un código C# que demuestra cómo corregir una distorsión de perspectiva de la imagen del documento:
/// <summary>
/// Corrects perspective distortion of document image.
/// </summary>
/// <param name="sourceFile">Source image file.</param>
/// <param name="resultFile">Result image file.</param>
public void ApplyPerspectiveCorrection(string sourceFile, string resultFile)
{
    using (Vintasoft.Imaging.VintasoftImage image =
        new Vintasoft.Imaging.VintasoftImage(sourceFile))
    {
        // create the perspective correction command
        Vintasoft.Imaging.ImageProcessing.Document.DocumentPerspectiveCorrectionCommand command =
            new Vintasoft.Imaging.ImageProcessing.Document.DocumentPerspectiveCorrectionCommand();

        // apply the perspective correction to a document image
        command.ExecuteInPlace(image);

        // save the result image to a file
        image.Save(resultFile);
    }
}


Si la relación de aspecto de la imagen del documento se conoce inicialmente, entonces la relación de aspecto debe especificarse utilizando la propiedad DocumentPerspectiveCorrectionCommand.DocumentAspectRatio.
Aquí hay un código C# que demuestra cómo corregir una distorsión de perspectiva para una imagen de documento A4:
/// <summary>
/// Corrects perspective distortion of A4 document image.
/// </summary>
/// <param name="sourceFile">Source file.</param>
/// <param name="resultFile">Result file.</param>
public void ApplyPerspectiveCorrectionA4Paper(string sourceFile, string resultFile)
{
    using (Vintasoft.Imaging.VintasoftImage image =
        new Vintasoft.Imaging.VintasoftImage(sourceFile))
    {
        // create the perspective correction command
        Vintasoft.Imaging.ImageProcessing.Document.DocumentPerspectiveCorrectionCommand command =
            new Vintasoft.Imaging.ImageProcessing.Document.DocumentPerspectiveCorrectionCommand();

        // set the document aspect ratio to the aspect ratio of the A4 paper
        Vintasoft.Imaging.ImageSize paperSizeA4 = Vintasoft.Imaging.ImageSize.FromPaperKind(Vintasoft.Imaging.PaperSizeKind.A4);
        command.DocumentAspectRatio = paperSizeA4.WidthInDip / paperSizeA4.HeightInDip;

        // apply the perspective correction to a document image
        command.ExecuteInPlace(image);

        // save the result image to a file
        image.Save(resultFile);
    }
}


DocumentPerspectiveCorrectionCommand usa QuadrilateralWarpCommand para realizar la transformación de la corrección de perspectiva. Si conoce los puntos de las esquinas de la imagen distorsionada, puede usar QuadrilateralWarpCommand para realizar una transformación inversa de la perspectiva.
Aquí hay un código de C# que demuestra cómo corregir una distorsión de perspectiva de la imagen del documento, si se conocen los puntos de las esquinas de la imagen distorsionada:
/// <summary>
/// Corrects perspective distortion of document image.
/// </summary>
/// <param name="sourceFile">Source image file.</param>
/// <param name="resultFile">Result image file.</param>
/// <param name="documentImagePoints">An array of four points, which define the corner points of document image.
/// Points should be set in the following order: 0 - top-left, 1 - top-right,
/// 2 - bottom-left, 3 - bottom-right.</param>
public void ApplyQuadrilateralUnwarp(string sourceFile, string resultFile, System.Drawing.PointF[] documentImagePoints)
{
    using (Vintasoft.Imaging.VintasoftImage image =
        new Vintasoft.Imaging.VintasoftImage(sourceFile))
    {
        // create the perspective correction command
        Vintasoft.Imaging.ImageProcessing.Transforms.QuadrilateralWarpCommand command =
            new Vintasoft.Imaging.ImageProcessing.Transforms.QuadrilateralWarpCommand();

        // specify that command must use invert transform (command must work as unwarp command)
        command.IsInverseTransform = true;

        // set the corner points of document image
        command.DestinationPoints = documentImagePoints;

        // apply perspective correction to a document image
        command.ExecuteInPlace(image);

        // save the result image to a file
        image.Save(resultFile);
    }
}