C# алгоритм поиска фрагмента изображения

В моем распоряжении есть отличный метод, который ищет фрагмент изображения в большой картинке. Код:

    private static Point? searchBitmap(Bitmap smallBmp, Bitmap bigBmp, double tolerance)
    {
        BitmapData smallData =
          smallBmp.LockBits(new Rectangle(0, 0, smallBmp.Width, smallBmp.Height),
                   System.Drawing.Imaging.ImageLockMode.ReadOnly,
                   System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        BitmapData bigData =
          bigBmp.LockBits(new Rectangle(0, 0, bigBmp.Width, bigBmp.Height),
                   System.Drawing.Imaging.ImageLockMode.ReadOnly,
                   System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        int smallStride = smallData.Stride;
        int bigStride = bigData.Stride;
        int bigWidth = bigBmp.Width;
        int bigHeight = bigBmp.Height - smallBmp.Height + 1;
        int smallWidth = smallBmp.Width * 3;
        int smallHeight = smallBmp.Height;
        int margin = Convert.ToInt32(255.0 * tolerance);
        unsafe
        {
            byte* pSmall = (byte*)(void*)smallData.Scan0;
            byte* pBig = (byte*)(void*)bigData.Scan0;
            int bigOffset = bigStride - bigBmp.Width * 3;
            bool matchFound = true;
            for (int y = 0; y < bigHeight; y++)
            {
                for (int x = 0; x < bigWidth; x++)
                {
                    byte* pBigBackup = pBig;
                    byte* pSmallBackup = pSmall;
                    for (int i = 0; i < smallHeight; i++)
                    {
                        matchFound = true;
                        for (int j = 0; j < smallWidth; j++)
                        {
                            int inf = pBig[0] - margin;
                            int sup = pBig[0] + margin;
                            if (sup < pSmall[0] || inf > pSmall[0])
                            {
                                matchFound = false;
                                break;
                            }
                            pBig++;
                            pSmall++;
                        }
                        if (!matchFound) break;
                        pSmall = pSmallBackup;
                        pBig = pBigBackup;
                        pSmall += smallStride * (1 + i);
                        pBig += bigStride * (1 + i);
                    }
                    if (matchFound)
                    {
                        return new Point(x, y);
                    }
                    else
                    {
                        pBig = pBigBackup;
                        pSmall = pSmallBackup;
                        pBig += 3;
                    }
                }
                if (matchFound) break;
                pBig += bigOffset;
            }
        }
        bigBmp.UnlockBits(bigData);
        smallBmp.UnlockBits(smallData);
        return null;
    }

Но есть один нюанс, поиск по картинке происходит сверху-вниз. Подскажите как переделать алгоритм данного метода, чтобы поиск производился снизу-вверх. Заранее спасибо.


Ответы (0 шт):