0

さて、ユーザーに列と行の数を入力させてから、出力に乱数行列を表示させ、その後に配列内のすべてのピクセルの平均フィルターを見つける平滑化された画像行列を表示させようとしています。今のところ、乱数行列を作成できるところまで持っていますが、平滑化された行列はすべて手に負えません。今私が書いたコードは、4つの近傍を持つ整数に焦点を合わせていますが、明らかに私は何か間違ったことをしました。

#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 smooth (int a[10][20], int m, int n)
 {

 int i,j;
 for (i=1;i<m;i++) 
{
    for (j=1;j<n;j++)
    {
        a[i][j]=a[i][j]=(a[i-1][j]+a[i][j-1]+a[i+1][j]+a[i][j+1])/4;
        printf("%4d",a[i][j]);
        }
        printf("\n");
 }
 }
 int main()
{

int a[10][20];
 int m,n;
 srand(time(NULL));
 //User input
 printf("please enter number of columns and rows");
 scanf("%d %d", &m,&n);
 fillArray(a,m,n);
 printarray (a,m,n);
 printf("The smoothed image is\n");
 smooth(a,m,n);
 getch();
return 0;
}

今、3と3を入力すると、次のようになります。

23 43 54
12 76 89
56 98 24

The smoothed image is
347373849493234343
12 23345345345
2132334565645645645

誰かアイデアがありますか?

4

1 に答える 1

0

乱数生成関数で初期化されていないa[m][..]およびa[..][n]にアクセスしているようです(たとえば、i <mでループし、i + 1にアクセスしているため)。

編集:値を割り当てると、各ループは0からm-1/n-1になります

for (i=0;i<m;i++)
      {
          for (j=0;j<n;j++)
          {
                           random=rand()%100;
                           a[i][j]=random;
                           }
                           }

ただし、これらの値を使用すると、各ループは1からm-1 / n-1になりますが、このループ内では、隣接セル(i-1、j-1、i + 1、j + 1)を使用します。

 for (i=1;i<m;i++) 
{
    for (j=1;j<n;j++)
    {
        a[i][j]=(a[i-1][j]+a[i][j-1]+a[i+1][j]+a[i][j+1])/4;
        }
 }
 }

これは、最後の反復(i = m --1)で、初期化されていないセルにアクセスすることを意味します。i+ 1 = mにアクセスするため、多次元配列は実際にはメモリ内の1次元配列であることに注意してください。これらの呼び出しのうち、実際には初期化されていない値に対するものではありませんが、一部は

これを修正するには、割り当て段階でm / n(m-1 / n-1ではなく)までループできます。

于 2012-09-30T04:26:29.047 に答える