0

好的,所以我正在尝试使用带有均值滤波器的整数编写图像平滑程序。出于某种原因,尽管只有角落部分以及顶部、底部部分正确推杆。

例如,一个有四个邻居的数字应该返回这 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 作为其邻居,并在第二个矩阵中正确返回 85,第二个数字 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,看起来我们在同一个班级,因为我目前正在做同一个项目(我看到你之前的问题,你在其中逐字引用了他的作业 PDF)。我还没有完成它,但我知道一个问题是你设置的完全错误并且使用了太多的功能。它应该是一个带有一堆 if 语句的平滑函数。同样,我还没有完成它,所以我没有任何代码可以向您展示,但是当我这样做时,如果可能的话,我会编辑这篇文章(编辑:有可能,所以这就是我要做的) .

编辑:好的,所以我终于完成了。Freaking 让我永远意识到我把边界设置得太大了。我将只发布应该使用的单个平滑函数,而不是发布整个代码。

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 回答