Qt+OpenCV实现图像滤波器

均值滤波、高斯滤波和中值滤波是图像处理中常用的三种滤波方法。它们用于平滑图像、去除噪声,但各自有不同的实现方式和效果。

均值滤波

均值滤波是一种简单的平滑滤波器,它通过对图像的每个像素及其周围像素取平均值来减少噪声。

实现原理
  1. 选择一个核(通常为奇数大小,如3x3, 5x5)。
  2. 将核中心放在当前像素位置。
  3. 核覆盖区域的像素值求平均值,结果作为当前像素的新值。
优点
  • 实现简单,计算量小。
缺点
  • 会模糊图像细节,不能很好地保留边缘。
void cv::blur(InputArray src, OutputArray dst, Size ksize, Point anchor = Point(-1,-1), int borderType = BORDER_DEFAULT);
参数解释
  • src:输入图像,必须是 cv::Mat 类型。
  • dst:输出图像,与输入图像大小和类型相同。
  • ksize:核的大小,Size 类型,决定了邻域的大小,例如 Size(3, 3)
  • anchor:(可选)表示核的锚点,默认值为 Point(-1, -1) 表示核的中心。
  • borderType:(可选)边界模式,用于指定如何处理边界像素。默认值为 BORDER_DEFAULT

示例代码:

cv::Mat mypic = cv::imread("C:/Users/15066/Documents/OpenCVTest01/img/pic01.jpg");

    if (mypic.empty()) {
        qDebug() << "Failed to load image!";
        return;
    }
    int ksize1=ui->spinBox_2->value();
    int ksize2=ui->spinBox_3->value();


    // 均值滤波器实现
    cv::Mat filteredImage;
    cv::blur(mypic, filteredImage, cv::Size(ksize1, ksize2));

    // 将 BGR 图像转换为 RGB 图像
    cv::cvtColor(filteredImage, filteredImage, cv::COLOR_BGR2RGB);
    
    // 将 OpenCV 图像转换为 QImage
    QImage img = QImage((const unsigned char*)(filteredImage.data),
                        filteredImage.cols, filteredImage.rows,
                        filteredImage.step, QImage::Format_RGB888);

    // 固定大小
    QSize fixedSize(400, 300); // 例如,400x300 的固定大小

    // 按比例缩放图片
    QImage scaledImg = img.scaled(fixedSize, Qt::KeepAspectRatio);

    // 在图片上添加文字
    ui->label_4->setText("均值滤波");
    // 设置 QLabel 的大小为最终图片的大小
    ui->modifypic->setFixedSize(scaledImg.size());

    // 显示图片
    ui->modifypic->setPixmap(QPixmap::fromImage(scaledImg));

运行结果:

高斯滤波

高斯滤波是通过高斯函数加权的方式来平滑图像。相比均值滤波,它能更好地保留图像细节。

实现原理
  1. 选择一个高斯核(通常为奇数大小,如3x3, 5x5)。
  2. 核的权重由高斯函数确定,权重随距离中心的距离增加而减小。
  3. 核覆盖区域的像素值按权重加权求和,结果作为当前像素的新值。
优点
  • 保留更多图像细节,相对于均值滤波更有效地去除噪声。
  • 平滑效果更自然。
缺点
  • 计算量相对较大。
void cv::GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY = 0, int borderType = BORDER_DEFAULT);
参数解释
  • src:输入图像,必须是 cv::Mat 类型。
  • dst:输出图像,与输入图像大小和类型相同。
  • ksize:高斯核的大小,Size 类型,必须为奇数和正数(例如 Size(3, 3))。
  • sigmaX:X 方向上的标准差。
  • sigmaY:(可选)Y 方向上的标准差,如果为 0,则取与 sigmaX 相同的值。
  • borderType:(可选)边界模式,用于指定如何处理边界像素。默认值为 BORDER_DEFAULT

示例代码:

    cv::Mat mypic = cv::imread("C:/Users/15066/Documents/OpenCVTest01/img/pic01.jpg");

    
    int ksize1=ui->spinBox_4->value();
    int ksize2=ui->spinBox_5->value();


    // 高斯滤波器实现
    cv::Mat filteredImage;


    cv::GaussianBlur(mypic, filteredImage, cv::Size(ksize1, ksize2), 0);

    // 将 BGR 图像转换为 RGB 图像
    cv::cvtColor(filteredImage, filteredImage, cv::COLOR_BGR2RGB);

    // 将 OpenCV 图像转换为 QImage
    QImage img = QImage((const unsigned char*)(filteredImage.data),
                        filteredImage.cols, filteredImage.rows,
                        filteredImage.step, QImage::Format_RGB888);

    // 固定大小
    QSize fixedSize(400, 300); // 例如,400x300 的固定大小

    // 按比例缩放图片
    QImage scaledImg = img.scaled(fixedSize, Qt::KeepAspectRatio);

    // 在图片上添加文字
    ui->label_4->setText("高斯滤波");
    // 设置 QLabel 的大小为最终图片的大小
    ui->modifypic->setFixedSize(scaledImg.size());

    // 显示图片
    ui->modifypic->setPixmap(QPixmap::fromImage(scaledImg));

运行结果:

中值滤波

中值滤波通过取邻域像素的中值来去除噪声,特别适用于去除椒盐噪声。

实现原理
  1. 选择一个核(通常为奇数大小)。
  2. 核覆盖区域的像素值排序,取中间值作为当前像素的新值。
优点
  • 能有效去除椒盐噪声。
  • 保留边缘特征。
缺点
  • 对细小的细节和纹理有一定的模糊效果。
void cv::medianBlur(InputArray src, OutputArray dst, int ksize);
参数说明
  • src:输入图像,必须是一个 1 通道或 3 通道的 8 位图像。
  • dst:输出图像,类型与输入图像相同。
  • ksize:滤波器窗口的大小,必须是一个正的奇数(如 3, 5, 7 等)。

实例代码:

    int ksize;
    ksize=ui->spinBox->value();
    cv::Mat mypic = cv::imread("C:/Users/15066/Documents/OpenCVTest01/img/pic01.jpg");

    if (mypic.empty()) {
        qDebug() << "Failed to load image!";
        return;
    }
    // 中值滤波器实现

    cv::Mat Medianfiltering;
    cv::medianBlur(mypic, Medianfiltering, ksize);
    // 将 BGR 图像转换为 RGB 图像
    cv::cvtColor(Medianfiltering, Medianfiltering, cv::COLOR_BGR2RGB);

    // 将 OpenCV 图像转换为 QImage
    QImage img = QImage((const unsigned char*)(Medianfiltering.data),
                        Medianfiltering.cols, Medianfiltering.rows,
                        Medianfiltering.step, QImage::Format_RGB888);

    // 固定大小
    QSize fixedSize(400, 300); // 例如,400x300 的固定大小

    // 按比例缩放图片
    QImage scaledImg = img.scaled(fixedSize, Qt::KeepAspectRatio);

    // 在图片上添加文字
    ui->label_4->setText("中值滤波");
    // 设置 QLabel 的大小为最终图片的大小
    ui->modifypic->setFixedSize(scaledImg.size());

    // 显示图片
    ui->modifypic->setPixmap(QPixmap::fromImage(scaledImg));

运行结果:

总结

  • 均值滤波:简单但会模糊图像细节,适用于一般平滑。
  • 高斯滤波:较复杂,能更好地保留细节和平滑图像,适用于需要平滑和保留边缘的情况。
  • 中值滤波:适合去除椒盐噪声,能很好地保留边缘,但对细小细节有模糊效果。

根据具体需求,可以选择合适的滤波方法来处理图像。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值