2012-10-04 3 views
0

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

например, число с четырьмя соседями должно возвращать среднее из этих 4 соседей, а это не так. Число с 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 правильно во 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; 
} 
+0

@JTA haha ​​спасибо. Теперь, если бы вы могли исправить мою проблему, которую я имею, вы станете моим новым лучшим другом. – DatDudeJC

ответ

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) 
+0

Хммм ... Я этого не замечал, и, хотя он полезен, он все еще не исправил мою проблему. Это сводит меня с ума. – DatDudeJC

+0

Любые другие предложения? – DatDudeJC

1

Welp, казалось бы, что мы находимся в том же классе, потому что я в настоящее время работает над проектом (и я увидели ваш более ранний вопрос, когда вы процитировали его задание PDF дословно). Я еще не закончил его, но я знаю, что одна проблема заключается в том, что вы полностью настраиваете его и используете слишком много функций. Это должна быть одна сглаживающая функция с кучей операторов if. Опять же, я еще не закончил его, поэтому у меня нет кода, чтобы показать вам, но когда я это сделаю, я либо отредактирую этот пост, если это возможно (EDIT: возможно, вот что я сделаю) ,

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

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); } 
Смежные вопросы