【Qt&OpenCV 图像平滑/滤波处理 -- Blur/Gaussian/Median/Bilateral】

简介: 【Qt&OpenCV 图像平滑/滤波处理 -- Blur/Gaussian/Median/Bilateral】

平滑 也称 模糊, 是一项简单且使用频率很高的图像处理方法。平滑处理的用途有很多,现在我们关注它减少噪声的功用 。平滑处理时需要用到一个 滤波器 。

前言

越来越多的开发人员选择基于开源的Qt框架与OpenCV来实现界面和算法,其原因不单单是无版权问题,更多是两个社区的发展蓬勃,可用来学习的资料与例程特别丰富。以下是关于利用Qt构建GUI并使用OpenCV中的Blur/Gaussian/Median/Bilateral函数进行图像平滑处理

软件版本:Qt-5.12.0/OpenCV-4.5.3

平台:Windows10/11–64

一、函数介绍

1、均值滤波–Blur

函数原型

cv::blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )

参数解释

src:输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一;

dst:即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图;

ksize:内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小

anchor:表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心;

borderType:用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT;

2、高斯滤波–Gaussian

函数原型:

cv::GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT);


参数解释:

src:输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一;

dst:即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图;

ksize:高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数(并不能理解)。或者,它们可以是零的,它们都是由sigma计算而来;

sigmaX:表示高斯核函数在X方向的的标准偏差;

sigmaY:表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来;

3、中值滤波–Median

函数原型

cv::medianBlur( InputArray src, OutputArray dst, int ksize )

参数解释

src:InputArray类型的src,输入图像,填Mat类的对象即可。待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一;

dst:OutputArray类型的dst,即输出图像,与源图片有一样的尺寸和类型;

ksize:Size类型的ksize,内核的大小,只能为奇数;

4、双边滤波–Bilateral

函数原型

cv::bilateralFilter(InputArray src, OutpuArray dst, Int d, double sigmaColor, double sigmaSpace, Int borderType)

参数解释

src: 是需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F或者CV_64F中的一 种。;

** dst**:是返回值,表示进行双边滤波后得到的处理结果;

d:是在滤波时选取的空间距离参数,这里表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数 sigmaSpace计算得到。如果滤波空间较大(d>5),则速度较慢。因此,在实时应用中,推荐d=5。对于较大噪声的离线滤波,可以选择d=9;

sigmaColor:是滤波处理时选取的颜色差值范围,该值决定了周围哪些像素点能够参与到滤波中来。与当前像素点的像素值差值小于 sigmaColor 的像素点,能够参与到当前的滤波中。该值越大,就说明周围有越多的像素点可以参与到运算中。该值为0时,滤波失去意义;该值为255时,指定直径内的所有点都能够参与运算;

sigmaSpace:是坐标空间中的sigma值。它的值越大,说明有越多的点能够参与到滤波计算中来。当d>0时,无论sigmaSpace的值如何,d都指定邻域大小;否则,d与 sigmaSpace的值成比例;

borderType:是边界样式,该值决定了以何种方式处理边界。一般情况下,不需要考虑该值,直接采用默认值即可;

二、演示

1、GUI

如上图创建Blur/Gaussian/Median/Bilateral四个功能按钮QPushButton,对当前窗口的图像进行滤波操作,并输出状态信息。

2、实现代码

1、 blurBtn的clicked()槽函数实现

void MainWindow::on_blurBtn_clicked()
{
    std::size_t numView = ui->tabWidget->currentIndex() % 3;
    if (dispMat[numView]->empty())
    {
        outputInfo(2, tr("Please make sure the Mat exist!"));
        return;
    }
    int kernelVal = ui->kernelSpin->value();
    if (kernelVal % 2 == 0)
    {
        kernelVal += 1;
    }
    cv::blur(*dispMat[numView], *dispMat[numView], cv::Size(kernelVal, kernelVal),\   // 均值滤波Blur
             cv::Point(-1, -1));
    cvtMatPixmap(dispMat, dispPixmap, numView);
    outputInfo(1, tr("Blur done."));
}

2、 gaussianBtn的clicked()槽函数实现

void MainWindow::on_gaussianBtn_clicked()
{
    std::size_t numView = ui->tabWidget->currentIndex() % 3;
    if (dispMat[numView]->empty())
    {
        outputInfo(2, tr("Please make sure the Mat exist!"));
        return;
    }
    int kernelVal = ui->kernelSpin->value();
    if (kernelVal % 2 == 0)
    {
        kernelVal += 1;
    }
    cv::GaussianBlur(*dispMat[numView], *dispMat[numView], cv::Size(kernelVal, kernelVal),\   // 高斯滤波Gaussian
             0, 0);
    cvtMatPixmap(dispMat, dispPixmap, numView);
    outputInfo(1, tr("Gaussian done."));

}

3、 medianBtn的clicked()槽函数实现

void MainWindow::on_medianBtn_clicked()
{
    std::size_t numView = ui->tabWidget->currentIndex() % 3;
    if (dispMat[numView]->empty())
    {
        outputInfo(2, tr("Please make sure the Mat exist!"));
        return;
    }
    int kernelVal = ui->kernelSpin->value();
    if (kernelVal % 2 == 0)
    {
        kernelVal += 1;
    }
    cv::medianBlur(*dispMat[numView], *dispMat[numView], kernelVal);  // 中值滤波Median
    cvtMatPixmap(dispMat, dispPixmap, numView);
    outputInfo(1, tr("Meidan done."));

}

4、 bilateralBtn的clicked()槽函数实现

void MainWindow::on_bilateralBtn_clicked()
{
    std::size_t numView = ui->tabWidget->currentIndex() % 3;
    if (dispMat[numView]->empty())
    {
        outputInfo(2, tr("Please make sure the Mat exist!"));
        return;
    }
    int kernelVal = ui->kernelSpin->value();
    if (kernelVal % 2 == 0)
    {
        kernelVal += 1;
    }
    cv::Mat tmpMat = cv::Mat::zeros(dispMat[numView]->rows, \
                                    dispMat[numView]->cols, \
                                    dispMat[numView]->type());
    double time = static_cast<double>(cv::getTickCount());

    cv::bilateralFilter(*dispMat[numView], tmpMat, kernelVal, \   // 双边滤波Bilateral
                        static_cast<double>(kernelVal * 2), \
                        static_cast<double>(kernelVal / 2));

    time = (static_cast<double>(cv::getTickCount()) - \       // 计算耗时
            time) / cv::getTickFrequency();
    QString costTime = "Cost time: " + QString::number(time);

    *dispMat[numView] = tmpMat.clone();
    cvtMatPixmap(dispMat, dispPixmap, numView);
    outputInfo(1, costTime);
    outputInfo(1, tr("Bilateral done."));

}

总结

以上是关于利用Qt进行GUI构建并使用OpenCV中的Blur/Gaussian/Median/Bilateral函数进行图像平滑/滤波处理。

目录
相关文章
|
2月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
104 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
2月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
127 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
|
1月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
322 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
2月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
49 4
|
2月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
2月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
44 10
|
2月前
|
机器学习/深度学习 Java 计算机视觉
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
本文记录了使用mingw81_64编译OpenCV 4.5.5、Qt 5.15.2、VTK 9.1的详细过程,包括编译结果截图、编译步骤、遇到的问题及其解决方案,以及相关参考链接。文中还提到了如何编译boost源码为静态库,并提供了测试代码示例。
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
WK
|
3月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
108 1
|
4月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
180 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
3月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
88 0