从两个图像中移除匹配的像素进行裁剪



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

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

然后我在正方形的中间画了一个星星,并填充了一些不同于正方形的颜色,并保存为另一个文件

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

但我知道有星星的图像只是没有星星的图像的一个小变化,所以理想情况下,如果我能比较两张图像并删除星星周围的像素,那么我就可以得到我的星星。

已经有这样的功能了吗?还是一些我不知道的现有工具提供的技术?

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

这可能会给你一个"星形"本身的问题,因为星形中可能有与原始图像上的点相同的点。一个像素可能在两个图像的两个地方都是绿色的)。在这种情况下,你可以看看周围的像素来帮助。

即:

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]");

这段代码没有考虑星图中像素在非星图的相同位置对应相同值的问题。有几种技术可以解决这个问题,但请记住,如果您正在查看相邻像素,您可能会在恒星的边界处遇到问题。

最新更新