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) или указатель на тот же?
Судя по чересстрочной структуре результата - второе, тогда здесь и собака зарыта. Вы используете для расчёта уже измененные пикселы слева и сверху

