2

我有 2 张图片,包含彼此的一部分:

在此处输入图像描述

现在我想将它们组合在一起,但不重复共同部分,以获得类似的东西:

在此处输入图像描述

最好的方法是什么?

@edit:这些图像只是我想要对任何两个图像执行的操作的示例,它们包含彼此的一部分,并且该部分位于第一个图像的底部,第二个图像的顶部。

4

1 回答 1

2

这是您的问题的解决方案:

我定义了一个函数,它接受 2Bitmaps并返回组合Bitmap ,在这个函数中,我将第二个位图的前 2 行存储在一个数组中,byte以便我可以在下一步将它们与第一个位图进行比较,然后我开始寻找匹配的每当我对匹配的行进行罚款时,第一个位图中的行,我存储y位置,现在我根据y我已经找到的组合这些位图!

这是演示项目:下载

这是解决方案文件:下载

这是结果:

  • 示例 1

在此处输入图像描述

  • 示例 2

在此处输入图像描述

这是功能:

private Bitmap CombineImages(Bitmap bmp_1, Bitmap bmp_2)
{
    if (bmp_1.Width == bmp_2.Width)
    {
        int bmp_1_Height, bmpWidth, bmp_2_Height;

        bmpWidth = bmp_1.Width;
        bmp_1_Height = bmp_1.Height;
        bmp_2_Height = bmp_2.Height;

        Color c;
        bool notFound = false;
        int firstMatchedRow = 0;

        byte[,] bmp2_first2rows = new byte[3 * bmpWidth, 2];

        for (int b = 0; b < 2; b++)
        {
            for (int a = 0; a < bmpWidth; a++)
            {
                c = bmp_2.GetPixel(a, b);
                bmp2_first2rows[a * 3, b] = c.R;
                bmp2_first2rows[a * 3 + 1, b] = c.G;
                bmp2_first2rows[a * 3 + 2, b] = c.B;
            }
        }

        for (int y = 0; y < bmp_1_Height - 1; y++)
        {
            for (int j = 0; j < 2; j++)
            {
                for (int x = 0; x < bmpWidth; x++)
                {
                    c = bmp_1.GetPixel(x, y + j);
                    if ((bmp2_first2rows[x * 3, j] == c.R) &&
                        (bmp2_first2rows[x * 3 + 1, j] == c.G) &&
                        (bmp2_first2rows[x * 3 + 2, j] == c.B))
                    {
                    }
                    else
                    {
                        notFound = true;
                        break;
                    }
                }
                if (notFound)
                {
                    break;
                }
            }
            if (!notFound)
            {
                firstMatchedRow = y;
                break;
            }
            else
            {
                notFound = false;
            }
        }

        if (firstMatchedRow > 0)
        {
            Bitmap bmp = new Bitmap(bmpWidth, firstMatchedRow + bmp_2_Height);
            Graphics g = Graphics.FromImage(bmp);
            Rectangle RectDst = new Rectangle(0, 0, bmpWidth, firstMatchedRow);
            Rectangle RectSrc;
            g.DrawImage(bmp_1, RectDst, RectDst, GraphicsUnit.Pixel);
            RectDst = new Rectangle(0, firstMatchedRow, bmpWidth, bmp_2_Height);
            RectSrc = new Rectangle(0, 0, bmpWidth, bmp_2_Height);
            g.DrawImage(bmp_2, RectDst, RectSrc, GraphicsUnit.Pixel);
            return bmp;
        }
        else
        {
            return null;
        }
    }
    else
    {
        return null;
    }
}

最后我要提一下,这些很棒的教程在图像处理方面帮助了我很多:

使用 C# 和 GDI+ 进行傻瓜式图像处理

使用 C# 进行图像处理

希望能帮助到你 :)

于 2013-06-25T11:36:25.873 回答