图像处理--行程编码

来源:互联网 发布:淘宝主图尺寸怎么修改 编辑:程序博客网 时间:2024/06/05 05:39
   最近做一个远程协助的系统,涉及了图像处理,本文讲讲图像编码--行程编码。图像编码方法有很多,而且比行程编码好的也不少,但由于水平有限,我主要是选用了无失真的行程编码。
一、图像编码必要性
  虽然现在已经把真彩图像转化为256色图片,体积已经减少到1/3,但就一个1024×768桌面的来说也有768.8kB的体积,所以要进一步把图像压缩,编码。为了能达到更快的计算速度,降低图像发送端的负担,所以采用算法简单、运算速度快的行程编码方法编码。
二、行程编码介绍
  行程编码的基本思想:将一行中颜色值相同的相邻象素用一个计数值和该颜色值来代替。例如aaabccccccddeee可以表示为3a1b6c2d3e。如果一幅图象是由很多块颜色相同的大面积区域组成,那么采用行程编码的压缩效率是惊人的。然而,该算法也导致了一个致命弱点,如果图象中每两个相邻点的颜色都不同,用这种算法不但不能压缩,反而数据量增加一倍。
  行程编码的可行性讨论:行程编码的压缩方法对于自然图片来说是不太可行的,因为自然图片像素点错综复杂,同色像素连续性差,如果硬要用行程编码方法来编码就适得其反,图像体积不但没减少,反而加倍。鉴于计算机桌面图,图像的色块大,同色像素点连续较多,所以行程编码对于计算机桌面图像来说是一种较好的编码方法。行程编码算法特点:有算法简单、无损压缩、运行速度快、消耗资源少等优点。
三、行程编码的实现
(1)、实现描述
  我们要编码的是256色位图,而256色位图的调色板里的数据连续性很差,所以我们对调色板后面的图像数据进行编码,调色板数据不纳入编码内容。另外设最大行程为255,一个字节。

即编码前文件与编码后文件结构对比:


实现代码:

#include "windows.h"
#include <stdlib.h>

/*************************************************************
行程编码:
          pData0  源数据指针
          size0   源数据长度
          pData1  编码后数据指针
          return long 编码后数据长度
***************************************************************/
long code(BYTE* pData0,long size0,BYTE* pData1)
{
    BYTE pix0,pix1;
    BYTE Count=0;
    BYTE* pIndex=pData1;
    pix0=pData0[0];

    for(long i=0;i<size0;i++)
    {
        Count++;
        pix1=pData0[i];
        if(pix1!=pix0)
        {
            *pIndex=Count-1;
            pIndex++;
            *pIndex=pix0;
            pIndex++;
            pix0=pix1;
            Count=1;
        }
        if(Count==255)
        {
            *pIndex=Count;
            pIndex++;
            *pIndex=pix0;
            pIndex++;
            pix0=pix1;
            Count=0;
        }
    }
    *pIndex=Count-1;
    pIndex++;
    *pIndex=pix0;

    return (1+pIndex-pData1);
}

/***************************************************************
行程解码:
          pData0  源数据指针
          size0   源数据长度
          pData1  解码后数据指针
          return long 解码后数据长度
***************************************************************/
long decode(BYTE* pData0,long size0,BYTE* pData1)
{
    BYTE pix;
    BYTE Count=0;
    BYTE* pIndex=pData1;

    for(long i=0;i<size0;i+=2)
    {
        Count=pData0[i];
        pix=pData0[i+1];
        for(BYTE j=0;j<Count;j++)
        {
            *pIndex=pix;
            pIndex++;
        }
    }

    return (1+pIndex-pData1);
}

四。测试例子

 

编码前图像

编码后图像

二次编码后图像

体积

787,456 字节

117,342字节

33,235 字节


(本文摘自我的07毕业论文)
原创粉丝点击