【问题标题】:Invert image pixels反转图像像素
【发布时间】:2017-04-18 14:04:58
【问题描述】:

我目前正在尝试将一段 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[]而不是byte[])可以在同一个文件上反向使用吗?如,如果我使用原始图像的反转版本重新运行此代码,我应该从程序开始获取原始输入/图像吗?我认为唯一的问题是运行之间的最小值会发生变化。

【问题讨论】:

    标签: java matlab image-processing


    【解决方案1】:

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

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

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

    【讨论】:

    • 太棒了!这似乎奏效了。如果我有更多问题,我会再做一些测试和评论。谢谢你:)。
    • 您好,我不知道您是否还在,但我想知道您是否可以为我回答另一个关于此的问题。上面的代码(假设short[]不是byte[])可以在同一个文件上反向使用吗?如,如果我使用原始图像的反转版本重新运行此代码,我应该从程序开始获取原始输入/图像吗?我认为唯一的问题是运行之间的最小值会发生变化。
    • 我已经发布了另一个答案,评论太长了
    【解决方案2】:

    反演的正确方程是:

     newValue[i] = maxPossibleValue - currentValue[i]
    

    您的maxPossibleValue 是 1024。

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

    【讨论】:

    • 让我解决这个问题。从技术上讲,它是 16 位的,但它只使用了其中的 10 个。
    【解决方案3】:

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

    您的公式类似于result[i] = 1024 - min(data) - data[i],其中数据范围从01023。假设您所有的数据点都是1023。那么min就是1023,所以所有的result[i]都是-1022

    所以result 甚至不适合与data 相同的范围。

    然后,如果您使用 result 数组运行算法以生成 result1,则它的所有点都将是 1024 - (-1022) - (-1022)3068,而不是原始的 1023

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

    请注意,另一个答案(maxPossibleValue - currentValue[i])中提到的算法保持范围,并且在应用两次时会反转。

    顺便说一句,应该是

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

    而不是

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

    生成2^bitsStored

    【讨论】:

      猜你喜欢
      • 2018-05-03
      • 1970-01-01
      • 2020-07-26
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多