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

私が頭のてっぺんから見ることができる2つの解決策があります:

  1. 配列にcorner1、side1、middleストアがあります。完了したら、(corner1、side1、middleの内側ではなく)配列を出力します。

  2. 各行を繰り返します。行のside1を呼び出し、改行を出力せず、行の中央を呼び出します。これは(大きな画像の場合)呼び出しが多いため、効率がやや低下し、printarrayコードを再利用しないため、オプション1を使用することをお勧めします。

于 2012-10-03T01:23:38.163 に答える