如何解决用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个)随机位置并比较该位置的像素可能就足够了。提高的速度极有可能超过准确性的损失。
,同意@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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。