如何在java中将int转换为uint8
我用Matlab编写了一个图像过滤器,我想把它翻译成java,以便使用我的android应用程序。如何将short或int转换为uint8数据格式 顺便说一句:我知道java中没有像uint8这样的类型 任何帮助都将不胜感激 Matlab:如何在java中将int转换为uint8,java,matlab,int,type-conversion,Java,Matlab,Int,Type Conversion,我用Matlab编写了一个图像过滤器,我想把它翻译成java,以便使用我的android应用程序。如何将short或int转换为uint8数据格式 顺便说一句:我知道java中没有像uint8这样的类型 任何帮助都将不胜感激 Matlab: for iX = 1:imageX for iY = 1:imageY x(1:3) = input(iX,iY,:); output(iX, iY, :) = uint8(p1.*x.^5 + p2.*x.^4 +
for iX = 1:imageX
for iY = 1:imageY
x(1:3) = input(iX,iY,:);
output(iX, iY, :) = uint8(p1.*x.^5 + p2.*x.^4 + p3.*x.^3 + p4.*x.^2 + p5.*x + p6);
end
end
for (int iX = 0; iX < width; iX++) {
for (int iY = 0; iY < height; iY++) {
Arrays.fill(x, bitmap.getPixel(iX, iY));
short total = 0;
for (int i = 0; i < 3; i++) {
total +=p1[i] * Math.pow(x[i], 5) + p2[i]
* Math.pow(x[i], 4) + p3[i] * Math.pow(x[i], 3)
+ p4[i] * Math.pow(x[i], 2) + p5[i] * x[i] + p6[i];
}
output.setPixel(iX, iY, total);
}
}
Java:
for iX = 1:imageX
for iY = 1:imageY
x(1:3) = input(iX,iY,:);
output(iX, iY, :) = uint8(p1.*x.^5 + p2.*x.^4 + p3.*x.^3 + p4.*x.^2 + p5.*x + p6);
end
end
for (int iX = 0; iX < width; iX++) {
for (int iY = 0; iY < height; iY++) {
Arrays.fill(x, bitmap.getPixel(iX, iY));
short total = 0;
for (int i = 0; i < 3; i++) {
total +=p1[i] * Math.pow(x[i], 5) + p2[i]
* Math.pow(x[i], 4) + p3[i] * Math.pow(x[i], 3)
+ p4[i] * Math.pow(x[i], 2) + p5[i] * x[i] + p6[i];
}
output.setPixel(iX, iY, total);
}
}
for(int-iX=0;iX
这是java的一个不幸限制。这就是我要做的
字节编写自己的加法包装。这会很慢,所以我会选择1。另一种方法是在操作期间强制转换为不同的数据类型。例如,在将截断版本序列化为字节数据类型之前使用int李>
看
编译器将为您进行转换:
int value = 115;
byte transformed = (byte) value;
// value == transformed => true
警告:如果将int转换为字节,可能会丢失3*8位信息:
int value2 = 357;
byte transformed2 = (byte) value2;
// value2 == transformed2 => false
不要创建total
。在matlab中,可以分别处理每个颜色分量。在java中执行同样的操作:
for (int iX = 0; iX < width; iX++) {
for (int iY = 0; iY < height; iY++) {
Arrays.fill(x, bitmap.getPixel(iX, iY));
// Result color components.
int[] res = new int[3];
short total = 0;
for (int i = 0; i < 3; i++) {
res[i] = p1[i] * Math.pow(x[i], 5) + p2[i]
* Math.pow(x[i], 4) + p3[i] * Math.pow(x[i], 3)
+ p4[i] * Math.pow(x[i], 2) + p5[i] * x[i] + p6[i];
// Make sure final value is in range [0, 255]
res[i] = Math.min(255, Math.max(0, res[i]));
}
output.setPixel(iX, iY, Color.rgb(res[0], res[1], res[2]);
}
}
for(int-iX=0;iX
java中没有未签名的数据类型,因此您必须使用其中的一种
int,char,short,byte.
在java中,这些都是有符号的数据类型,但在将一个数据类型值分配给另一个数据类型值时,请记住类型转换规则。在java中使用较长的类型,例如,short
uint8
,int
uint16
,long
uint32
或者对32位以下的所有无符号类型使用int
,对32位使用long
:
当您对其进行操作时,最后执行操作:
int i = 256 & 0xff; //uint8
int i = 65536 & 0xffff; //uint16
long i = (long) Math.pow(2, 32) & 0xffffffff; //uint32;
// And So on
有点“浪费”因为它总是使用一半的类型长度。但在大多数情况下,这不会是一个严重的问题。java中的8位int是字节。您当前的java实现不起作用?@thang但它是有符号的。因此它可能会引起麻烦。不幸的是,java中total的值与matlab不同。@thang不!不!不!不!java中的8位int是有符号的!您能给出吗请举一个例子,原因是:java.lang.IllegalArgumentException:预期arg[0]为uint8,但如果提供了int32,则当尝试在tensorflow中执行此操作时,它不起作用。