C中的图像平滑问题

时间:2012-10-04 00:10:06

标签: c matrix smoothing

好吧所以我正在尝试使用带有均值滤波器的整数来编写图像平滑程序。出于某种原因,虽然只有角落部分和顶部,底部部分正确放置。

例如,具有四个邻居的数字应返回这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;
}

2 个答案:

答案 0 :(得分:1)

Welp,似乎我们在同一个班级,因为我目前正在处理同一个项目(我看到你之前的问题,你逐字引用他的作业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);  }

答案 1 :(得分: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)