Ошибка в реализации алгоритма свёртки для 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));
}
}
-
2А что вы ожидали увидеть? Пикселы по контуру ведь выделяются. Правда, не пойму, какой смысл по полю альфа это делать.MBo– MBo2022年11月29日 04:52:39 +00:00Commented 29 нояб. 2022 в 4:52
-
@MBo. По альфа, да действительно не имеет не какого значения. Убрал.Astrodynamic– Astrodynamic2022年11月29日 05:04:03 +00:00Commented 29 нояб. 2022 в 5:04
-
@MBo. По поводу контуров, просто есть с чем сравнить.Astrodynamic– Astrodynamic2022年11月29日 05:05:51 +00:00Commented 29 нояб. 2022 в 5:05
-
@Astrodynamic, может в вашем контрольном изображении применено другое ядро свёртки?maestro– maestro2022年11月29日 05:06:27 +00:00Commented 29 нояб. 2022 в 5:06
-
1По краям, насколько я помню, тоже нужно проходить. Недостающие пиксели нужно брать различными вариантами, например, удваивая пиксель с границы.needKVAS– needKVAS2022年11月29日 05:15:35 +00:00Commented 29 нояб. 2022 в 5:15
1 ответ 1
Вот это QImage uimg = img; что делает - новый объект (deepcopy) или указатель на тот же?
Судя по чересстрочной структуре результата - второе, тогда здесь и собака зарыта. Вы используете для расчёта уже измененные пикселы слева и сверху
-
-
@needKVAS Я точно не знаю, есть ли у этого класса Copy-On-Write конструктор и что там ещё нужно для обеспечения такого поведения, сужу по картинкеMBo– MBo2022年11月29日 05:48:17 +00:00Commented 29 нояб. 2022 в 5:48
-
@MBo. QColor color = img.pixelColor(i - (m - 1) / 2 + p, j - (n - 1) / 2 + q); пиксели беру из img вставляю в uimgAstrodynamic– Astrodynamic2022年11月29日 09:14:28 +00:00Commented 29 нояб. 2022 в 9:14
-
@Astrodynamic А это точно не один и тот же объект? Вы можете просто создать uimg с нуля или так же, как строчкой выше?MBo– MBo2022年11月29日 10:43:08 +00:00Commented 29 нояб. 2022 в 10:43
-
1@Astrodynamic
imgдо и после работы отрисовывали для контроля?MBo– MBo2022年11月29日 11:17:12 +00:00Commented 29 нояб. 2022 в 11:17
Начните задавать вопросы и получать на них ответы
Найдите ответ на свой вопрос, задав его.
Задать вопрос