【问题标题】:C# predictive coding for image compression用于图像压缩的 C# 预测编码
【发布时间】:2017-11-20 23:10:42
【问题描述】:

我一直在对图像使用 Huffman Compression 以减小大小,同时保持无损图像,但我还读到您可以使用预测编码通过减少熵来进一步压缩图像数据。

据我了解,在无损 JPEG 标准中,每个像素都被预测为光栅顺序中已经遇到的相邻 4 个像素的加权平均值(上面三个,左边一个)。例如,尝试根据前面的像素 x 来预测像素 a 的值,该像素位于左侧以及 a 上方:

x x x
x a 

然后计算和编码残差(预测值和实际值之间的差异)。

但我没有得到的是,如果平均 4 个相邻像素不是 4 的倍数,你会得到一个分数,对吧?应该忽略那部分吗?如果是这样,8 位图像(保存在 byte[] 中)的正确编码是否类似于:

public static void Encode(byte[] buffer, int width, int height)
{
    var tempBuff = new byte[buffer.Length];

    for (int i = 0; i < buffer.Length; i++)
    {
        tempBuff[i] = buffer[i];
    }

    for (int i = 1; i < height; i++)
    {
        for (int j = 1; j < width - 1; j++)
        {
            int offsetUp = ((i - 1) * width) + (j - 1);
            int offset = (i * width) + (j - 1);

            int a = tempBuff[offsetUp];
            int b = tempBuff[offsetUp + 1];
            int c = tempBuff[offsetUp + 2];
            int d = tempBuff[offset];
            int pixel = tempBuff[offset + 1];

            var ave = (a + b + c + d) / 4;
            var val = (byte)(ave - pixel);
            buffer[offset + 1] = val;
        }
    }
}

public static void Decode(byte[] buffer, int width, int height)
{
    for (int i = 1; i < height; i++)
    {
        for (int j = 1; j < width - 1; j++)
        {
            int offsetUp = ((i - 1) * width) + (j - 1);
            int offset = (i * width) + (j - 1);

            int a = buffer[offsetUp];
            int b = buffer[offsetUp + 1];
            int c = buffer[offsetUp + 2];
            int d = buffer[offset];
            int pixel = buffer[offset + 1];

            var ave = (a + b + c + d) / 4;
            var val = (byte)(ave - pixel);
            buffer[offset + 1] = val;
        }
    }
}

我不明白这真的会如何减少熵?这将如何帮助进一步压缩我的图像,同时仍然保持无损?

多谢指教

编辑:

所以在玩了预测编码图像之后,我注意到直方图数据显示了很多 +-1 的各种像素。在某些情况下,这会大大降低熵。截图如下:

【问题讨论】:

    标签: c# image-processing encoding


    【解决方案1】:

    是的,只是截断。没关系,因为您存储了差异。它减少了熵,因为您只存储小值,其中很多是 -1、0 或 1。顺便说一句,您的 sn-p 中有几个不相干的错误。

    【讨论】:

    • 真的吗?你能指出哪些部分是分开的吗?那太好了:)另外,谈到-1值,我将如何处理负值?让它们循环到 255?
    • 好的,我现在明白了,你在避开边界。是的,让溢出。
    • 好的,我对直方图进行了快速比较,我明白你在说什么!我会张贴一张它的样子的照片。谢谢你的解释!
    猜你喜欢
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多