我目前正在尝试将一段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 [])可以在同一个文件中反向使用吗?如果我使用原始图像的反转版本重新运行此代码,我应该从程序的开头获取原始输入/图像吗?我认为唯一的问题是运行之间的最小值会发生变化。
答案 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]
,其数据范围从0
到1023
。让我们假设您的所有数据点都是1023
。然后min
为1023
,因此所有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);
。