0

わかりました。平均フィルター付きの整数を使用して画像平滑化プログラムを作成しようとしています。どういうわけか、コーナー部分と上下の部分だけが正しく出ています。

たとえば、4つのネイバーを持つ数値は、それらの4つのネイバーの平均を返す必要がありますが、そうではありません。3つのネイバーを持つ数値は、それらの3つのネイバーの平均を返す必要があります。

ただし、これはコーナー値とトップボトム値に対してのみ機能します。辺と中央が正しく計算されていません。

please enter number of columns and rows
5 5
 1  83  92  66  38
87  27  98  36  80
54  55  33  97   5
26  93  40  79  55
21  34  54  85  25
The smoothed image is
85  40  82  55  73
14  89  51  81  20
71  38  83  24  76
73  40  68  64  52
30  56  53  52  70

最初の行列の1は隣接するものとして83と87を持ち、2番目の行列では正しく85を返すので、2番目の数値87は隣接するものとして1,27,54を持ちますが、平均として誤って14を返します。誰かが以下の私のコードを見て、編集または詳細な手順のいずれかでこれを修正してください。私はこれを何時間も見ていて、問題を理解できないようです。これを直していただければ、永遠に感謝いたします!

#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 c[10][20], int n, int m)
{
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;
          }
      }
  }
}
void middle(int a[10][20], int c[10][20], int n, int m)
{
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;
    }
}

}

void side1 (int a[10][20],int c[10][20], int n, int m)
{
int i,j;
 for (i=1;i<m-1;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; 
        } 
    }     
 }
}  
void corner2(int a[10][20], int c[10][20], int m, int n)
{
int i,j;
 for (i=0;i<m;i++) 
{
    for (j=0;j<n;j++)
    {

        if (i>=1 && j>=0){

           c[i][j]=(a[i-1][j]+a[i][j+1])/2;
        }
    }
 }
}               
void top (int a[10][20], int c[10][20], int m, int n)
{
int i,j;
 for (i=0;i<m;i++) 
{
    for (j=1;j<n-1;j++)
    {
        c[i][j]=(a[i][j-1]+a[i][j+1]+a[i+1][j])/3;
          }
    }
}


void bottom (int a[10][20], int c[10][20], int m, int n)
{
int i,j;
 for (i=1;i<m;i++) 
{
    for (j=1;j<n;j++)
    {
        c[i][j]=(a[i][j-1]+a[i-1][j]+a[i][j+1])/3;
    }
  }   
}
void side2(int a[10][20], int c[10][20], int m, int n)
{
   int i,j;
 for (i=1;i<m-1;i++) 
{
    for (j=0;j<n;j++)
    {
      c[i][n-1]=(0+0+a[i-1][j]+a[i+1][j]+a[i][j-1])/3;        
    }         
  } 
}     


void corner3(int a[10][20], int c[10][20], int m, int n)
{
int i,j;
 for (i=1;i<m;i++) 
{
    for (j=0;j<n;j++)
    {
        c[i][n-1]=(a[i-1][j]+a[i][j-1])/2;
        }
   }
} 
void corner4(int a[10][20], int c[10][20], int m, int n)
{
int i,j;
 for (i=0;i<m-1;i++) 
{
    for (j=0;j<n;j++)
    {
        c[i][n-1]=(a[i+1][j]+a[i][j-1])/2;
    }
  }
}                             
int main()
{

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



corner1(a,c,m,n);
side1(a,c,m,n);
middle (a,c,m,n);
corner2(a,c,m,n);
top(a,c,m,n);
bottom(a,c,m,n);
side2(a,c,m,n);
corner3(a,c,m,n);
corner4(a,c,m,n);
printarray(c,m,n);

getch();
return 0;
}
4

2 に答える 2

1

Welp, it would seem that we're in the same class, because I'm currently working on the same project (and I saw your earlier question where you quoted his assignment PDF word-for-word). I haven't finished it yet, but I know one problem is that you're setting it up completely wrong and using way too many functions. It should be one smoothening function with a bunch of if statements. Again, I haven't finished it yet, so I don't have any code to show you, but when I do I'll either edit this post if it's possible (EDIT: it's possible, so that's what I'll do).

edit: Alright, so I finally finished it. Freaking took me forever to realize that I was making the boundaries one space too big. Instead of posting the entire code, I'll just post the single smoothening function that should be used.

int smoothen(int mArray[100][100], int uX, int uY)  {

int tempArr[100][100];
int x, y;

for(x = 0; x < uX; x++)
{
    for(y = 0; y < uY; y++)
    {
        // Multiple if/else statements to test pixel location
        if ((x == 0) && (y == 0))
        {
            tempArr[x][y] = (mArray[x][y] + mArray[x+1][y] + mArray[x][y+1]) / 3;
        }
        else if ((x > 0 && x < uX-1) && (y == 0))
        {
            tempArr[x][y] = (mArray[x][y] + mArray[x+1][y] + mArray[x-1][y] + mArray[x][y+1]) / 4;
        }
        else if ((x == uX-1) && (y == 0))
        {
            tempArr[x][y] = (mArray[x][y] + mArray[x-1][y] + mArray[x][y+1]) / 3;
        }
        else if ((x == uX-1) && (y > 0 && y < uY-1))
        {
            tempArr[x][y] = (mArray[x][y] + mArray[x-1][y] + mArray[x][y+1] + mArray[x][y-1]) / 4;
        }
        else if ((x == uX-1) && (y == uY-1))
        {
            tempArr[x][y] = (mArray[x][y] + mArray[x-1][y] + mArray[x][y-1]) / 3;
        }
        else if ((x > 0 && x < uX-1) && (y == uY-1))
        {
            tempArr[x][y] = (mArray[x][y] + mArray[x+1][y] + mArray[x-1][y] + mArray[x][y-1]) / 4;
        }
        else if ((x == 0) && (y == uY-1))
        {
            tempArr[x][y] = (mArray[x][y] + mArray[x+1][y] + mArray[x][y-1]) / 3;
        }
        else if ((x == 0) && (y > 0 && y < uY-1))
        {
            tempArr[x][y] = (mArray[x][y] + mArray[x+1][y] + mArray[x][y+1] + mArray[x][y-1]) / 4;
        }
        else if ((x > 0 && x < uX-1) && (y > 0 && y < uY-1))
        {
            tempArr[x][y] = (mArray[x][y] + mArray[x+1][y] + mArray[x-1][y] + mArray[x][y+1] + mArray[x][y-1]) / 5;
        }

    }
}
printArray(tempArr, uX, uY);  }
于 2012-10-04T03:27:43.410 に答える
0

一部の関数で次元が切り替えられています。

void middle(int a[10][20], int c[10][20], int n, int m)
...
void side1 (int a[10][20],int c[10][20], int n, int m)
...
void corner2(int a[10][20], int c[10][20], int m, int n)
于 2012-10-04T00:26:56.180 に答える