Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct
Исправление в классе для высокочастотной фильтрации изображений
-
Здравствуйте.
Есть класс, который должен входное gray scale изображение обрабатывать одной из 3х матриц на выбор. Применение матриц 1 и 2 приводит к результату, похожему на верный. Однако матрица 3 вообще никак не меняет изображение. Подскажите, в чём проблема?
Вот код:
@#ifndef HIGHFFILTER_H
#define HIGHFFILTER_H#include <QImage>
#include <QVector>typedef QVector<QVector<double>> Matrix;
class HighFFilter
{
public:
enum MtrType {m1 = 1, m2, m3};
HighFFilter();QImage apply(const QImage &image, MtrType type);
protected:
int applyToXY(const QImage &image, Matrix *mtr, int x, int y);private:
Matrix mtr1;
Matrix mtr2;
Matrix mtr3;
};#endif // HIGHFFILTER_H@
@
#include "highffilter.h"HighFFilter::HighFFilter()
{
mtr1.append({-1,-1,-1});
mtr1.append({-1, 9,-1});
mtr1.append({-1,-1,-1});mtr2.append({ 0,-1, 0}); mtr2.append({-1, 5,-1}); mtr2.append({ 0,-1, 0});
// mtr3 - матрица, которая не проводит ожидаемых преобразований
mtr3.append({ 1,-2, 1});
mtr3.append({-2, 5,-2});
mtr3.append({ 1,-2, 1});
}QImage HighFFilter::apply(const QImage &image, MtrType type)
{
Matrix *pMtr;
if (type == m1) {
pMtr = &mtr1;
} else if (type == m2) {
pMtr = &mtr2;
} else if (type == m3) {
pMtr = &mtr3;
}QImage retImage = image.copy(QRect()); int h{image.height()}, w{image.width()}; for (int y = 1; y < h - 1; ++y) { for (int x = 1; x < w - 1; ++x) { QRgb br = applyToXY(image, pMtr, x, y); retImage.setPixel(x, y, qRgb(br,br,br)); } } return retImage;
}
int HighFFilter::applyToXY(const QImage &image, Matrix *mtr, int x, int y)
{
double resp{0};
for (int sy = -1; sy < 2; ++sy) {
for (int sx = -1; sx < 2; ++sx) {
QRgb px = image.pixel(x + sx, y + sx);
QRgb br = qGray(px);
double k = (*mtr)[1 + sy][1 + sx];
resp+= br * k;
}
}
if (resp > 255) {
resp = 255;
} else if (resp < 0) {
resp = 0;
}
return resp;
}@