精华内容
下载资源
问答
  • 对英文文本文件进行哈夫曼编码译码的C++实现 以及压缩率计算哈夫曼编码压缩原理:由于每个字符在内存中都是以ASCII码进行存储,所以每个字符都占用了八个01位,利用哈夫曼树对每个字符进行01编码,根据字符在文章中...

    哈夫曼编码压缩原理:由于每个字符在内存中都是以ASCII码进行存储,所以每个字符都占用了八个01位,利用哈夫曼树对每个字符进行01编码,根据字符在文章中出现的频率调整01串长度,出现频率高的字符在哈夫曼树中的权重大,编码后01串短,从而使得最终计算出的平均编码长度小于8,在本代码中平均编码长度约为4.72,压缩率约为59%,从而达到压缩文本的目的。

    // HuffmanEncode.cpp: 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include<string>
    int length;  //文章长度
    //定义结构体统计单个字符出现次数
    struct Char_Frequency
    {
        char c;
        int Frequency;
    };
    Char_Frequency a[10000];   //建立结构体数组 存储每个字符的出现次数
                               /*从文本文件中统计各字符出现次数*/
    void Char_Probability_Fromfile(FILE *fp)
    {
        length = 0;
        for (int i = 0; i < 100; i++)   //对结构体数组初始化
        {
            a[i].c = NULL;
            a[i].Frequency = 0;
        }
        char ch;
        while (fscanf(fp, "%c", &ch) == 1)
        {
            length++;
            int i = 0, flag = 0;
            while (a[i].c != NULL)
            {
                if (a[i].c == ch)
                {
                    a[i].Frequency++;
                    flag = 1;
                }
                i++;
            }
            if (!flag)
            {
                a[i].c = ch;
                a[i].Frequency = 1;
            }
        }
    
    }
    /*哈夫曼树存储结构*/
    typedef struct {
        int weight;
        char c;
        int lchild;
        int rchild;
        int parent;
    }HTNODE;
    typedef HTNODE HuffmanT[10000];
    HuffmanT T;
    /*初始化哈夫曼树*/
    void InitHT()
    {
        for (int i = 0; i < 100; i++)
        {
            T[i].c = NULL;
            T[i].lchild = -1;
            T[i].rchild = -1;
            T[i].parent = -1;
            T[i].weight = NULL;
        }
    }
    /*为哈夫曼树加载权值*/
    void InputW(int n)
    {
        for (int i = 0; i < n; i++)
        {
            T[i].c = a[i].c;
            T[i].weight = a[i].Frequency;
        }
        for (int i = 0; i < n; i++)
        {
            printf("权重初始为:%c %ld\n", T[i].c, T[i].weight);
        }
    }
    /*找到两个最小权值节点*/
    void SelectMin(int n, int *p1, int *p2)
    {
    
        int i, j;
        for (i = 0; i < n; i++)
        {
            if (T[i].parent == -1)
            {
                *p1 = i;
                break;
            }
        }
        for (j = i + 1; j < n; j++)
        {
            if (T[j].parent == -1)
            {
                *p2 = j;
                break;
            }
        }
        for (i = 0; i < n; i++)
        {
            if ((T[*p1].weight > T[i].weight) && (T[i].parent == -1) && (*p2 != i))
                *p1 = i;
        }
        for (j = 0; j < n; j++)
        {
            if ((T[*p2].weight > T[j].weight) && (T[j].parent == -1) && (*p1 != j))
                *p2 = j;
        }
    }
    /*哈夫曼树构造算法,n为有权值的节点个数*/
    void CreateHT(int n)
    {
        int i, p1, p2;
        InitHT();
        InputW(n);
        for (i = n; i < 2 * n; i++)
        {
            SelectMin(i, &p1, &p2);
            T[p1].parent = T[p2].parent = i;
            T[i].lchild = p1;
            T[i].rchild = p2;
            T[i].weight = T[p1].weight + T[p2].weight;
        }
    
    }
    /*哈夫曼编码表的存储结构*/
    typedef struct {
        char ch;
        char bits[1000];
    }CodeNode;
    typedef CodeNode HuffmanCode[100000];
    HuffmanCode H;
    /*哈夫曼编码算法实现*/
    void CharSetHuffmanEncoding(int n)
    {
        int c, p, i;
        char cd[10000];
        int start;
        cd[n] = '\0';
        for (i = 0; i < n; i++)
        {
            H[i].ch = T[i].c;
            start = n;
    
    
            c = i;
            while ((p = T[c].parent) >0)
            {
                cd[--start] = (T[p].lchild == c) ? '0' : '1';
                c = p;
            }
            strcpy(H[i].bits, &cd[start]);
        }
    }
    char copy[100000000];
    /*编码写入文件*/
    void Encode(int n)
    {
        FILE *fp = fopen("D:\\test2.txt", "r");
        FILE *fp2 = fopen("D:\\test2w.txt", "w");
        char ch;
        while (fscanf(fp, "%c", &ch) == 1)
        {
            for (int i = 0; i < n; i++)
            {
                if (H[i].ch == ch)
                {
                    fprintf(fp2, "%s", H[i].bits);
                    strcat(copy, H[i].bits);
                }
            }
        }
    }
    /*解码写入文件*/
    void Decode(int n)
    {
    
        FILE *fp = fopen("D:\\decode.txt", "w");
        int root,p, i, j = 0;
        p = root = 2 * n - 1;
        for (i = 0; i < strlen(copy); i++)
        {
            if (copy[i] == '0')
            {
                p = T[p].lchild;
            }
            else if (copy[i] == '1')
            {
                p = T[p].rchild;
            }
            if (T[p].lchild == -1 && T[p].rchild == -1)
            {
    
                fprintf(fp, "%c", T[p].c);
                p = root;
            }
        }
    
    
    }
    /*求压缩率*/
    void Encode_Rate(int n)
    {
        float WPL=0;
        for (int i = 0; i < n; i++)
        {
            WPL += (float)strlen(H[i].bits)*((float)((float)a[i].Frequency / (float)length));
        }
    
        printf("压缩率为:    %f\n", WPL/8.00);
    
    }
    
    
    
    
    int main()
    {
        FILE *fp = fopen("D:\\test2.txt", "r");
        Char_Probability_Fromfile(fp);
        int i = 0;
        while (a[i].c != NULL)
        {
            printf("%c %d      %d", a[i].c, a[i].c, a[i].Frequency);
            printf("\n");
            i++;
        }
        printf("i为:%d\n", i);
    
        CreateHT(i);
        int n = 0;
        while (T[n].weight != NULL)
        {
            printf("序号:%d  %c 权重:%d  父母:%d 左儿子:%d  右儿子:%d \n", n, T[n].c, T[n].weight, T[n].parent, T[n].lchild, T[n].rchild);
            n++;
        }
        printf("-------\n");
    
        CharSetHuffmanEncoding(i);
        n = 0;
    
        Encode(i);
        Decode(i);
    
        printf("\n");
        Encode_Rate(i);
    
    
    
    
    
        return 0;
    }
    
    

    附上运行结果图片:

    压缩译码前:这里写图片描述

    压缩译码后:这里写图片描述

    译码后,恢复原文:这里写图片描述

    这里写图片描述
    这里写图片描述
    这里写图片描述

    展开全文
  • 霍夫曼编码计算图片压缩率

    千次阅读 2020-07-08 21:01:49
    给定一个包含0,1,2,3像素值的灰度图像,其像素值的比例分别为70%,15%,12%,3%,求对其进行霍夫曼编码后相对于原始8bit存储的压缩率是多少? 记符号为 0, 1, 2, 3 频率为 0.75,0.15,0.12,0.03 按照下列步骤构造...

    给定一个包含0,1,2,3像素值的灰度图像,其像素值的比例分别为70%,15%,12%,3%,求对其进行霍夫曼编码后相对于原始8bit存储的压缩率是多少?

    记符号为 0, 1, 2, 3
    频率为 0.7,0.15,0.12,0.03
    按照下列步骤构造哈夫曼树:

    1. 将符号按频率排序,选取频率最小的两个符号("3"和"2")作为树的左右子节点
    2. 将 "3"和"2"的频率合并得0.15,重新对合并的结果进行频率排序
    3. 迭代1和2,得到哈夫曼树
    4. 将哈夫曼树各级左子树标记为0,右子树标记为1
    5. 得到哈夫曼编码为3:111,2:110,1:10,0:0

    在这里插入图片描述
    压缩率为
    1 − ( ( 0.03 ∗ 3 + 0.12 ∗ 3 + 0.15 ∗ 2 + 0.7 ∗ 1 ) / ( 0.03 ∗ 2 + 0.12 ∗ 2 + 0.15 ∗ 2 + 0.7 ∗ 2 ) ) = 0.275 1-((0.03*3+0.12*3+0.15*2+0.7*1)/(0.03*2+0.12*2+0.15*2+0.7*2))=0.275 1((0.033+0.123+0.152+0.71)/(0.032+0.122+0.152+0.72))=0.275

    展开全文
  • 实现行程编码压缩, 计算原图和压缩以后的尺寸,计算压缩率并比较分析; 结果???? Matlab代码???? clear I1=imread('01.jpg'); %转换为二值图像 J=rgb2gray(I1); I2=J(:); I2length=length(I2); ...

    Matlab-数字图像编码实验-无损编码/压缩算法实验

    代码链接:https://download.csdn.net/download/qq_43571150/12033273

    问题
    实现行程编码压缩, 计算原图和压缩以后的尺寸,计算压缩率并比较分析;

    结果👇
    在这里插入图片描述
    在这里插入图片描述
    Matlab代码👇

    clear
    I1=imread('01.jpg');
    
    %转换为二值图像
    J=rgb2gray(I1);
    I2=J(:);
    I2length=length(I2);
    figure,imshow(J);
    
    for i=1:1:I2length
        if I2(i)>=127
            I2(i)=255;
        else I2(i)=0;
        end
    end
    
    I3=reshape(I2,512,512);         %重建二维数组图像
    figure,imshow(I3);
    
    %对原图像进行行程编码
    X=I3(:);                        %令X为新建的二值图像的一维数据组
    x=1:1:length(X);                %显示行程编码之前的图像数据
    figure,plot(x,X(x));
    j=1;
    I4(1)=1;
    
    %行程编码程序段
    for z=1:1:(length(X)-1)
        if X(z)==X(z+1)
            I4(j)=I4(j)+1;
        else data(j)=X(z);          %data(j)代表相应的像素数据
            j=j+1;
            I4(j)=1;
        end
    end
    
    data(j)=X(length(X));           %最后一个像素数据赋值给data
    I4length=length(I4);            %计算行程编码后的所占字节数
    y=1:1:I4length;                 %显示编码后数据信息
    figure,plot(y,I4(y));
    CR=I4length/I2length;           %比较压缩前后的大小
    disp(['原图 Bit:                  ',num2str(I2length),' bit']);
    disp(['压缩图像 Bit:               ',num2str(I4length),' bit']);
    disp(['压缩率:                     ',num2str(CR)]);
    
    展开全文
  • 霍夫曼编码图像压缩

    2015-09-27 16:49:18
    一个运用霍夫曼编码对一幅灰度图像进行压缩的程序
  • 我使用DCT变换与行程编码进行图片压缩,具体过程是对Y U V三个分量进行量化与编码,请问图片的压缩率该如何去求,现在毫无头绪,请大神赐教
  • 哈夫曼树源代码,不同于流行的算法。数据结构课程相关。
  • 图像压缩率失真算法的研究
  • 数据压缩算法 - 数据压缩

    千次阅读 2020-11-02 17:58:48
    压缩比(压缩率的倒数) 压缩/解压缩需要资源(内存) 压缩/解压缩需要时间。 常用:https://www.cnblogs.com/tommyli/p/4350672.html 压缩:有损,无损,(可逆,非可逆) 压缩解压:对称,非对称 ...

    数据压缩算法,考虑点:

    压缩比(压缩率的倒数)

    压缩/解压缩需要资源(内存)

    压缩/解压缩需要时间。

     

    常用:https://www.cnblogs.com/tommyli/p/4350672.html

     

    压缩:有损,无损,(可逆,非可逆)

    压缩解压:对称,非对称

     

    常见的图片格式,都是使用了特定压缩算法的应用。

    一般来说,JPEG格式的文件是非可逆压缩,因此还原后有部分图像信息比较模糊。GIF 是可逆压缩

    mpeg

    几种压缩算法的速度比较:https://blog.csdn.net/leilonghao/article/details/73200859

     

    常用的压缩算法:

    LZO一个开源的无损压缩C语言库,其优点压缩和解压缩比较迅速占用内存小等特点(网络传输希望的压缩和解压缩速度比较快,压缩率不用很高)。压缩率(0.5%~50%)

     

    说明:

    同一个压缩算法,(例如LZO),对于不同类型文件,压缩比范围很大(压缩比差异很大)。

    展开全文
  • 文本: a b c a c a d b a c d...传统表示未压缩时: 0001100010001101001011001000001001001000 统计次数:a:9, b:5, c:4, d:2 前缀码表示:a: 0, b: 10, c:110, d:111 压缩后: 0101100110011110011011101000110100100
  • 用数据结构的Huffman编码来实现对文件进行压缩,是北邮数据结构的大作业!
  • 气体在给定温度和绝对压力下的近似压缩系数(通常表示为 Z)。 由范德华状态方程计算。... Z = 压缩率('甲烷',280,20) Z = 0.951 上面的示例显示,在280 K和20 bar下的甲烷偏离理想气体定律约4.9%。 ***********
  • 数字图像处理第八章——图像压缩

    万次阅读 2019-05-09 03:33:04
    数字图像处理第八章数字图像处理---图像压缩(一) 背景(二) 编码冗余2.1 霍夫曼码2.2 霍夫曼编码2.3 霍夫曼译码(三)空间冗余(四)不相关的信息(五)JPEG 压缩5.1 JPEG5.2 JPEG 2000(六)视频压缩6.1 MATLAB...
  • 对图片进行处理,计算主元并处理图片在不同主元下的图像,代码可以有效运行,含有图片,运行结果可靠,
  • 实现哈夫曼压缩, 计算原图和压缩以后的尺寸,计算压缩率并比较分析 结果???? Matlab代码???? clear; clear all; A=imread('01.jpg'); I=rgb2gray(A); [M,N] = size(I); I1 = I(:); P = zeros(1,256); ...
  • matlab灰度图像的DCT压缩计算PSNR
  • 从无机物质量不变出发,在考虑降解与密度变化的情况下,围绕垃圾土的密度、质量与体积三者关系,结合由自配试样进行降解试验获得的降解规律,推导了垃圾土一维降解压缩模型。研究结果表明,降解压缩量与初始时刻...
  • 图像压缩

    万次阅读 2016-08-03 10:39:08
    很多人都问我如何计算图像的压缩比,在这里我写下自己对压缩比的理解。 有损压缩和无损压缩(近无损)压缩比一般差很多。我主要做位图的无损压 缩,最好也就能达到2,不像做变换的,能有十几倍还多。  具体...
  • Huffman 编解码算法实现与压缩效率分析

    万次阅读 多人点赞 2017-05-14 14:35:42
    /* 由建立的 huffman 树对计算每个符号的码字. */ pSE = (SymbolEncoder*)malloc(sizeof(SymbolEncoder)); memset(pSE, 0, sizeof(SymbolEncoder)); build_symbol_encoder((*pSF)[0], pSE); return pSE; } ...
  • 计算土壤饱和导水的软件Neuro Theta,包含软件操作说明及步骤,同时压缩文件也有spaw土壤计算的说明及软件。。。
  • 所以图片压缩分三类:尺寸压缩最快成比例压缩(理论上可以压缩到接近无限小,你把他压缩到4个点了也没有什么物理意义了)、图像格式压缩(如:把bitMap转换为jpeg,PNG等图片格式)、图像品质压缩...
  • 压缩算法--PCA主成分分析

    千次阅读 2018-09-11 10:07:59
    样本特征个数太多就会增加课题的复杂性,导致运算量大,计算速度慢等。当样本的某些特征之间存在相关性的时候,说明这些特征反映此课题的信息有一定的重叠,那就需要降维了,PCA就是做降维的一种算法。应用PCA目的...
  • 压缩算法gorilla paper encoding原理

    千次阅读 热门讨论 2018-09-06 19:06:58
    压缩率测试 小结: 2019.5.23更新--源码: 引: 从之前研究TSM文件格式,发现float类型的value是以facebook的gorilla paper encoding的算法进行压缩。 当时没有去深究,现在把这个算法的详细逻辑给理出来. 这...
  • 压缩感知

    千次阅读 2018-10-07 21:26:43
    本文综述了压缩感知的理论框架及关键的技术问题,并着重介绍了压缩感知稀疏重构中的主流贪婪算法,通过算法实验分析了各种算法的重构性能。 压缩感知理论主要包括信号的稀疏表示,编码测量和信号...
  • mp4视频文件压缩率大概是多大?

    千次阅读 2020-10-30 11:38:05
    上一篇介绍了压缩率计算方法:一帧1920*1080的画面有多少比特,需要多大带宽观看是才不会卡顿? 这次从行测记录仪中找了几个mp4格式的视频文件研究一下。 先看下文件信息: 根据上面文件信息,我们知道这是一...
  • 浅析数据压缩算法

    千次阅读 2017-05-17 15:51:17
    数据压缩是减少信息传输量最经济直接的办法,所以这篇文章将讲解一些经典的数据压缩算法。 一 热身:基因组 对于生物学的基因研究中,A、C、T、G是是用来表示生物DNA的四种碱基,对基因序列的处理实际上是对这四种...
  • #计算字符频率,并将单个字符构建成单一节点 while i < count : buff [ i ] = f . read ( bytes_width ) if count_dict . get ( buff [ i ] , - 1 ) == - 1 : count_dict [ buff [ i ] ] ...
  • 本人收集的基于matlab的各种压缩算法程序,包括lzw,huffman,dpcm,diffcoding,jpeg等 (Based on a variety of compression algorithms matlab program I collected, including lzw, huffman, dpcm, diffcoding, ...
  • 通过实验数据分析和理论推导,提出了一种综合气体动力黏度和压缩因子影响及克氏效应的煤层瓦斯渗透率计算方法。通过比较传统的拟压力法计算结果,考虑克氏效应方法在理论上和数据处理结果上更合理、更准确。研究结果...
  • 我们提出了一种基于压缩感知(CS)的使用计算成像模式进行光谱成像的技术。 使用光纤光谱仪和空间光调制可同时获得光谱和空间信息,而无需进行机械扫描。 该方法可以高速,稳定,二次采样地采集标本中的光谱数据。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 139,437
精华内容 55,774
关键字:

压缩率计算