【发布时间】:2016-04-28 20:29:16
【问题描述】:
我正在尝试使用 AForge 在未知的随机位置检测和裁剪一张空白页面中的照片,遵循文章 Here
我从谷歌图片中下载了一张护照照片并贴在一张白纸上:
AForge 完成了工作, 但是,有一个我无法弄清楚的小问题; 照片裁剪错误。
这是裁剪后的照片在处理后的样子:
你注意到照片的白边了吗?好像照片倾斜以在两侧留下空白。
AForge 不仅没有将这张照片的四边形识别为矩形,而且还裁剪错误。
这是我从文章中获取并针对裁剪进行了调整的代码:
Bitmap bitmap = AForge.Imaging.Image.Clone(bmp, PixelFormat.Format24bppRgb);
BitmapData bitmapData = bitmap.LockBits(
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadWrite, bitmap.PixelFormat);
Invert invertFilter = new Invert();
invertFilter.ApplyInPlace(bitmapData);
BlobCounter blobCounter = new BlobCounter();
blobCounter.FilterBlobs = true;
blobCounter.MinHeight = 50;
blobCounter.MinWidth = 50;
blobCounter.MaxHeight = 1500;
blobCounter.MaxWidth = 1500;
blobCounter.ProcessImage(bitmapData);
Blob[] blobs = blobCounter.GetObjectsInformation();
bitmap.UnlockBits(bitmapData);
if (blobs.Length == 1)
{
List<IntPoint> corners;
List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blobs[0]);
SimpleShapeChecker shapeChecker = new SimpleShapeChecker();
if (shapeChecker.IsConvexPolygon(edgePoints, out corners))
{
if (corners.Count == 4)
{
int[] sides = new int[4];
Math.Pow(corners[0].X - corners[1].X, 2);
sides[0] = (int)Math.Sqrt(Math.Pow(corners[0].X - corners[1].X, 2) + Math.Pow(corners[0].Y - corners[1].Y, 2));
sides[1] = (int)Math.Sqrt(Math.Pow(corners[2].X - corners[1].X, 2) + Math.Pow(corners[2].Y - corners[1].Y, 2));
sides[2] = (int)Math.Sqrt(Math.Pow(corners[2].X - corners[3].X, 2) + Math.Pow(corners[2].Y - corners[3].Y, 2));
sides[3] = (int)Math.Sqrt(Math.Pow(corners[0].X - corners[3].X, 2) + Math.Pow(corners[0].Y - corners[3].Y, 2));
BaseQuadrilateralTransformationFilter qtb = new QuadrilateralTransformationBilinear(corners, sides.Min(), sides.Max());
bitmap = qtb.Apply(bitmap);
}
}
}
bitmap = invertFilter.Apply(bitmap);
感谢您对此提供的任何意见...
【问题讨论】:
-
我在文档成像中使用的一个技巧是提高“对比度”,这样当您进行去歪斜然后裁剪时,图像几乎是黑色的。你看起来很高级,所以我相信你已经知道了,但没有伤害。
-
我怀疑整数精度。检查您的警告 - 是否有任何从实数类型到整数的隐式转换?