I'm making a blur filter that takes the RGB values of the surrounding pixels, takes the average of each, and applies it to the pixel. Have been working on it for days and I'm still not sure what the problem is or how to fix it. I did do it the long way and there is probably a shorter faster way but I can't seem to figure it out. Here's the important part of the code:
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
int avrgRed;
int avrgBlue;
int avrgGreen;
int maxj = width - 1;
int maxi = height - 1;
if (i == 0) {
if (j == 0) {
avrgRed =
round((image[i][j].rgbtRed + image[i][j + 1].rgbtRed +
image[i + 1][j].rgbtRed + image[i + 1][j + 1].rgbtRed) /
4);
avrgBlue =
round((image[i][j].rgbtBlue + image[i][j + 1].rgbtBlue +
image[i + 1][j].rgbtBlue + image[i + 1][j + 1].rgbtBlue) /
4);
avrgGreen =
round((image[i][j].rgbtGreen + image[i][j + 1].rgbtGreen +
image[i + 1][j].rgbtGreen + image[i + 1][j + 1].rgbtGreen) /
4);
} else if (j == maxj) {
avrgRed =
round((image[i][j - 1].rgbtRed + image[i][j].rgbtRed +
image[i + 1][j - 1].rgbtRed + image[i + 1][j].rgbtRed) /
4);
avrgBlue =
round((image[i][j - 1].rgbtBlue + image[i][j].rgbtBlue +
image[i + 1][j - 1].rgbtBlue + image[i + 1][j].rgbtBlue) /
4);
avrgGreen =
round((image[i][j - 1].rgbtGreen + image[i][j].rgbtGreen +
image[i + 1][j - 1].rgbtGreen + image[i + 1][j].rgbtGreen) /
4);
} else {
avrgRed =
round((image[i][j - 1].rgbtRed + image[i][j].rgbtRed +
image[i][j + 1].rgbtRed + image[i + 1][j - 1].rgbtRed +
image[i + 1][j].rgbtRed + image[i + 1][j + 1].rgbtRed) /
6);
avrgBlue =
round((image[i][j - 1].rgbtBlue + image[i][j].rgbtBlue +
image[i][j + 1].rgbtBlue + image[i + 1][j - 1].rgbtBlue +
image[i + 1][j].rgbtBlue + image[i + 1][j + 1].rgbtBlue) /
6);
avrgGreen =
round((image[i][j - 1].rgbtGreen + image[i][j].rgbtGreen +
image[i][j + 1].rgbtGreen + image[i + 1][j - 1].rgbtGreen +
image[i + 1][j].rgbtGreen + image[i + 1][j + 1].rgbtGreen) /
6);
}
} else if (i == maxi) {
if (j == 0)
//{
// avrgRed = round((image[i][j].rgbtRed + image[i][j + 1].rgbtRed +
// image[i + 1][j].rgbtRed + image[i + 1][j + 1])/4);
//}
{
avrgRed = round((image[i - 1][j].rgbtRed + image[i - 1][j + 1].rgbtRed +
image[i][j].rgbtRed + image[i][j + 1].rgbtRed) /
4);
avrgBlue =
round((image[i - 1][j].rgbtBlue + image[i - 1][j + 1].rgbtBlue +
image[i][j].rgbtBlue + image[i][j + 1].rgbtBlue) /
4);
avrgGreen =
round((image[i - 1][j].rgbtGreen + image[i - 1][j + 1].rgbtGreen +
image[i][j].rgbtGreen + image[i][j + 1].rgbtGreen) /
4);
} else if (j == maxj) {
avrgRed =
round((image[i][j].rgbtRed + image[i][j + 1].rgbtRed +
image[i + 1][j].rgbtRed + image[i + 1][j + 1].rgbtRed) /
4);
avrgBlue =
round((image[i][j].rgbtBlue + image[i][j + 1].rgbtBlue +
image[i + 1][j].rgbtBlue + image[i + 1][j + 1].rgbtBlue) /
4);
avrgGreen =
round((image[i][j].rgbtGreen + image[i][j + 1].rgbtGreen +
image[i + 1][j].rgbtGreen + image[i + 1][j + 1].rgbtGreen) /
4);
} else {
avrgRed =
round((image[i][j - 1].rgbtRed + image[i][j].rgbtRed +
image[i][j + 1].rgbtRed + image[i + 1][j - 1].rgbtRed +
image[i + 1][j].rgbtRed + image[i + 1][j + 1].rgbtRed) /
6);
avrgBlue =
round((image[i][j - 1].rgbtBlue + image[i][j].rgbtBlue +
image[i][j + 1].rgbtBlue + image[i + 1][j - 1].rgbtBlue +
image[i + 1][j].rgbtBlue + image[i + 1][j + 1].rgbtBlue) /
6);
avrgGreen =
round((image[i][j - 1].rgbtGreen + image[i][j].rgbtGreen +
image[i][j + 1].rgbtGreen + image[i + 1][j - 1].rgbtGreen +
image[i + 1][j].rgbtGreen + image[i + 1][j + 1].rgbtGreen) /
6);
}
} else {
if (j == 0) {
avrgRed =
round((image[i - 1][j - 1].rgbtRed + image[i - 1][j].rgbtRed +
image[i][j - 1].rgbtRed + image[i][j].rgbtRed +
image[i + 1][j - 1].rgbtRed + image[i + 1][j].rgbtRed) /
6);
avrgBlue =
round((image[i - 1][j - 1].rgbtBlue + image[i - 1][j].rgbtBlue +
image[i][j - 1].rgbtBlue + image[i][j].rgbtBlue +
image[i + 1][j - 1].rgbtBlue + image[i + 1][j].rgbtBlue) /
6);
avrgGreen =
round((image[i - 1][j - 1].rgbtGreen + image[i - 1][j].rgbtGreen +
image[i][j - 1].rgbtGreen + image[i][j].rgbtGreen +
image[i + 1][j - 1].rgbtGreen + image[i + 1][j].rgbtGreen) /
6);
} else if (j == maxj) {
avrgRed =
round((image[i - 1][j].rgbtRed + image[i - 1][j + 1].rgbtRed +
image[i][j].rgbtRed + image[i][j + 1].rgbtRed +
image[i + 1][j].rgbtRed + image[i + 1][j + 1].rgbtRed) /
6);
avrgBlue =
round((image[i - 1][j].rgbtBlue + image[i - 1][j + 1].rgbtBlue +
image[i][j].rgbtBlue + image[i][j + 1].rgbtBlue +
image[i + 1][j].rgbtBlue + image[i + 1][j + 1].rgbtBlue) /
6);
avrgGreen =
round((image[i - 1][j].rgbtGreen + image[i - 1][j + 1].rgbtGreen +
image[i][j].rgbtGreen + image[i][j + 1].rgbtGreen +
image[i + 1][j].rgbtGreen + image[i + 1][j + 1].rgbtGreen) /
6);
} else {
avrgRed = round((image[i - 1][j - 1].rgbtRed + image[i - 1][j].rgbtRed +
image[i - 1][j + 1].rgbtRed + image[i][j - 1].rgbtRed +
image[i][j].rgbtRed + image[i][j + 1].rgbtRed +
image[i + 1][j - 1].rgbtRed + image[i + 1][j].rgbtRed +
image[i + 1][j + 1].rgbtRed) /
9);
avrgBlue =
round((image[i - 1][j - 1].rgbtBlue + image[i - 1][j].rgbtBlue +
image[i - 1][j + 1].rgbtBlue + image[i][j - 1].rgbtBlue +
image[i][j].rgbtBlue + image[i][j + 1].rgbtBlue +
image[i + 1][j - 1].rgbtBlue + image[i + 1][j].rgbtBlue +
image[i + 1][j + 1].rgbtBlue) /
9);
avrgGreen =
round((image[i - 1][j - 1].rgbtGreen + image[i - 1][j].rgbtGreen +
image[i - 1][j + 1].rgbtGreen + image[i][j - 1].rgbtGreen +
image[i][j].rgbtGreen + image[i][j + 1].rgbtGreen +
image[i + 1][j - 1].rgbtGreen + image[i + 1][j].rgbtGreen +
image[i + 1][j + 1].rgbtGreen) /
9);
}
}
newimageRed[i][j] = avrgRed;
newimageBlue[i][j] = avrgBlue;
newimageGreen[i][j] = avrgGreen;
}
}
Here is a 4x4 image test (the RGB values are written) Expected result
70 85 95 80 95 105 100 115 125 110 125 135
113 126 136 123 136 145 142 155 163 152 165 173
113 119 136 143 151 164 156 166 171 180 190 194
113 112 132 155 156 171 169 174 177 203 207 209
Actual result
70 85 95 80 95 105 100 115 125 110 125 135
92 104 112 122 135 145 141 154 163 140 147 164
140 147 164 143 150 163 156 165 171 119 121 135
112 111 131 135 89 97 140 139 138 76 138 143
What do you guys think is the problem? or should I rewrite it in another way?
Update: I did solve the bigger problems, I messed up the + and - placements and mixed them up. Now I just have to fix the 1 problems, which may be because of the round function, have tried a few now but they all end up being off by 1 somewhere. Gonna check if the problem is a float > int conversion problem later.