图像平滑在c

时间:2012-09-30 03:49:41

标签: c arrays image 2d smoothing

好吧,所以我试图让用户输入列数和行数,然后让输出显示一个随机数矩阵,然后是一个平滑的图像矩阵,它找到数组中每个像素的平均滤波器。现在我把它带到了可以给我一个随机数字矩阵的地方,但平滑的矩阵完全没有了。现在我编写的代码只关注有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

有人有任何想法吗?

1 个答案:

答案 0 :(得分:0)

看起来你访问了一个[m] [..]和一个[..] [n](因为你循环而i&lt; 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 请记住,多维数组实际上是内存中的一维数组,因此其中一些调用实际上不是未初始化的值,但有些是

要解决此问题,您可以在分配阶段循环直到m / n(而不是m-1 / n-1)