фильтр размытия изображения ppm создает 8 отдельных изображений

Я в некотором роде новичок в c ++, и у меня есть задание для курса читать изображение p6 ppm и использовать на нем несколько фильтров. Я застрял на размытом изображении и не могу найти свою логическую ошибку в своем коде.
Моя проблема в том, что выходное изображение размыто, но там 4 размытых изображения.

РЕДАКТИРОВАТЬ — ЗДЕСЬ ССЫЛКА НА ВЫХОДНОЕ ИЗОБРАЖЕНИЕ (TESTFILTER.ppm) ВВОДНОЕ ИЗОБРАЖЕНИЕ (оригинал) и ПРОСТАЯ ПРОСМОТР, ЧТОБЫ СМОТРЕТЬ ИХ МОЙ ПРОФЕССОР ДАЛ НАМ (CPIViewer)

http://www.filedropper.com/blurfilterquestion

Вот код фильтра размытия.

typedef Vec3<float> buffer;

static void blur(Image*   pic) { //BLUR FILTER
int h = pic->getHeight();
int w = pic->getWidth();

int count = 0;
buffer* temp = new buffer[h*w];
for (int x = 0; x < w; x++){
for (int y = 0; y < h; y++){

if (x == 0 && y == 0) {
count++;
temp[y*w + x] = (pic->getPixel(x, y) + pic->getPixel(x + 1, y) + pic->getPixel(x, y + 1) + pic->getPixel(x + 1, y + 1)) / 4;
}
else if (x == 0 && y == h - 1) {
count++;
temp[y*w + x] = (pic->getPixel(x, y) + pic->getPixel(x + 1, y) + pic->getPixel(x, y - 1) + pic->getPixel(x + 1, y - 1)) / 4;
}
else if (x == w - 1 && y == 0){
count++;
temp[y*w + x] = (pic->getPixel(x, y) + pic->getPixel(x - 1, y) + pic->getPixel(x, y + 1) + pic->getPixel(x - 1, y + 1)) / 4;
}
else if (x == w - 1 && y == h - 1){
count++;
temp[y*w + x] = (pic->getPixel(x, y) + pic->getPixel(x - 1, y) + pic->getPixel(x, y - 1) + pic->getPixel(x - 1, y - 1)) / 4;
}
else if (x == 0){
count++;
temp[y*w + x] = ((pic->getPixel(x, y)) + (pic->getPixel(x, y - 1)) + (pic->getPixel(x, y + 1)) + (pic->getPixel(x + 1, y - 1)) + (pic->getPixel(x + 1, y)) + (pic->getPixel(x + 1, y + 1))) / 6;
}
else if (x == w - 1){
count++;
temp[y*w + x] = ((pic->getPixel(x, y)) + (pic->getPixel(x, y - 1)) + (pic->getPixel(x, y + 1)) + (pic->getPixel(x - 1, y + 1)) + (pic->getPixel(x - 1, y)) + (pic->getPixel(x - 1, y - 1))) / 6;
}
else if (y == 0){
count++;
temp[y*w + x] = ((pic->getPixel(x, y)) + (pic->getPixel(x, y - 1)) + (pic->getPixel(x, y + 1)) + (pic->getPixel(x - 1, y + 1)) + (pic->getPixel(x - 1, y)) + (pic->getPixel(x + 1, y + 1))) / 6;
}
else if (y == h - 1){
count++;
temp[y*w + x] = ((pic->getPixel(x, y)) + (pic->getPixel(x, y - 1)) + (pic->getPixel(x - 1, y)) + (pic->getPixel(x + 1, y - 1)) + (pic->getPixel(x + 1, y)) + (pic->getPixel(x - 1, y - 1))) / 6;
}
else {
count++;
temp[y*w + x].r = ((pic->getPixel(x, y).r) + (pic->getPixel(x + 1, y).r) + (pic->getPixel(x, y + 1).r) + (pic->getPixel(x, y - 1).r) + (pic->getPixel(x - 1, y).r) + (pic->getPixel(x - 1, y - 1).r) + (pic->getPixel(x + 1, y + 1).r) + (pic->getPixel(x + 1, y - 1).r) + (pic->getPixel(x - 1, y + 1).r)) / 9;
temp[y*w + x].g = ((pic->getPixel(x, y).g) + (pic->getPixel(x + 1, y).g) + (pic->getPixel(x, y + 1).g) + (pic->getPixel(x, y - 1).g) + (pic->getPixel(x - 1, y).g) + (pic->getPixel(x - 1, y - 1).g) + (pic->getPixel(x + 1, y + 1).g) + (pic->getPixel(x + 1, y - 1).g) + (pic->getPixel(x - 1, y + 1).g)) / 9;
temp[y*w + x].b = ((pic->getPixel(x, y).b) + (pic->getPixel(x + 1, y).b) + (pic->getPixel(x, y + 1).b) + (pic->getPixel(x, y - 1).b) + (pic->getPixel(x - 1, y).b) + (pic->getPixel(x - 1, y - 1).b) + (pic->getPixel(x + 1, y + 1).b) + (pic->getPixel(x + 1, y - 1).b) + (pic->getPixel(x - 1, y + 1).b)) / 9;

}
}
}
const buffer* constTemp;
constTemp = temp;
pic->setData(constTemp);
std::cout << "TIMES: " << count << std::endl;

здесь getPixel метод

typedef Vec3<float> color;
enter code here
color  Image::getPixel(unsigned int x, unsigned int y) const   {
if (x > getWidth() || y > getHeight()) { color col(0, 0, 0); return col; }
color col = buffer[y*width + x];

return  col;
}

а вот мой main() метод

#include "Image.h"#include "ppm_format.h"#include "Filters.h"#include <iostream>using namespace imaging;
using namespace std;
using namespace filtering;int main(int argc, char* argv[]) {

Image* image = ReadPPM(argv[argc - 1]); // Creating Imagefloat r, g, b;
bool filterFlag = false; //Flag used to check if -f command is given
string check;

Vec3<float> temp;for (int i = 1; i < argc - 2; i++) {
string check(argv[i]);
if (!check.compare("-f")) { filterFlag = true;  } // check.compare("-f") returns 0 if check = -f
if (filterFlag) {
i++;
check = argv[i];
if (!check.compare("gray")) {
filterFlag = false; //filter flag falsified to show that a filter is read
gray(image);
}
else if (!check.compare("color")) {
filterFlag = false;

if (argc-2 <= i + 3) {
cout << "INVALID COLOR FILTER CALL.EXITING...";
system("pause");
exit(0);
}
r = i + 1;
g = i + 2;
b = i + 3;
i += 4;

color(image, r, g, b);
}
else if (!check.compare("blur")) {
filterFlag = false;

blur(image);

}
else if (!check.compare("median")){
filterFlag = false;

medianORdiff(image,"median");
}
else if (!check.compare("diff")){
filterFlag = false;

medianORdiff(image,"diff");
}
else {
cout << "Invalid filter name or no filter name at all.\nFilter names are gray , color r g b , blur , median , diff";
system("pause");
exit(0);
}
*image >> "C://Users/M1TR0S0UL4S/Desktop/TESTFILTER.ppm";
}
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …