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:
Imagem de documento capturada pela câmera do celular
Imagem de documento capturada pela câmera do celular


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:
Corrected document image that was processed by DocumentPerspectiveCorrectionCommand
Corrected document image that was processed by 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);
    }
}