сглаживание изображения в c

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

У кого-нибудь есть идеи?


person DatDudeJC    schedule 30.09.2012    source источник
comment
Я удивлен, что ваша программа не обнаруживает ошибок при сглаживании углов и полей; это должны быть особые случаи, к которым нужно относиться по-разному.   -  person Coral Doe    schedule 03.10.2012
comment
@coraldoe, я исправил большую часть программы, моя единственная проблема сейчас в том, что я не могу исправить проблемы с границами для правого поля и 2 правых углов.   -  person DatDudeJC    schedule 04.10.2012


Ответы (1)


похоже, что вы получаете доступ к [m][..] и [..][n] (поскольку вы зацикливаете, например, i ‹ 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) на этапе назначения

person Asaf David    schedule 30.09.2012
comment
Я не уверен, что полностью понимаю, о чем вы говорите, не могли бы вы указать, что вы имеете в виду в приведенном выше коде? - person DatDudeJC; 30.09.2012
comment
Хорошо, у меня программа работает по большей части, но, возможно, я поступил немного странно. Теперь я могу вернуть значения для числа в верхнем левом углу, левой части чисел и среднего набора чисел, но я могу сделать это только по отдельности. Есть ли способ объединить 3 набора в одну матрицу (в конце концов мне нужно будет объединить 9 наборов) или я сделал это совершенно неправильно? - person DatDudeJC; 02.10.2012