Qtを用いた画像処理の実装手法

画像処理の基本概念

Qtフレームワークを使用したデスクトップアプリケーション開発において、画像処理アルゴリズムの実装手法について解説します。特に画像のぼかし処理と角丸処理に焦点を当てます。

画像ぼかし処理の実装

画像のぼかし処理は、各画素に対してフィルタカーネルを適用することで実現します。以下に一次元ガウス関数を用いた効率的な実装例を示します。

ガウスカーネル生成関数

void generateGaussianKernel(std::vector<double>& kernel, int radius) {
    kernel.resize(2 * radius + 1);
    double sigma = radius / 3.0;
    double sigmaSquared = 2.0 * sigma * sigma;
    double normalizer = sigma * sqrt(2.0 * M_PI);
    
    for (int i = -radius; i <= radius; ++i) {
        int index = i + radius;
        kernel[index] = exp(-(i * i) / sigmaSquared) / normalizer;
    }
}

一次元ぼかし処理関数

void applyHorizontalBlur(QImage& image, const std::vector<double>& kernel) {
    int radius = (kernel.size() - 1) / 2;
    QImage tempImage = image.copy();
    
    for (int y = 0; y < image.height(); ++y) {
        for (int x = 0; x < image.width(); ++x) {
            double red = 0.0, green = 0.0, blue = 0.0;
            
            for (int i = -radius; i <= radius; ++i) {
                int sampleX = std::clamp(x + i, 0, image.width() - 1);
                QColor color = QColor::fromRgb(tempImage.pixel(sampleX, y));
                
                double weight = kernel[i + radius];
                red += color.red() * weight;
                green += color.green() * weight;
                blue += color.blue() * weight;
            }
            
            image.setPixel(x, y, qRgb(red, green, blue));
        }
    }
}

画像の角丸処理

矩形画像を角丸画像に変換する方法を2種類紹介します。

プログラムによるマスク生成

QPixmap createRoundedCorners(const QPixmap& source, int cornerRadius) {
    QPixmap result(source.size());
    result.fill(Qt::transparent);
    
    QPainter painter(&result);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
    painter.setBrush(QBrush(source));
    painter.setPen(Qt::NoPen);
    painter.drawRoundedRect(result.rect(), cornerRadius, cornerRadius);
    
    return result;
}

マスク画像を使用する方法

QPixmap applyMask(const QPixmap& source, const QPixmap& mask) {
    QImage resultImage(source.size(), QImage::Format_ARGB32_Premultiplied);
    QPainter painter(&resultImage);
    
    painter.setCompositionMode(QPainter::CompositionMode_Source);
    painter.fillRect(resultImage.rect(), Qt::transparent);
    
    painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
    painter.drawPixmap(0, 0, mask.scaled(source.size()));
    
    painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
    painter.drawPixmap(0, 0, source);
    
    return QPixmap::fromImage(resultImage);
}

タグ: Qt 画像処理 ガウスぼかし 角丸処理 QPainter

7月20日 20:29 投稿