0

我正在编写一个使用均值滤波器来平滑图像的程序。现在我没有使用实际的图像,只是整数,我的问题是我可以获得左角数字的平均值,左侧数字的平均值以及中间数字的平均值,但是当它输出结果时,它不会输出回矩阵。

前任。要求用户输入行和列的数字:输入为 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;
}
4

1 回答 1

0

我可以想到两种解决方案:

  1. 将corner1、side1 和middle 存储在一个数组中。完成后将数组打印出来(而不是在corner1、side1 和中间)。

  2. 遍历每一行。在行上调用 side1,不打印换行符,在行上调用中间。由于大量调用(对于更大的图像),这会降低效率,并且不会重用您的 printarray 代码,因此我建议您使用选项 1。

于 2012-10-03T01:23:38.163 回答