2

我在 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 + 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);
            }
        }
4

5 回答 5

3

在 Java 中使用较长的类型,例如short<-> uint8int<-> uint16long<-> uint32

或者仅int用于 32 位以下和 32 位的所有无符号类型long

当你对其进行操作时,&最后执行操作:

int i = 256 & 0xff;                             //uint8
int i = 65536 & 0xffff;                         //uint16
long i = (long) Math.pow(2, 32) & 0xffffffff;   //uint32;
// And So on

有一个“有点浪费”,因为它总是使用类型长度的一半。但在大多数情况下,这不会是一个严重的问题。

于 2013-01-18T09:18:21.163 回答
1

这是 java 的一个不幸的限制。这就是我会做的。

  1. 不要担心大小,使用 char 或 int
  2. 编写您自己的附加包装器,以byte使用位掩码检查符号。这会很慢,所以我会选择#1。另一种方法是在操作期间强制转换为不同的数据类型。例如在将截断版本序列化为字节数据类型之前使用 int。
  3. 请参阅是否有用于无符号数字类型包装器的 Java 库?
于 2013-01-18T08:50:00.040 回答
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]);
        }
    }
于 2013-01-18T08:53:17.403 回答
0

编译器将为您进行转换:

int value = 115;
byte transformed = (byte) value;
// value == transformed => true

警告:如果将 int 转换为字节,则可能会丢失 3 * 8 位信息:

int value2 = 357;
byte transformed2 = (byte) value2;
// value2 == transformed2 => false
于 2013-01-18T08:51:22.020 回答
0

java中没有无符号数据类型,所以你必须选择其中一种

int,char,short,byte.

这些都是 java 中的签名数据类型,但请记住类型转换规则,同时将一种数据类型值的值分配给另一种数据类型值。

于 2013-01-18T09:00:50.767 回答