Проблемы сглаживания изображения в C

Итак, я пытаюсь написать программу сглаживания изображений, используя целые числа со средним фильтром. По какой-то причине правильно выставлены только угловые и верхние нижние секции.

например, число с четырьмя соседями должно возвращать среднее значение этих четырех соседей, но это не так. Число с тремя соседями должно возвращать среднее значение этих трех соседей.

это работает только для угловых значений и верхних нижних значений. Стороны и середина не рассчитываются правильно.

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 в качестве соседей и правильно возвращает 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;
}

2 ответа

Похоже, что мы в одном классе, потому что я сейчас работаю над тем же проектом (и я видел ваш предыдущий вопрос, где вы цитировали его задание PDF дословно). Я еще не закончил, но я знаю одну проблему, что вы настраиваете его совершенно неправильно и используете слишком много функций. Это должна быть одна сглаживающая функция с кучей операторов if. Опять же, я еще не закончил, поэтому у меня нет никакого кода, чтобы показать вам, но когда я это сделаю, я либо отредактирую этот пост, если это возможно (РЕДАКТИРОВАТЬ: это возможно, так что я буду делать),

редактировать: Хорошо, так что я наконец-то закончил. Чокнутый взял меня навсегда, чтобы понять, что я делаю границы одного пространства слишком большими. Вместо публикации всего кода, я просто опубликую единственную функцию сглаживания, которую следует использовать.

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);  }

У вас есть размеры, включенные в некоторые функции:

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)
Другие вопросы по тегам