• Qt图像处理技术十:得到QImage图像的高斯模糊


    效果图

    参数为5

    在这里插入图片描述

    参数为20

    在这里插入图片描述

    原理

    高斯模糊使用正态分布来分配周围像素的权重。具体来说,距离中心点越近的像素对最终结果的影响越大,权重也越高;随着距离的增加,权重逐渐减小。
    这种权重分配方式确保了图像在模糊处理时,边缘信息得到相对较好的保留。

    构建高斯核, 实现归一化,然后分别对水平方向模糊和垂直方向模糊

    源码

    // 高斯模糊函数
    QImage applyGaussianBlur(const QImage &oldimage, int radius)
    {
        QImage image(oldimage);
        if (image.isNull() || radius <= 0)
            return QImage();
    
        QImage resultImage = image;
        const int size = radius * 2 + 1;
        const int sigma = radius / 2;
        const double sigmaSq = sigma * sigma;
        QVector<double> kernel(size);
    
        // 构建高斯核
        double sum = 0.0;
        for (int i = -radius; i <= radius; ++i)
        {
            double value = exp(-(i * i) / (2 * sigmaSq)) / (sqrt(2 * M_PI) * sigma);
            kernel[i + radius] = value;
            sum += value;
        }
    
        // 归一化
        for (int i = 0; i < size; ++i)
        {
            kernel[i] /= sum;
        }
    
        // 水平方向模糊
        for (int y = 0; y < image.height(); ++y)
        {
            for (int x = radius; x < image.width() - radius; ++x)
            {
                double red = 0, green = 0, blue = 0;
                for (int i = -radius; i <= radius; ++i)
                {
                    QRgb pixel = image.pixel(x + i, y);
                    red += qRed(pixel) * kernel[i + radius];
                    green += qGreen(pixel) * kernel[i + radius];
                    blue += qBlue(pixel) * kernel[i + radius];
                }
                resultImage.setPixel(x, y, qRgb(red, green, blue));
            }
        }
    
        // 垂直方向模糊
        for (int x = 0; x < image.width(); ++x)
        {
            for (int y = radius; y < image.height() - radius; ++y)
            {
                double red = 0, green = 0, blue = 0;
                for (int i = -radius; i <= radius; ++i)
                {
                    QRgb pixel = resultImage.pixel(x, y + i);
                    red += qRed(pixel) * kernel[i + radius];
                    green += qGreen(pixel) * kernel[i + radius];
                    blue += qBlue(pixel) * kernel[i + radius];
                }
                image.setPixel(x, y, qRgb(red, green, blue));
            }
        }
        return image;
    }
    
  • 相关阅读:
    python的输入input()和输出print(),及经验用法
    C语言—指针入门
    Kafka的文件存储与稀疏索引机制
    什么是Streamlit
    企业备份解决方案:保护您的企业虚拟机安全!
    AOP学习
    Photoshop套索工具使用指南:解锁自由选区的艺术
    计算机毕业设计基于springboot+vue+elementUI的网吧管理系统(源码+系统+mysql数据库+Lw文档)
    如何使用积分系统增强用户留存?会员积分体系建设方式介绍
    2022-9 做题时查漏补缺QVQ
  • 原文地址:https://blog.csdn.net/qq_43081702/article/details/139350877