Java 比较两个缓冲区图像之间像素值的最快方法?

Java 比较两个缓冲区图像之间像素值的最快方法?,java,rgb,bufferedimage,java-2d,Java,Rgb,Bufferedimage,Java 2d,我有一个类型为_INT _BGR的BuffereImage。我需要对另一个BuffereImage进行逐像素比较,以计算两个图像之间的“距离”。我有一些东西可以用,但是很慢。我从“参考”图像中获取一个像素,用以下方法将其分解为RGB字节: int pixel = referenceImage.getRGB(col, row); int red = (pixel >> 16) & 0xff; int green = (pixel >> 8

我有一个类型为_INT _BGR的BuffereImage。我需要对另一个BuffereImage进行逐像素比较,以计算两个图像之间的“距离”。我有一些东西可以用,但是很慢。我从“参考”图像中获取一个像素,用以下方法将其分解为RGB字节:

    int pixel = referenceImage.getRGB(col, row);
    int red   = (pixel >> 16) & 0xff;
    int green = (pixel >> 8) & 0xff;
    int blue  = (pixel) & 0xff;
我将r/g/b值与候选图像的对应像素进行比较,并将差异的平方相加

有没有更快的方法来进行这种比较?查看JRE源代码,我发现BuffereImage.getRGB()实际上是将光栅中的组成RGB值ORing在一起,这对于我来说是浪费,因为我只是再次将其分解为字节


我将直接尝试这样做,但我想知道是否有更好的方法,通过Java或第三方API这样做,我可能错过了。

如果两幅图像使用相同的颜色模型和采样,您可以在光栅的DataBuffer上执行比较,这会快一点。

从VolatileImage读取数据不会快一点。使VolatileImages“更快”的是,它们使用加速(VRAM)内存而不是系统(RAM)内存来绘制图像。但是,在执行读取操作时,它可能需要通过另一条总线访问内存,并且在这些操作中比系统内存慢


比较BuffereImage的最快方法是使用整数比较,就像您在文章中讨论的那样,但正如您提到的,出于性能原因,您不能使用getRGB。您可以将一批像素放入一个数组中,但总体而言,您可能只需查看光栅和数据缓冲区即可获得性能。

您是否考虑过使用Java2D创建一个新图像,作为两个图像之间的差异,然后改为分析差异图像


我最初的方法是使用图像A的负片并添加图像B。

如果分解为字节+加载额外类是问题所在,请尝试以下方法:

从RGB像素值获取BuffereImage值

img = 65536*R + 256*G + B - 16777216;  
从缓冲区图像值img获取RGB值

R=  Math.round((((371*img)+24576000000) / 96000000)
G=  Math.round((65536 + 0.003906*img - 256*R));
B=  Math.round((65536*R + 256*G -img - 16777216));
我不确定这是否是一种更好/更快的方法,但它是另一种不使用任何额外类的替代方法,并且是一个直接的数学过程(或黑客)。。。这在某些情况下可能很有用(请仔细检查,因为这是我自己的方法,我没有足够的时间玩)


我不知道你需要在像素值之间进行什么样的比较,所以这是这篇文章的重点。。。我希望有人真的觉得这很有帮助

是的,两幅图像使用相同的颜色模型和采样。据推测,使用DataBuffer时,我仍然需要进行位移位,但可能至少避免将值重新存储在一起;一个是从JPG读入的,另一个是从图形2D绘制而成的。我以前从未使用过VolatileImage,我会检查一下;这是个坏建议。我把它删掉了。遗憾的是,我不能否决我的答案。这似乎是个好主意,但我没有太多运气找到例子。我假设我需要实现java.awt.CompositeContext。我看到的唯一实现是SunCompositeContext,不幸的是没有提供源代码。