.Netで画像を傾き補正する信頼性の高い方法を探し求めており、多くの運がない。.Netを使用して画像を傾き補正する
私はAforgeを使用しています。これは私がWPFで作業しているときの痛みです。作業している画像はBitmapオブジェクトではなく、BitmapImageオブジェクトで開始し、メモリストリームに保存し、新しいBitmapオブジェクトを作成する必要がありますデスキュープロセスを経て、デスキューされたイメージを新しいメモリストリームに保存し、その後、前記メモリストリームから新しいBitmapImageオブジェクトを作成する。それだけでなく、傾きを補正することは素晴らしいことではありません。
スキャナにスキャンされた紙片のOMRデータを読み取ろうとしているため、毎回同じ座標にある特定のOMRボックスに依存する必要があるため、スキュー調整は信頼性が必要です。
私はAporgeを使用していますが、.NETでイメージのデスキューのための他のフリー/オープンソースライブラリを見つけることはできません。私が見つけたものはすべて適切に高価であるかC/C++です。
私の質問は、.NETでのイメージデスキューを助ける他のフリー/オープンソースライブラリですか?もしそうなら、彼らは何を呼びますか?私はこの問題にどのように接近すべきですか?
編集:
注:たとえば、のは、私は以下のページを持っているとしましょうこれは例示のみを目的としており、実際の画像は実際の各コーナーに黒い四角形を持っていますページ、おそらくこれが役立ちます。
私はこれをプリントアウトし、戻って私のスキャナにそれをスキャンすると、それは次のようになります。
私は私のボックスが同じ場所に毎回あるように、この画像をデスキューする必要があります。現実の世界では、箱がたくさんありますが、それらはもっと小さく接近しているので、正確さは重要です。
このため私の現在の方法は、大規模な効果のない痛み・イン・ザ・お尻です:振り返ってみると
using AForge.Imaging;
using AForge.Imaging.Filters;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Media.Imaging;
public static BitmapImage DeskewBitmap(BitmapImage skewedBitmap)
{
//Using a memory stream to minimise disk IO
var memoryStream = BitmapImageToMemoryStream(skewedBitmap);
var bitmap = MemoryStreamToBitmap(memoryStream);
var skewAngle = CalculateSkewAngle(bitmap);
//Aforge needs a Bppp indexed image for the deskewing process
var bitmapConvertedToBbppIndexed = ConvertBitmapToBbppIndexed(bitmap);
var rotatedImage = DeskewBitmap(skewAngle, bitmapConvertedToBbppIndexed);
//I need to convert the image back to a non indexed format to put it back into a BitmapImage object
var imageConvertedToNonIndexed = ConvertImageToNonIndexed(rotatedImage);
var imageAsMemoryStream = BitmapToMemoryStream(imageConvertedToNonIndexed);
var memoryStreamAsBitmapImage = MemoryStreamToBitmapImage(imageAsMemoryStream);
return memoryStreamAsBitmapImage;
}
private static Bitmap ConvertImageToNonIndexed(Bitmap rotatedImage)
{
var imageConvertedToNonIndexed = rotatedImage.Clone(
new Rectangle(0, 0, rotatedImage.Width, rotatedImage.Height), PixelFormat.Format32bppArgb);
return imageConvertedToNonIndexed;
}
private static Bitmap DeskewBitmap(double skewAngle, Bitmap bitmapConvertedToBbppIndexed)
{
var rotationFilter = new RotateBilinear(-skewAngle) { FillColor = Color.White };
var rotatedImage = rotationFilter.Apply(bitmapConvertedToBbppIndexed);
return rotatedImage;
}
private static double CalculateSkewAngle(Bitmap bitmapConvertedToBbppIndexed)
{
var documentSkewChecker = new DocumentSkewChecker();
double skewAngle = documentSkewChecker.GetSkewAngle(bitmapConvertedToBbppIndexed);
return skewAngle;
}
private static Bitmap ConvertBitmapToBbppIndexed(Bitmap bitmap)
{
var bitmapConvertedToBbppIndexed = bitmap.Clone(
new Rectangle(0, 0, bitmap.Width, bitmap.Height), PixelFormat.Format8bppIndexed);
return bitmapConvertedToBbppIndexed;
}
private static BitmapImage ResizeBitmap(BitmapImage originalBitmap, int desiredWidth, int desiredHeight)
{
var ms = BitmapImageToMemoryStream(originalBitmap);
ms.Position = 0;
var result = new BitmapImage();
result.BeginInit();
result.DecodePixelHeight = desiredHeight;
result.DecodePixelWidth = desiredWidth;
result.StreamSource = ms;
result.CacheOption = BitmapCacheOption.OnLoad;
result.EndInit();
result.Freeze();
return result;
}
private static MemoryStream BitmapImageToMemoryStream(BitmapImage image)
{
var ms = new MemoryStream();
var encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(image));
encoder.Save(ms);
return ms;
}
private static BitmapImage MemoryStreamToBitmapImage(MemoryStream ms)
{
ms.Position = 0;
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = ms;
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.EndInit();
bitmap.Freeze();
return bitmap;
}
private static Bitmap MemoryStreamToBitmap(MemoryStream ms)
{
return new Bitmap(ms);
}
private static MemoryStream BitmapToMemoryStream(Bitmap image)
{
var memoryStream = new MemoryStream();
image.Save(memoryStream, ImageFormat.Bmp);
return memoryStream;
}
、カップルより多くの質問:
- 私が正しくAForgeを使用していますか?
- このタスクにはAForgeが最適なライブラリですか?
- もっと正確な結果を得るために私の現在のアプローチを改善するにはどうすればよいですか?
これは画像処理ツールをブラックボックスとして使用する際の問題です。デスキューするにはさまざまな方法がありますが、それが "偉大ではない"ときに特別に使用されているアプローチを知ることは重要です。さもなければ、別のデスキューブラックボックスがあなたの現在のブラックボックスより良い結果を生み出す機会があるかどうかをどうやって知っていますか? Letponicaには、ブラックボックスのデスキュー方法もありますが、http://tpgit.github.com/Leptonica/skew_8c.htmlには、それが何であるかを読むことができます。これを達成する他の方法もたくさんあります。 – mmgp
@ mmgp私は同意する、私はハフ変換アルゴリズムとC + +の機能を学ぶ時間を持っていたが、悲しいことに私は期限があるので、ブラックボクシングは今私の唯一のオプションです!リンクありがとう、私はそれをチェックします。 – JMK
John、問題にスキューがあるイメージへのリンクを張ったり、質問にそれらを含めることができますか?これにより、人々が簡単に答えることができます。 – DermFrench