从两个图像中删除匹配像素以进行裁剪

时间:2011-10-25 02:26:18

标签: image

我有两张非常相似的图片。

例如,假设我画了一个200x200的正方形,然后填充了各种颜色(比如彩虹色填充),并保存了图像。

然后我在广场中间画了一颗星,并用不同的方块填充了各种颜色,并将其保存为不同的文件。

然后几天后我回来了,我真的很想要那个明星,因为它花了一些力气才做出来并且不想重做它。我希望能够快速裁剪掉那颗星并将其分离成自己的图像(因为我使用的是没有图层的油漆)

但我知道带有恒星的图像只是没有恒星的图像的微小变化,所以理想情况下,如果我可以比较两个图像并移除恒星周围的像素,那么我可以让我的恒星回来。 / p>

有没有这样做呢? 或者是我不知道的现有工具提供的一些技术?

1 个答案:

答案 0 :(得分:0)

假设您有原始图像,您可以将两个图像读入您的程序并查看每个像素以查看它们是否是相同的值,如果它们然后将它们设置为黑色,如果不是,请将它们保持原样;你得到的图像应该只有在其中发生变化的像素,其余的是黑色。

这可能会让您在“星星”本身内出现问题,因为星星中可能存在与原始图像上的点相同的点(即两个图像上两个位置的像素可能都是绿色的)。在这种情况下,您可以查看周围的像素以提供帮助。

即:

Bitmap originalBMP = new Bitmap(Bitmap.FromFile("[File-Name-No-Star]"));
Bitmap starBMP = new Bitmap(Bitmap.FromFile("[File-Name-With-Star]"));
Bitmap finalBMP = new Bitmap(starBMP.Size.Width, starBMP.Size.Height);

for( int row = 0; row < starBMP.Size.Width; row++)
{
    for( int col = 0; col < starBMP.Size.Height; col++)
    {
        if (originalBMP.GetPixel(row, col).Equals(starBMP.GetPixel(row, col)))
        {
            finalBMP.SetPixel(row, col, Color.Black);
        }
        else
        {
            finalBMP.SetPixel(row, col, starBMP.GetPixel(row, col));
        }
    }

}
finalBMP.Save("[NEW-FILE-NAME]");

此代码不会查看星形图像中与非星形图像的相同位置中的相同值对应的像素问题。有几种技术可以解决这个问题,但请记住,如果你正在查看相邻的像素,你可能会遇到问题。