Corrigir a distorção de perspectiva da imagem de um documento em .NET

Categoria do blog: Imagens.NET

08.12.2023

Atualmente, é muito comum que a imagem de um documento seja fotografada pela câmera de um celular. Evidentemente, é bastante difícil posicionar a câmera de forma ideal acima do documento fotografado; como resultado, quase todas as imagens capturadas apresentam alguma distorção de perspectiva.

Aqui está um exemplo de imagens de documentos rotacionadas,que são capturadas pela câmera de um smartphone moderno:




Quase todos os sistemas destinados ao trabalho com documentos eletrônicos exigem imagens que não estejam rotacionadas ou distorcidas. Assim, surge a tarefa de corrigir (endireitar) as imagens que estão rotacionadas ou distorcidas.
VintaSoft Document Cleanup .NET Plug-in 7.3 (VintaSoft Imaging .NET SDK 12.3) foi adicionado com um comando destinado à correção de distorções de perspectiva em imagens de documentos.

DocumentPerspectiveCorrectionCommand pode ser usado para resolver os seguintes problemas:

Nota: DocumentPerspectiveCorrectionCommand retorna um bom resultado se a borda da imagem do documento tiver um contraste aceitável, ou seja, se a borda do documento for facilmente visível ao olho humano.

Aqui está um exemplo de imagem de documento corrigida que foi processada por DocumentPerspectiveCorrectionCommand:





Aqui está um código C# que demonstra como corrigir a distorção de perspectiva da imagem do 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);
    }
}


Se a proporção da imagem do documento for conhecida inicialmente, então a proporção deve ser especificada usando a propriedade DocumentPerspectiveCorrectionCommand.DocumentAspectRatio.
Aqui está um código C# que demonstra como corrigir a distorção de perspectiva para uma imagem 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 a transformação de correção de perspectiva. Se você conhece os pontos de canto da imagem distorcida, pode usar QuadrilateralWarpCommand para realizar uma transformação inversa de perspectiva.
Aqui está um código C# que demonstra como corrigir a distorção de perspectiva da imagem do documento, se os pontos de canto da imagem distorcida forem conhecidos:
/// <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);
    }
}