Исправление в классе для высокочастотной фильтрации изображений



  • Здравствуйте.
    Есть класс, который должен входное 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;
    }@


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.