我正在编写一个使用均值滤镜来平滑图像的程序。现在我没有使用实际图像,只是整数,我的问题是我可以得到左手角数的平均值,左侧数字的平均值,以及中间数字的平均值但是当它输出结果时,它不会输出回矩阵。
实施例。要求用户输入行和列的数字:输入为5和5 一个5x5矩阵出局
然后我会以自上而下的方式获得平均值的这些结果
50
50
71
65
61
48 64 57
59 26 61
43 63 20
我想要实现的输出是
50
71 48 64 57
65 59 26 61
61 43 63 20
显然,这不是一个完成的产品,因为我还没有为矩阵的其余部分编制平均值,但这种格式问题让我疯狂。
继承人代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
// function that randomly generates numbers
void fillArray(int a[10][20], int m, int n)
{
int random;
int i,j;
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
random=rand()%100;
a[i][j]=random;
}
}
}
// function that prints the first matrix of random numbers
void printarray (int a[10][20], int m, int n)
{
int i,j;
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
printf("%4d", a[i][j]);
}
printf("\n");
}
}
// function that finds the mean for any number and its 4 nieghbors
void corner1 (int a[10][20], int n, int m)
{
int c[10][20];
int i,j;
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
if (i<=0 && j<=0)
{
c[i][j]=(a[i+1][j]+a[i][j+1])/2;
printf("%4d",c[i][j]);
}
}
}
printf("\n");
}
void middle(int a[10][20], int n, int m)
{
int c[10][20];
int i,j;
for (i=1;i<m-1;i++)
{
for (j=1;j<n-1;j++)
{
c[i][j]=(a[i-1][j]+a[i][j-1]+a[i+1][j]+a[i][j+1])/4;
printf("%4d",c[i][j]);
}
printf("\n");
}
}
void side1 (int a[10][20], int n, int m)
{
int c[10][20];
int i,j;
for (i=1;i<m;i++)
{
for (j=0;j<n-1;j++)
{
if (i<=1&&j>=0)
{
c[i][j]=(0+0+a[i-1][j]+a[i+1][j]+a[i][j+1])/3;
printf("%4d",c[i][j]);
printf("\n");
}
}
}
}
int main()
{
int a[10][20];
int m,n;
srand(time(NULL));
//User input
printf("please enter number of rows and columns\n");
scanf("%d %d", &m,&n);
fillArray(a,m,n);
printarray (a,m,n);
printf("The smoothed image is\n");
side1(a,m,n);
corner1(a,m,n);
middle (a,m,n);
getch();
return 0;
}
答案 0 :(得分:0)
我可以从头脑中看到两种解决方案:
将corner1,side1和middle存储在数组中。完成后打印出阵列(而不是在corner1,side1和middle中)。
遍历每一行。在行上调用side1,不要打印换行符,在行上调用middle。这会因为大量调用(对于更大的图像)而效率稍低,并且不会重复使用printarray代码,因此我建议您使用选项1.