用Java计算两个ARGB整数之间的差异的最快方法?

| 给定一个来自DataBuffer的int,其中将ARGB数据与掩码一起打包 A = 0xFF000000 R = 0xFF0000 G = 0xFF00 B = 0xFF 我正在执行以下操作,但想知道Java中是否没有更快的方法?
        DataBuffer db1 = img1.getData().getDataBuffer();
        DataBuffer db2 = img2.getData().getDataBuffer();

        int x, y;
        int totalDiff = 0;
        for (int i = 0; i < WIDTH * HEIGHT; ++i) {
            x = db1.getElem(i);
            y = db2.getElem(i);

            totalDiff += Math.abs((x & 0xFF) - (y & 0xFF))
                       + Math.abs(((x & 0xFF00) >> 8) - ((y & 0xFF00) >> 8))
                       + Math.abs(((x & 0xFF0000) >> 16) - ((y & 0xFF0000) >> 16 ));
        }
    
已邀请:
如果您确实需要提高速度,则可以检查ѭ​​1ѭ的类型并为具体类型提供优化的代码,以便将调用保存到
getElem(i)
。这将加速您的代码。 像这样:
    DataBuffer db1 = img1.getData().getDataBuffer();
    DataBuffer db2 = img2.getData().getDataBuffer();

    int totalDiff = 0;
    int x, y;
    if (db1 instanceof DataBufferInt && db2 instanceof DataBufferInt) {
        int[] data1 = ((DataBufferInt) db1).getData();
        int[] data2 = ((DataBufferInt) db2).getData();
        for (int i = 0; i < WIDTH * HEIGHT; ++i) {
            x = data1[i];
            y = data2[i];

            totalDiff += Math.abs((x & 0xFF) - (y & 0xFF))
                + Math.abs(((x & 0xFF00) >> 8) - ((y & 0xFF00) >> 8))
                + Math.abs(((x & 0xFF0000) >> 16) - ((y & 0xFF0000) >> 16));
        }
    } else {
        for (int i = 0; i < WIDTH * HEIGHT; ++i) {
            x = db1.getElem(i);
            y = db2.getElem(i);

            totalDiff += Math.abs((x & 0xFF) - (y & 0xFF))
                    + Math.abs(((x & 0xFF00) >> 8) - ((y & 0xFF00) >> 8))
                    + Math.abs(((x & 0xFF0000) >> 16) - ((y & 0xFF0000) >> 16));
        }
    }
编辑: 另一个可以为您带来更高速度的想法。如果仅是一种试探法,则可能足以计算图像的“降采样”版本的差异。将
++i
替换为ѭ5,并将速度提高10倍。当然,这是否有意义取决于图像的类型。 编辑: 在您提到的一个评论中,它是GA的适应度函数...在这种情况下,从图像中抓取100个(或仅10个)随机位置并比较该位置的像素可能就足够了。提高的速度极有可能超过准确性的损失。     

bab

同意@Arne。 您也可以删除转移权
(x & 0xFF0000) >> 16) - ((y & 0xFF0000) >> 16 ). 
您知道
abs(XX0000 - YY0000)
只会在0-255范围内。 如果您可以提出要确定的内容,这将会有所帮助? 也就是说,像素信息是否可以更有利于存储您想要达到的目标,例如色度(YUV,YCrCb)?     
如果您可以计算平方和,那么它会更快:
    for (int i = 0; i < WIDTH * HEIGHT; ++i) {
        x = db1.getElem(i);
        y = db2.getElem(i);
        int dr = ((x & 0xFF0000) >> 16) - ((y & 0xFF0000) >> 16 );
        int dg = ((x & 0xFF00) >> 8) - ((y & 0xFF00) >> 8);
        int db = (x & 0xFF) - (y & 0xFF);
        totalDiff += dr*dr + dg*dg + db*db;
    }
    

要回复问题请先登录注册