递归 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。您必须将当前子矩阵的x
和y
值添加到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期