Laplacian filter Qt C++

Ошибка в реализации алгоритма свёртки для Laplacian filter. Не могу получить контур картинки с помощью фильтра. Что в данном коде может приводить к не верным расчётам?

void Model::Laplacian filter() {
    static int mat[3][3] {
        -1, -1, -1,
        -1, +8, -1,
        -1, -1, -1
    };

    Сonvolution(mat, 3, 3);
}

void Model::Сonvolution(int k[3][3], int m, int n) {
   QImage img(pixmap().toImage());
   QImage uimg = img;
   for (unsigned i = 1; i < img.width() - 1; ++i) {
       for (unsigned j = 1; j < img.height() - 1; ++j) {
           int sum_r = 0;
           int sum_g = 0;
           int sum_b = 0;
           int sum_a = 0;
           for (unsigned p = 0; p < m; ++p) {
               for (unsigned q = 0; q < n; ++q) {
                   QColor color = img.pixelColor(i - (m - 1) / 2 + p, j - (n - 1) / 2 + q);
                   sum_r += color.red() * k[p][q];
                   sum_g += color.green() * k[p][q];
                   sum_b += color.blue() * k[p][q];
                   sum_a += color.alpha() * k[p][q];
               }
           }
           if (sum_r > 255) sum_r = 255;
           else if (sum_r < 0) sum_r = 1;

           if (sum_g > 255) sum_g = 255;
           else if (sum_g < 0) sum_g = 1;

           if (sum_b > 255) sum_b = 255;
           else if (sum_b < 0) sum_b = 1;

           if (sum_a > 255) sum_a = 255;
           else if (sum_a < 0) sum_a = 1;

           uimg.setPixelColor(i, j, QColor(sum_r, sum_g, sum_b, sum_a));
       }
   }
   setPixmap(QPixmap::fromImage(uimg));
}

Пытаюсь сделать с помощью средств Qt, чтобы облегчить работу. Прохожу окном по массиву данных картинки не беря в расчёт крайнее пиксили, для начала хотелось бы проверить работу на матрицах 3 х 3, а уж потом заниматься оптимизацией.

То что я получаю. введите сюда описание изображения

То что должен получить. введите сюда описание изображения

Grayscale:

void Model::Grayscale() {
  if (!pixmap().isNull()) {
    QImage img(pixmap().toImage());
    for (int x = 0; x < img.width(); ++x) {
      for (int y = 0; y < img.height(); ++y) {
        QRgb value = img.pixel(x, y);
        int gray = qGray(value);
        QColor color = QColor(gray, gray, gray, qAlpha(value));
        value = color.rgba();
        img.setPixel(x, y, value);
      }
    }
    setPixmap(QPixmap::fromImage(img));
  }
}

Ответы (1 шт):

Автор решения: MBo

Вот это QImage uimg = img; что делает - новый объект (deepcopy) или указатель на тот же?

Судя по чересстрочной структуре результата - второе, тогда здесь и собака зарыта. Вы используете для расчёта уже измененные пикселы слева и сверху

→ Ссылка