用于图像压缩的C#预测编码

时间:2011-04-11 23:01:47

标签: c# image-processing encoding

我一直在使用霍夫曼压缩图像来减小尺寸,同时保持无损图像,但我还读到你可以使用预测编码通过减少熵来进一步压缩图像数据。

据我所知,在无损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的各种像素。在某些情况下,这会相当减少熵。这是一个截图:

enter image description here

1 个答案:

答案 0 :(得分:3)

是的,只是截断。无关紧要,因为你存储差异。它减少了熵,因为你只存储了很小的值,其中很多都是-1,0或1.你的代码片段中有几个一对一的错误。