首页 > 解决方案 > 无法匹配相同图像大小但转移斑点图案的图像

问题描述

我正在尝试将图像与模板主图像匹配。所有图像的大小都相同,但图像中的斑点图案会发生变化。

我在 aforge 中尝试了 thresholdfilter,当缺陷表中的 blob 与模板图像完美对齐时,它可以很好地找到差异。如果有一点点变化,所有的斑点都被检测为缺陷(不同)。

var img1 = AForge.Imaging.Image.FromFile(@"compare2.jpg");
var img2 = AForge.Imaging.Image.FromFile(@"compare1.jpg");

// (* calculate absolute difference *)
var difference = new AForge.Imaging.Filters.ThresholdedDifference(15)
    {OverlayImage = img1}
    .Apply(img2);

// (* create and initialize the blob counter *)
var bc = new AForge.Imaging.BlobCounter();
bc.FilterBlobs = true;
bc.MinWidth = 5;
bc.MinHeight = 5;

 // (* find blobs *)
 bc.ProcessImage(difference);

 // (* draw result *)
 BitmapData data = img2.LockBits(
   new Rectangle(0, 0, img2.Width, img2.Height),
      ImageLockMode.ReadWrite, img2.PixelFormat);

 Pen redPen = new Pen(Color.Red, 2); 

 foreach (var rc in bc.GetObjectsRectangles())
    AForge.Imaging.Drawing.Rectangle(data, rc, Color.Red);

  img2.UnlockBits(data);
   imageBox1.Image = img2;

主图像: 主模板

移动的斑点" 移位的斑点

如何对齐 2 个图像以使图案始终完美对齐?

标签: c#opencvemgucvaforgeaccord.net

解决方案


如果您知道两个图像上第一个 blob 的坐标,则可以使用CanvasMovefilter 将它们完美对齐:

// create filter
CanvasMove filter = new CanvasMove(new IntPoint(
    YOUR_X_DIFF, YOUR_Y_DIFF
), Color.Green );
// apply the filter
filter.ApplyInPlace( image );

您还可以查看尝试自动对齐图像的MoveTowards过滤器(如果我理解正确的话),描述听起来可能很有用:

此过滤器的结果是一个图像,它基于源图像,但以减少与覆盖图像的差异的方式进行了更新 - 源图像向覆盖图像移动


推荐阅读