我在Matlab中编写了一个图像过滤器,我想将它翻译成java以便使用我的Android应用程序。如何将short或int转换为uint8数据格式。
BTW:我知道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 + 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);
}
}
答案 0 :(得分:3)
在Java中使用较长的类型,例如short
&lt; - &gt; uint8
,int
&lt; - &gt; uint16
,long
&LT; - &GT; uint32
或者只使用int
表示所有32位以下的无符号类型和long
32位:
当您对其进行操作时,请最后执行&
操作:
int i = 256 & 0xff; //uint8
int i = 65536 & 0xffff; //uint16
long i = (long) Math.pow(2, 32) & 0xffffffff; //uint32;
// And So on
有一点“浪费”,因为它总是使用一半的类型长度。但在大多数情况下,这不会是一个严重的问题。
答案 1 :(得分:1)
这是java的一个不幸的限制。这就是我要做的。
byte
编写您自己的附加包装器以检查符号。这将很慢,所以我会选择#1。另一种方法是在操作期间转换为不同的数据类型。例如在将截断版本序列化为字节数据类型之前使用int。 答案 2 :(得分:1)
不要创建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]);
}
}
答案 3 :(得分:0)
编译器将为您进行转换:
int value = 115;
byte transformed = (byte) value;
// value == transformed => true
警告:如果将int转换为字节,则可能会丢失3 * 8位信息:
int value2 = 357;
byte transformed2 = (byte) value2;
// value2 == transformed2 => false
答案 4 :(得分:0)
java中没有未签名的数据类型,因此你必须使用其中的一种
int,char,short,byte.
这些都是java中的签名数据类型,但请记住类型转换规则,同时将一个数据类型值的值分配给另一个。