画像処理の基本概念
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);
}