Comment auto recadrer une image?

Je suis en train de faire une application de numérisation. Cette application va scanner le document et l'affichage de l'image dans une zone de l'image. Le problème, je suis confronté à des images (Documents de l'image qui a gardé dans le scanner ou dire "réel" de l'image) est l'affichage à l'intérieur d'une image d'arrière-plan (couleur d'arrière-plan est également en train de changer) sa ressembler à cette image.

Comment auto recadrer une image?

J'ai essayé beaucoup de choses mais rien ne me donnant un résultat parfait, j'ai essayé avec un forge.net. Voici le code que j'ai essayé.

public static System.Drawing.Image AforgeAutoCrop(Bitmap selectedImage)
{
Bitmap autoCropImage = null;
try
{
autoCropImage = selectedImage;
//create grayscale filter (BT709)
Grayscale filter = new Grayscale(0.2125, 0.7154, 0.0721);
Bitmap grayImage = filter.Apply(autoCropImage);
//create instance of skew checker
DocumentSkewChecker skewChecker = new DocumentSkewChecker();
//get documents skew angle
double angle = skewChecker.GetSkewAngle(grayImage);
//create rotation filter
RotateBilinear rotationFilter = new RotateBilinear(-angle);
rotationFilter.FillColor = Color.White;
//rotate image applying the filter
Bitmap rotatedImage = rotationFilter.Apply(grayImage);
new ContrastStretch().ApplyInPlace(grayImage);
new Threshold(100).ApplyInPlace(grayImage);
BlobCounter bc = new BlobCounter();
bc.FilterBlobs = true;
//bc.MinWidth = 500;
//bc.MinHeight = 500;
bc.ProcessImage(grayImage);
Rectangle[] rects = bc.GetObjectsRectangles();
MemoryStream writeName = new MemoryStream();
if (rects.Length == 0)
{
System.Windows.Forms.MessageBox.Show("No rectangle found in image ");
}
else if (rects.Length == 1)
{
Bitmap cropped = new Crop(rects[0]).Apply(autoCropImage);
autoCropImage = cropped;
//pictureBox1.Image = cropped;
}
else if (rects.Length > 1)
{
//get largets rect
Console.WriteLine("Using largest rectangle found in image ");
var r2 = rects.OrderByDescending(r => r.Height * r.Width).ToList();
//var r2 = rects.OrderByDescending(r => r.Height < 1500 && r.Width < 1000).ToList();
Bitmap cropped = new Crop(r2[0]).Apply(autoCropImage);
Graphics gr = Graphics.FromImage(cropped);
gr.DrawRectangles(new Pen(Color.Red), rects);
autoCropImage = cropped;
//pictureBox1.Image = cropped;
}
else
{
Console.WriteLine("Huh? on image ");
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
return autoCropImage;
}
"Pas de résultat" est très loin d'être une véritable question de droit de vote pour fermer. En passant, je ne voudrais pas essayer quelque chose comme ça à l'aide de GDI+, mieux utiliser un outil comme ImageMagick (imagemagick.org/script/index.php), ou le correspondant .NET API (imagemagick.codeplex.com)
il est très utile merci. J'ai essayé AForge au lieu de ImageMagick. Merci encore.

OriginalL'auteur Rakesh | 2012-08-02