递归 C 图像压缩算法

Posted

技术标签:

【中文标题】递归 C 图像压缩算法【英文标题】:Recursion C image compressor algorithm 【发布时间】:2017-10-19 07:13:32 【问题描述】:

我正在尝试完成一个简单的基本程序,该程序模仿用于使用递归进行图像压缩的算法。 我有一个 n x n 矩阵,其中 n 始终是 2 的幂。这是因为我们可以将矩阵拆分为 4 n/2 * n/2 其他矩阵。 有两种基本情况:

当矩阵为 1x1 时,只需返回该位置内的值。 当 n x n 块内的所有值都相等时,打印 1x,其中 x 是公共值

递归情况是当我们有不同的值时。在这种情况下,我们打印 0 并将矩阵划分为其他四个 n/2 x n/2 矩阵。

这些区域按顺时针顺序递归处理,从左上角区域开始。

例子:

8
..**....
..**....
**......
**......
........
........
......*.
......*.

答案:001.1*1.1*1.01.1.0*..*1.1.

我的问题是我的代码中缺少一个案例,因此我的答案与预期结果并不完全匹配。

这是我的代码:

void computeComressor(char** arr,int m,int x,int y)
    int i,j;
    int flag=1;
    char c=arr[x][y];
    if(m==1)
        printf("%c",c);
        return;
    
    for(i=x;i<m-x*y;i++)
        for(j=y;j<m-x*y;j++)
            if(arr[i][j]==c)
                continue;
            
            else
                flag=0;
                break;
            
        
    

    if(flag==1)
        printf("1%c",c);
    
    else
        printf("0");
        computeComressor(arr,m/2,x,y);
        computeComressor(arr,m/2,x,m/2);
        computeComressor(arr,m/2,m/2,m/2);
        computeComressor(arr,m/2,m/2,y);
    

【问题讨论】:

【参考方案1】:

您关于递归的computeCompressor() 参数似乎是错误的。如果您为 x 或 y 参数传递 m/2,它将基于与子矩阵的左上角不对应的递归级别产生 4、2 和 1。您必须将当前子矩阵的xy 值添加到m/2。但即使在这种情况下,您的代码也会以逆时针顺序遍历子矩阵。

这是我为 computeCompressor() 提出的修复建议,只做了一些额外的修改:

void computeComressor(char** arr, int m, int x, int y)
    int     i,j;
    char    c   = arr[x][y];
    int     hm  = m / 2;

    if (m==1) 
        printf("%c", c);
        return;
    

    for (i=x; i<x+m; i++) 
        for (j=y; j<y+m; j++) 
            if (arr[i][j] != c) 
                printf("1%c", c);
                return;
            
        
    

    printf("0");
    computeComressor(arr, hm, x + 0,    y + 0);
    computeComressor(arr, hm, x + hm,   y + 0);
    computeComressor(arr, hm, x + hm,   y + hm);
    computeComressor(arr, hm, x + 0,    y + hm);

【讨论】:

并没有真正按照你的方式工作,因为每个案例只给了我 1. ,但我从你的描述中发现了我实际上错在哪里。停止条件 m-x*y 是我的错误(除了我在使用递归时没有添加 m/2 而是在你在答案中指出之前我已经解决了)。

以上是关于递归 C 图像压缩算法的主要内容,如果未能解决你的问题,请参考以下文章

图像压缩基于matlab香农熵和差分进化算法多级图像阈值图像压缩含Matlab源码 2035期

图像压缩基于matlab香农熵和差分进化算法多级图像阈值图像压缩含Matlab源码 2035期

图像压缩基于matlab香农熵和差分进化算法多级图像阈值图像压缩含Matlab源码 2035期

低熵图像的良好压缩算法

毕设题目:Matlab图像压缩

JPEG压缩图像超分辨率重建算法