反转图像像素

时间:2017-04-13 18:50:09

标签: java matlab image-processing

我目前正在尝试将一段matlab代码转换为java。该代码的目的是反转和标准化图像文件的图像像素。在java中,像素存储在字节数组中。以下是重要的Matlab代码:

inp2=1024.-inp.-min; %inp is the input array (double precision). min is the minimum value in that matrix.

图像为16位,但仅使用10位存储,因此1024来自(2 ^ 10)。我明确知道这段代码在matlab中有效。但是,我个人并不精通matlab,而且我的java翻译行为与其对应的行为方式不同。

以下是我尝试反转图像矩阵的方法:

//bitsStored is the bit depth. In this test, it is 10.
//imageBytes is the pixel data in a byte array
public static short[] invert(int bitsStored) {
    short min = min(imageBytes);//custom method. Gets the minimum value in the byte array. 
    short range = (short) (2 << bitsStored);
    short[] holder = new short[imageBytes.length];
    for (int i = 0; i < imageBytes.length; i++) {
        holder[i] = (short) (range - imageBytes[i] - min);
    }
    imageBytes = holder;
    return imageBytes;
}

然而,图像不是反转颜色通道,而是丢失了一些数据并变得更加苛刻(更高的对比度,更少的混合等)。我在这里做错了什么?

如果我能为你做更清楚的事,请告诉我。谢谢。

更新: 嗨,我有关于此代码的另一个问题。上面的代码(固定为short [] not byte [])可以在同一个文件中反向使用吗?如果我使用原始图像的反转版本重新运行此代码,我应该从程序的开头获取原始输入/图像吗?我认为唯一的问题是运行之间的最小值会发生变化。

3 个答案:

答案 0 :(得分:4)

byte的范围是-128到127,它不能容纳1024个不同的值。因此,您需要使用更宽的类型(如short)来为点建模,或者在处理之前必须解压缩字节数组。

还有一件事:double是浮点数,并且在其余代码中使用的整数不能很好地运行。以下似乎更好:

short range = 1 << bitsStored; // 2^bitsStored

答案 1 :(得分:2)

反演的正确方程是:

 newValue[i] = maxPossibleValue - currentValue[i]

您的maxPossibleValue是1024。

另外一点是你不能在字节数组中有10位深度的图像(因为它们有8位)

答案 2 :(得分:1)

关于算法可逆性的第二个问题。

您的公式看起来像result[i] = 1024 - min(data) - data[i],其数据范围从01023。让我们假设您的所有数据点都是1023。然后min1023,因此所有result[i]都为-1022

因此result甚至不能与data在同一范围内。

然后,如果您使用result数组生成算法以生成result1,则其所有点都将为1024 - (-1022) - (-1022),即3068,而不是原始{{1} }}

所以答案不是,这个算法的双重应用不会产生与输入相等的结果。

请注意,另一个答案(1023)中提到的算法会保留范围,并且在应用两次时会反转。

顺便说一下,它应该是

maxPossibleValue - currentValue[i]

而不是

short range = (short) (1 << bitsStored);

生成short range = (short) (2 << bitsStored);