2

私は Matlab で画像フィルターを作成し、Android アプリケーションを使用するために Java に変換したいと考えています。short または int を uint8 データ形式に変換するにはどうすればよいですか。

ところで:Javaにはuint8のような型がないことは知っています。

どんな助けでも大歓迎です。

マトラブ:

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

short<-> uint8int<-> uint16long< ->など、Java ではより長い型を使用しますuint32

またはint、32ビット未満および32ビットのすべての符号なしタイプに使用しlongます。

それを操作するとき&は、最後に op を実行します。

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

作成しないでください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 に答える
1

これは Java の残念な制限です。これが私がすることです。

  1. サイズを気にする必要はありません。char または int を使用してください。
  2. byteビット マスクを使用して符号をチェックする独自の加算ラッパーを記述します。これは遅いので、#1 を使用します。これに代わる方法は、操作中に別のデータ型にキャストすることです。切り捨てられたバージョンを byte データ型にシリアル化する前に int を使用するなど。
  3. 符号なし数値型ラッパー用の Java ライブラリはありますか?を参照してください。
于 2013-01-18T08:50:00.040 に答える
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には符号なしデータ型がないため、そのうちの1つを使用する必要があります

int,char,short,byte.

これらはすべてJavaの符号付きデータ型ですが、あるデータ型の値を別のデータ型の値に割り当てる際には、型変換規則に注意してください。

于 2013-01-18T09:00:50.767 に答える