Проблемы сглаживания изображения в C
Итак, я пытаюсь написать программу сглаживания изображений, используя целые числа со средним фильтром. По какой-то причине правильно выставлены только угловые и верхние нижние секции.
например, число с четырьмя соседями должно возвращать среднее значение этих четырех соседей, но это не так. Число с тремя соседями должно возвращать среднее значение этих трех соседей.
это работает только для угловых значений и верхних нижних значений. Стороны и середина не рассчитываются правильно.
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;
}
2 ответа
Похоже, что мы в одном классе, потому что я сейчас работаю над тем же проектом (и я видел ваш предыдущий вопрос, где вы цитировали его задание 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); }
У вас есть размеры, включенные в некоторые функции:
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)