Так у меня эта проблема в фильтре pset4 менее удобна. У меня как-то не получается размытие. Моя проблема в том, что кажется, что высота не l oop, поэтому единственное, что работает в моем коде, - это первая строка.
Мой код отлично работает для первой строки, но во второй строке нет изменений и скоро. Это похоже на то, что в моем коде есть функция break, чтобы она остановилась после первой строки. Я думал, что это мое условие в if (), и, возможно, я был сбит с толку в условии, но он не объясняет, почему оно не работает для нижнего левого и правого углов поля, условие настолько простое, что нет путаницы. Я имею в виду, давайте предположим, что мое состояние по краям и средней части пикселя неправильное, но оно все равно должно вычислить угол последней строки поля. Даже если с моим условием или формулой что-то не так, оно должно изменить значение пикселя RGB, но это не так.
:( размытие правильно фильтрует изображение 3x3
тестирование с образцом изображения 3x3
first row: (10, 20, 30), (40, 50, 60), (70, 80, 90)
second row: (110, 130, 140), (120, 140, 150), (130, 150, 160)
third row: (200, 210, 220), (220, 230, 240), (240, 250, 255)
Ожидаемый результат:
70 85 95
80 95 105
90 105 115
117 130 140
127 140 149
137 150 159
163 178 188
170 185 194
178 193 201
Фактический результат:
70 85 95
80 95 105
90 105 115
110 130 140
120 140 150
130 150 160
200 210 220
220 230 240
240 250 255
Вот код
void blur(int height, int width, RGBTRIPLE image[height][width])
{
// Copying the height and width length
int heilen = height;
int widlen = width;
int avgRed;
int avgGreen;
int avgBlue;
// Creating temporary array
int tmpR[height][width];
int tmpG[height][width];
int tmpB[height][width];
//storing the values of the image[i][j] to my temporary array
for (int i = 0; i < heilen; i++)
{
for (int j = 0; j < widlen; j++)
{
// storing the current images arrays to tmpRGB
tmpR[i][j] = image[i][j].rgbtRed;
tmpG[i][j] = image[i][j].rgbtGreen;
tmpB[i][j] = image[i][j].rgbtBlue;
}
}
for (height = 0; height < heilen; height++)
{
for (width = 0; width < widlen; width++)
{
//=================== PIXELS IN CORNERS
//upper left corner side of the box
if (height == 0 && width == 0)
{
//calculating the total values of the curreent row and pixel and current row and pixel + 1
float current_row_Red = tmpR[height][width] + tmpR[height][width + 1];
//calculating the total values of the next row current pixel and pixel + 1
float after_row_Red = tmpR[height + 1][width] + tmpR[height + 1][width + 1];
//getting the average of the total current row and next row and dividing it to 4
avgRed = round ((current_row_Red + after_row_Red) / 4);
float current_row_Green = tmpG[height][width] + tmpG[height][width + 1];
float after_row_Green = tmpG[height + 1][width] + tmpG[height + 1][width + 1];
avgGreen = round ((current_row_Green + after_row_Green) / 4);
float current_row_Blue = tmpB[height][width] + tmpB[height][width + 1];
float after_row_Blue = tmpB[height + 1][width] + tmpB[height + 1][width + 1];
avgBlue = round ((current_row_Blue + after_row_Blue) / 4);
}
// upper right corner side of Box
else if (height == 0 && width == widlen - 1)
{
float current_row_Red = tmpR[height][width] + tmpR[height][width - 1];
float after_row_Red = tmpR[height + 1][width] + tmpR[height + 1][width - 1];
avgRed = round ((current_row_Red + after_row_Red) / 4);
float current_row_Green = tmpG[height][width] + tmpG[height][width - 1];
float after_row_Green = tmpG[height + 1][width] + tmpG[height + 1][width - 1];
avgGreen = round ((current_row_Green + after_row_Green) / 4);
float current_row_Blue = tmpB[height][width] + tmpB[height][width - 1];
float after_row_Blue = tmpB[height + 1][width] + tmpB[height + 1][width - 1];
avgBlue = round ((current_row_Blue + after_row_Blue) / 4);
}
//lower left corner side of the box
else if (height == heilen - 1 && width == 0)
{
float current_row_Red = tmpR[height][width] + tmpR[height][width + 1];
float before_row_Red = tmpR[height - 1][width] + tmpR[height - 1][width + 1];
avgRed = round ((current_row_Red + before_row_Red) / 4);
float current_row_Green = tmpG[height][width] + tmpG[height][width + 1];
float before_row_Green = tmpG[height - 1][width] + tmpG[height - 1][width + 1];
avgGreen = round ((current_row_Green + before_row_Green) / 4);
float current_row_Blue = tmpB[height][width] + tmpB[height][width + 1];
float before_row_Blue = tmpB[height - 1][width] + tmpB[height - 1][width + 1];
avgBlue = round ((current_row_Blue + before_row_Blue) / 4);
}
//lower right corner side of the box
else if (height == heilen - 1 && width == widlen - 1)
{
float current_row_Red = tmpR[height][width] + tmpR[height][width - 1];
float before_row_Red = tmpR[height - 1][width] + tmpR[height - 1][width - 1];
avgRed = round ((current_row_Red + before_row_Red) / 4);
float current_row_Green = tmpG[height][width] + tmpG[height][width - 1];
float before_row_Green = tmpG[height - 1][width] + tmpG[height - 1][width - 1];
avgGreen = round ((current_row_Green + before_row_Green) / 4);
float current_row_Blue = tmpB[height][width] + tmpB[height][width - 1];
float before_row_Blue = tmpB[height - 1][width] + tmpB[height - 1][width - 1];
avgBlue = round ((current_row_Blue + before_row_Blue) / 4);
}
// ===================== PIXELS ON EDGES
//upper side of the box
else if ( (height == 0 && width >= 1) && (height == 0 &&width < widlen - 1) )
{
float current_row_Red = tmpR[height][width] + tmpR[height][width - 1] + tmpR[height][width + 1];
float after_row_Red = tmpR[height + 1][width] + tmpR[height + 1][width - 1] + tmpR[height + 1][width + 1];
avgRed = round ((current_row_Red + after_row_Red) / 6);
float current_row_Green = tmpG[height][width] + tmpG[height][width - 1] + tmpG[height][width + 1];
float after_row_Green = tmpG[height + 1][width] + tmpG[height + 1][width - 1] + tmpG[height + 1][width + 1];
avgGreen = round ((current_row_Green + after_row_Green) / 6);
float current_row_Blue = tmpB[height][width] + tmpB[height][width - 1] + tmpB[height][width + 1];
float after_row_Blue = tmpB[height + 1][width] + tmpB[height + 1][width - 1] + tmpB[height + 1][width + 1];
avgBlue = round ((current_row_Blue + after_row_Blue) / 6);
}
//lower side of the box
else if ( ( height == heilen - 1 && width >= 1) && ( height == heilen - 1 && width < widlen - 1) )
{
float current_row_Red = tmpR[height][width] + tmpR[height][width - 1] + tmpR[height][width + 1];
float before_row_Red = tmpR[height - 1][width] + tmpR[height - 1][width - 1] + tmpR[height - 1][width + 1];
avgRed = round ((current_row_Red + before_row_Red) / 6);
float current_row_Green = tmpG[height][width] + tmpG[height][width - 1] + tmpG[height][width + 1];
float before_row_Green = tmpG[height - 1][width] + tmpG[height - 1][width - 1] + tmpG[height - 1][width + 1];
avgGreen = round ((current_row_Green + before_row_Green) / 6);
float current_row_Blue = tmpB[height][width] + tmpB[height][width - 1] + tmpB[height][width + 1];
float before_row_Blue = tmpB[height - 1][width] + tmpB[height - 1][width - 1] + tmpB[height - 1][width + 1];
avgBlue = round ((current_row_Blue + before_row_Blue) / 6);
}
// left side of the box
else if ( (height >= 1 && width == 0) && (height < heilen - 1 && width == 0) )
{
float current_row_Red = tmpR[height][width] + tmpR[height][width + 1];
float before_row_Red = tmpR[height - 1][width] + tmpR[height - 1][width + 1];
float after_row_Red = tmpR[height + 1][width] + tmpR[height + 1][width + 1];
avgRed = round ((current_row_Red + before_row_Red + after_row_Red) / 6);
float current_row_Green = tmpG[height][width] + tmpG[height][width + 1];
float before_row_Green = tmpG[height - 1][width] + tmpG[height - 1][width + 1];
float after_row_Green = tmpG[height + 1][width] + tmpG[height + 1][width + 1];
avgGreen = round ((current_row_Green + before_row_Green + after_row_Green) / 6);
float current_row_Blue = tmpB[height][width] + tmpB[height][width + 1];
float before_row_Blue = tmpB[height - 1][width] + tmpB[height - 1][width + 1];
float after_row_Blue = tmpB[height + 1][width] + tmpB[height + 1][width + 1];
avgBlue = round ((current_row_Blue + before_row_Blue + after_row_Blue) / 6);
}
//right side of the box
else if ( ( height >= 1 && width == widlen- 1) && (height <= heilen -1 && width == widlen - 1) )
{
float current_row_Red = tmpR[height][width] + tmpR[height][width - 1];
float before_row_Red = tmpR[height - 1][width] + tmpR[height - 1][width - 1];
float after_row_Red = tmpR[height + 1][width] + tmpR[height + 1][width - 1];
avgRed = round ((current_row_Red + before_row_Red + after_row_Red) / 6);
float current_row_Green = tmpG[height][width] + tmpG[height][width - 1];
float before_row_Green = tmpG[height - 1][width] + tmpG[height - 1][width - 1];
float after_row_Green = tmpG[height + 1][width] + tmpG[height + 1][width - 1];
avgGreen = round ((current_row_Green + before_row_Green + after_row_Green) / 6);
float current_row_Blue = tmpB[height][width] + tmpB[height][width - 1];
float before_row_Blue = tmpB[height - 1][width] + tmpB[height - 1][width - 1];
float after_row_Blue = tmpB[height + 1][width] + tmpB[height + 1][width - 1];
avgBlue = round ((current_row_Blue + before_row_Blue + after_row_Blue) / 6);
}
//====================MIDDLE PIXELS
//middle of the box
else if ( (height >= 1 && width >= 1) && (height < heilen - 1 && width < widlen - 1) )
{
float current_row_Red = tmpR[height][width] + tmpR[height][width - 1] + tmpR[height][width + 1];
float after_row_Red = tmpR[height + 1][width] + tmpR[height + 1][width - 1] + tmpR[height + 1][width + 1];
float before_row_Red = tmpR[height - 1][width] + tmpR[height - 1][width - 1] + tmpR[height - 1][width + 1];
avgRed = round ((current_row_Red + before_row_Red + after_row_Red) / 9);
float current_row_Green = tmpG[height][width] + tmpG[height][width - 1] + tmpG[height][width + 1];
float before_row_Green = tmpG[height - 1][width] + tmpG[height - 1][width - 1] + tmpG[height - 1][width + 1];
float after_row_Green = tmpG[height + 1][width] + tmpG[height + 1][width - 1] + tmpG[height + 1][width + 1];
avgGreen = round ((current_row_Green + before_row_Green + after_row_Green) / 9);
float current_row_Blue = tmpB[height][width] + tmpB[height][width - 1] + tmpB[height][width + 1];
float before_row_Blue = tmpB[height - 1][width] + tmpB[height - 1][width - 1] + tmpB[height - 1][width + 1];
float after_row_Blue = tmpB[height + 1][width] + tmpB[height + 1][width - 1] + tmpB[height + 1][width + 1];
avgBlue = round ((current_row_Blue + before_row_Blue + after_row_Blue) / 9);
}
//Assigning the cuurent average of RGB to image[][]
image[height][width].rgbtRed = avgRed;
image[height][width].rgbtGreen = avgGreen;
image[height][width].rgbtBlue = avgBlue;
}
return;
}
}
Вы заметите, что начиная со второй строки фактическое выходное значение совпадает с заданным.
Я знаю, что это не самый эффективный способ сделать это, но я ничего не могу с этим поделать, я все еще новичок, только начал кодировать более 1 месяца. Помогите мне, пожалуйста> _ <</p>