1

Ошибка в реализации алгоритма свёртки для 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));
 }
}
задан 29 нояб. 2022 в 4:45
10
  • 2
    А что вы ожидали увидеть? Пикселы по контуру ведь выделяются. Правда, не пойму, какой смысл по полю альфа это делать. Commented 29 нояб. 2022 в 4:52
  • @MBo. По альфа, да действительно не имеет не какого значения. Убрал. Commented 29 нояб. 2022 в 5:04
  • @MBo. По поводу контуров, просто есть с чем сравнить. Commented 29 нояб. 2022 в 5:05
  • @Astrodynamic, может в вашем контрольном изображении применено другое ядро свёртки? Commented 29 нояб. 2022 в 5:06
  • 1
    По краям, насколько я помню, тоже нужно проходить. Недостающие пиксели нужно брать различными вариантами, например, удваивая пиксель с границы. Commented 29 нояб. 2022 в 5:15

1 ответ 1

-1

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

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

ответ дан 29 нояб. 2022 в 5:26
6
  • Насколько я понимаю это, qt должен создать копию данных при попытке изменить объект. Commented 29 нояб. 2022 в 5:40
  • @needKVAS Я точно не знаю, есть ли у этого класса Copy-On-Write конструктор и что там ещё нужно для обеспечения такого поведения, сужу по картинке Commented 29 нояб. 2022 в 5:48
  • @MBo. QColor color = img.pixelColor(i - (m - 1) / 2 + p, j - (n - 1) / 2 + q); пиксели беру из img вставляю в uimg Commented 29 нояб. 2022 в 9:14
  • @Astrodynamic А это точно не один и тот же объект? Вы можете просто создать uimg с нуля или так же, как строчкой выше? Commented 29 нояб. 2022 в 10:43
  • 1
    @Astrodynamic img до и после работы отрисовывали для контроля? Commented 29 нояб. 2022 в 11:17

Ваш ответ

Черновик сохранён
Черновик удалён

Зарегистрируйтесь или войдите

Регистрация через Google
Регистрация через почту

Отправить без регистрации

Необходима, но никому не показывается

Отправить без регистрации

Необходима, но никому не показывается

Нажимая «Отправить ответ», вы соглашаетесь с условиями пользования и подтверждаете, что прочитали политику конфиденциальности.

Начните задавать вопросы и получать на них ответы

Найдите ответ на свой вопрос, задав его.

Задать вопрос

Изучите связанные вопросы

Посмотрите похожие вопросы с этими метками.