目录
非局部均值滤波(Non-Local Means Filter)
自适应双边滤波(Adaptive Bilateral Filter)
递归高斯滤波 (Recursive Gaussian Filtering)
今天来介绍一下新的引入文件指令以及讲一下均值滤波和边缘检测,与昨天不同的是,今天的引入方法是自己选择图片文件
#include <QFileDialog>
是在 Qt 程序中引入 QFileDialog
类的指令。QFileDialog
是一个提供文件和目录选择功能的对话框类。通过包含 QFileDialog
,你可以在你的 Qt 应用程序中使用该类来让用户选择文件、保存文件或选择目录。
具体来说,QFileDialog
可以用于以下操作:
打开文件:允许用户浏览文件系统并选择一个或多个文件进行打开。
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("Files (*.*)"));
保存文件:让用户选择一个位置和文件名来保存文件。
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "", tr("Files (*.*)"));
选择目录:允许用户选择一个目录路径。
QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"), "", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
设计一个界面,加入四个按钮分别表示多个功能,之后逐个编写按钮的槽函数。
一.加载图像
// 图像头文件声明
// 原图像
cv::Mat srcImage;
// RGB图像
cv::Mat dstImage;
// 灰度图像
cv::Mat grayImg;
// 均值滤波
cv::Mat meanImage;
// 边缘检测
cv::Mat edgeImage;
// 图片路径
QString imageFilePath;
// 加载图像
void MainWindow::on_pushButton_load_clicked()
{
// 选择图片路径
imageFilePath = QFileDialog::getOpenFileName(this, tr("打开图像"),
"D:\\compiler\\project\\opencv",
tr("所有图像(*.jpg *.png *.bmp)"));
if(imageFilePath.isEmpty()){
qDebug()<<"图片读取失败";
return ;
}
//这里用.toUtf8().constData()而不是.toStdString(),
//原因是QString 通常存储为 UTF-16 编码,而 std::string 通常是基于系统的本地编码。
//因此,直接转换时,可能会遇到字符编码不一致或丢失的问题。
//对于需要严格管理编码的应用场景,可以使用 QString 的 toUtf8() 方法,将 QString 转换为 std::string 形式的 UTF-8 编码字符串
srcImage = cv::imread(imageFilePath.toUtf8().constData());
//将opencv的BGR图像转换为QImage的RGB对象
cv::cvtColor(srcImage, dstImage, cv::COLOR_BGR2RGB);
// Mat转换成QImage对象,srcImage.step表示图像每一行所占据的字节数。它考虑了图像每一行的像素数量以及每个像素的字节数(即通道数)。
QImage displayImg = QImage(dstImage.data, dstImage.cols, dstImage.rows, dstImage.step, QImage::Format_RGB888);
QImage pixmap = setImageSize(displayImg, ui->srcImage);
//解锁图像处理按钮
ui->pushButton_edge->setEnabled(true);
ui->pushButton_gray->setEnabled(true);
ui->pushButton_mean->setEnabled(true);
}
这里保存了两幅图像,srcImage
和 dstImage
。其中,srcImage
表示的是原始图像,采用 OpenCV 的 BGR 格式进行存储;而 dstImage
则是经过处理后的图像,转换为 QT 可识别的格式。接下来,这两幅图像将在后续步骤中直接被调用。
二.灰度图像
灰度部分没什么好说的,处理出来grayImg图像。用作后面边缘检测。
// 灰度
void MainWindow::on_pushButton_gray_clicked()
{
// 灰度处理
cv::cvtColor(srcImage, grayImg, cv::COLOR_BGR2GRAY);
// Mat转换成QImage对象,srcImage.step表示图像每一行所占据的字节数。它考虑了图像每一行的像素数量以及每个像素的字节数(即通道数)。
QImage displayImg = QImage(grayImg.data, grayImg.cols, grayImg.rows, grayImg.step, QImage::Format_Grayscale8);
QImage pixmap = setImageSize(displayImg, ui->dstImage);
}
三.均值滤波
接下来是均值滤波
// 均值滤波
void MainWindow::on_pushButton_mean_clicked()
{
//灰度图像是单通道的,而彩色图像是三通道的,如果通道不对应会导致显示不正确。
cv::blur(grayImg, meanImage, cv::Size(4,4));
// Mat转换成QImage对象,srcImage.step表示图像每一行所占据的字节数。它考虑了图像每一行的像素数量以及每个像素的字节数(即通道数)。
QImage displayImg = QImage(meanImage.data, meanImage.cols, meanImage.rows, meanImage.step, QImage::Format_Grayscale8);
QImage pixmap = setImageSize(displayImg, ui->dstImage);
}
1.均值滤波
先说一下各参数作用:
cv::Size(4, 4):内核大小,即模糊窗口的宽度和高度。在这个例子中,4 表示 4x4 的窗口。
cv::blur 通过 4x4 的窗口对 srcImage 进行均值模糊。对于图像中的每个像素,它会计算周围 4x4 区域内所有像素的平均值,然后用这个平均值替换原像素的值。
如果你想让模糊效果更强,可以增大内核的尺寸,例如 cv::Size(8, 8)。
如果你想让模糊效果更弱,可以减小内核的尺寸,例如 cv::Size(2, 2)。
目的:减少噪声:模糊处理可以平滑图像,减少随机噪声(例如光学图像中的高频噪声)。
降低细节:图像中的边缘和细节会被模糊掉,变得更加平滑。
上图为均值滤波处理灰度图,均值滤波还可以处理彩色图像,下面是处理彩色图像和灰度图的写法对比。
cv::blur(dstImage, meanImage, cv::Size(3,3));
//cv::blur(grayImg, meanImage, cv::Size(3,3));
QImage displayImg = QImage(meanImage.data, meanImage.cols, meanImage.rows, meanImage.step, QImage::Format_RGB888);
//QImage displayImg = QImage(meanImage.data, meanImage.cols, meanImage.rows, meanImage.step, QImage::Format_Grayscale8);
原图像从灰度图变为RGB图,注意,不要用BGR图,不然会识别失败且使用QImage::Format_RGB888
:告诉 Qt 该图像是 3 通道 RGB 格式,每个像素用 8 位表示每个通道的颜色值。
展示一下处理结果:
接下来,我会详细分析均值滤波算法以及其原理
均值滤波算法(Mean Filtering):
均值滤波是最简单的一种平滑方法。它通过计算图像中某个像素邻域内所有像素的平均值来替换中心像素的值。其具体操作为在图像中定义一个固定大小的窗口(核),并对这个窗口内的像素值进行平均,结果赋给中心像素。(核这个东西后面再细说)
假设核为 k × k 大小,均值滤波的公式为:
接下来详细解释一下这个公式
:
这是滤波之后图像在位置 (x,y) 上的像素值。经过滤波操作,原图像的每个像素值都会被邻域像素值的加权和替代。
:
这是归一化因子,用来确保滤波之后的值位于合理的范围内。在这里,滤波核的大小为 k×k,因此归一化因子是 。这是为了计算均值,将求和后的值除以核的面积,得到平均值。这里可先粗略理解核为周围的多少像素矩阵(窗口)。
:
这是双重求和符号,表示对图像的局部区域进行累加。具体来说:
i和j是从 到 的偏移量(假设 k 是奇数)。这个范围表明滤波器从中心点向四周扩展,总共覆盖一个k×k 的局部区域。
内层求和 遍历 j 的变化,表示在 y 方向上(竖直方向)的邻域像素值的累加。
外层求和 遍历 i 的变化,表示在 x 方向上(水平方向)的邻域像素值的累加。
:
这是图像 在位置 (x+i,y+j) 的像素值。这里 i 和 j 的范围决定了我们在图像上取出的局部邻域的范围。
在每次求和时,我们都在图像上访问 (x,y) 位置的邻域像素,将这些值求和,再乘以归一化因子 以得到均值。
参数含义:
cv::blur(grayImg, meanImage, cv::Size(4,4));
i 和 j 不是直接输入的参数,而是由 k 推导出来的偏移量。如果 k=3(cv::Size(3,3)),则:
i 的取值范围是 −1 到 1(即 到 向下取整)。
j 的取值范围也是 −1 到 1。
这表示滤波时你要计算中心像素点(x,y) 周围的 8 个像素点(即 3×3 的邻域)。
一句话总结:
该公式的含义是计算出指定像素框内所有像素点的总和,再除以像素框的大小,从而得出该区域内像素的平均值。
均值滤波特点:
- 核中所有像素的权重相同:均值滤波中的权重分配是均匀的,每个像素的贡献都是相同的,无论是距离中心像素近还是远。
- 边缘模糊程度较高:由于均值滤波不考虑像素间的权重差异,它会使边缘区域也模糊化,因此图像中的噪声和边缘细节都可能被模糊。
- 速度较快:均值滤波计算简单,因为只需要计算窗口内像素的平均值,所以计算速度较快。
应用场景:
- 去除图像中的随机噪声:均值滤波可以去除图像中的小幅度随机噪声(如椒盐噪声),但对于保留边缘细节的要求较高的场景,均值滤波效果较差。
- 初步平滑:在一些对图像细节要求不高的场景中,均值滤波可以作为一种简单的平滑操作。
缺点:
- 边缘保留能力差:均值滤波会导致图像的边缘细节严重模糊,因为它对所有邻域像素赋予相同的权重。
- 对噪声抑制能力有限:均值滤波虽然可以平滑掉随机噪声,但同时也会模糊图像中的重要信息,导致细节丢失。
均值滤波是常用的两种平滑(模糊)滤波器中的其中一种,另外一种是高斯滤波。
2.高斯滤波
高斯滤波算法(Gaussian Blur):
高斯模糊是基于高斯函数的加权平均滤波器。它和均值滤波的区别在于:在高斯模糊中,离中心像素越远的像素对结果的影响越小,这由高斯分布函数决定。具体公式为:
其中,x 和 y 是像素相对中心的偏移, 是标准差,控制模糊的强度。
:
这是二维高斯函数,描述了图像处理中的高斯滤波器的响应。它对任意坐标点 (x,y) 进行平滑处理。
:
是用于归一化的常数,使得二维高斯函数在整个平面上的积分为 1。这样可以确保这个函数是一个概率密度函数(PDF)。
概率密度函数(Probability Density Function,简称 PDF)是一个用于描述连续型随机变量的概率分布的函数。它定义了一个随机变量在某个取值范围内出现的概率密度。
概率密度函数的一个重要性质是,整个范围内的概率和必须为 1。即,PDF 在整个定义域上的积分为 1。
PDF 的曲线给出了随机变量在不同值处的概率密度。例如,对于正态分布,PDF 的形状是钟形曲线,表示大部分取值集中在均值附近,而远离均值的取值概率则逐渐减小。
是方差,代表高斯分布的扩展程度。方差越大,高斯核越分散;方差越小,高斯核越集中。
:
e 是自然对数的底数(约等于 2.718),在高斯函数中控制的是衰减速度。
:
是高斯函数的指数部分,定义了从中心点 (0,0) 开始向外扩散的方式。
:
表示平面上任意点 (x,y) 到中心点 (0,0) 的欧几里得距离的平方。距离中心越远,函数值越小。
:
控制这个衰减的速率。方差 越大,衰减得越慢,曲线越平坦;反之,衰减越快,曲线越陡峭。
这就是不同的值的高斯分布形状和扩展效果。
高斯滤波计算过程:
首先我们假设高斯滤波的标准差 σ=1.5,核大小为 3×3.
(1)原图矩阵:假设有一个5*5的图像矩阵作为原图。
(2)生成高斯权重矩阵:生成一个 3×3 的高斯核,权重由二维高斯函数公式计算。
中心为(0,0),九个点坐标如下:
接着计算权重,带入公式求出G(x,y)并放入对应矩阵框。
(3)归一化:权重矩阵中的所有元素之和作为归一化因子,将每个权重除以这个因子。目的是保证所有值和为1.
权重和=0.0947+0.1238+0.0947+0.1238+0.1573+0.1238+0.0947+0.1238+0.0947=1.0313
(4)卷积操作:先取左上角的九位数进行卷积操作。也就是原图矩阵中位置 (2, 2) 的像素。
对应位置乘以归一化的权重矩阵。
将所有结果相加,得到最终卷积结果。
1.1016+2.1618+2.295+2.6422+4.270+3.603+1.836+2.8824+2.4786=23.2706
也就是(2,2)的点,原图为28的灰度值在高斯滤波处理后变为23.2706的新灰度值。
这个值表示图像中像素的灰度值。灰度值是用来描述一个像素的亮度或颜色强度的数字参数。0:完全黑色,255:完全白色。
参数含义:
cv::GaussianBlur(grayImg, grayImg, cv::Size(5, 5), 1.5);
cv::Size(5, 5):
和均值滤波的size用法相同,即在图像上应用的高斯模糊窗口的尺寸。表示使用一个 5x5 的矩阵作为高斯核的大小。
高斯核的大小(卷积核的尺寸)控制了模糊的范围。尺寸越大,卷积会处理的像素邻域越多,模糊效果就越强。5x5 意味着每个像素的模糊结果将基于它周围 5x5 的像素邻域(25个像素)来计算。
1.5
(标准差,σ):
这是高斯函数中的标准差 σ,它决定了模糊的“强度”或“程度”。
标准差越大,模糊效果越明显;标准差越小,模糊效果越轻微。
标准差 σ 决定了权重的分布范围:当 σ 较小时,邻近像素权重较高,远离的像素权重较低,因此模糊程度较轻;当 σ 较大时,远处像素也会对当前像素的模糊有较大的影响,导致模糊效果增强。
一句话总结:
根据一个像素周围的像素值,给出一个新的值。根据像素之间的距离来决定模糊的效果。离中心较近的像素影响较大,远离中心的像素影响较小。
高斯模糊特点:
- 权重根据高斯函数分布:高斯模糊对距离中心较近的像素赋予更大的权重,远离中心的像素权重较小,这使得模糊效果更加自然。
- 边缘保留能力较好:由于高斯滤波器对邻域内的像素进行加权平均,它对图像的平滑效果更好,同时边缘细节的模糊程度相对均值滤波要低。
- 平滑噪声的同时保留更多的图像细节:高斯模糊在去噪的同时能够较好地保留图像的边缘和细节信息,因此它常用于图像处理的预处理阶段。
应用场景:
- 噪声去除:高斯模糊可以有效去除图像中的高频噪声(如白噪声),并且能较好地保留图像的边缘和细节。
- 边缘检测前的预处理:高斯模糊经常用作边缘检测(如 Canny 边缘检测)的预处理步骤,去除噪声的同时保留边缘信息。
- 模糊化特效:在图像处理中,高斯模糊经常用于图像模糊化特效,因其模糊效果更加柔和自然。
缺点:
- 计算复杂度略高:相比于均值滤波,高斯滤波的计算复杂度更高,因为每个像素的权重是不同的,需要根据高斯函数进行计算。
3.高斯滤波与均值滤波对比
特性 | 均值滤波 | 高斯模糊 |
---|---|---|
权重分配 | 均匀分布,所有像素权重相同 | 权重根据高斯分布,距离中心越远权重越小 |
边缘保留能力 | 较差,边缘容易被模糊 | 较好,边缘模糊较少 |
计算复杂度 | 计算简单,速度较快 | 计算复杂,速度略慢 |
模糊效果 | 较生硬,容易丢失细节 | 模糊效果较为自然柔和 |
噪声去除效果 | 去噪效果一般,易丢失图像细节 | 去噪效果好,同时保留图像细节 |
高斯滤波和均值滤波均为线性图像滤波,是指最终生成的像素值是由邻域像素值线性混合而成。
下面这张图为均值滤波处理。
下面这张图是高斯滤波处理,采样均用size(5,5),高斯滤波设置σ为1.5。
可以一定程度上看出,高斯滤波对细节的处理要好于均值滤波。
4.一些其他的滤波算法
中值滤波(Median Filter)
-
原理:中值滤波是一种非线性滤波方法,它使用像素邻域的中间值来代替中心像素值。与均值滤波不同的是,它不会被极端值影响,因此更适合处理含有噪声(特别是椒盐噪声)的图像。
-
优点:非常适合去除椒盐噪声(黑白点噪声),并且在保持边缘清晰方面表现得较好。
-
缺点:对于某些复杂的噪声和高频细节,它的效果不如高斯模糊。
-
应用场景:医学图像处理、去除图像中的随机噪声(如椒盐噪声)。
双边滤波(Bilateral Filter)
-
原理:双边滤波是一种保持边缘的模糊算法,它结合了空间域和像素值域的高斯函数,在模糊图像的同时,保留图像的边缘特征。它不仅根据像素的空间距离,还根据像素的颜色相似性来决定模糊的权重。
-
优点:能够平滑图像的同时保留边缘,非常适合处理需要保留清晰边界的图像。
-
缺点:计算开销较大,处理速度比高斯模糊慢。
-
应用场景:常用于图像降噪,同时保持图像的清晰度和边缘锐利度。适合摄影图片处理,避免丢失细节。
非局部均值滤波(Non-Local Means Filter)
-
原理:非局部均值滤波不单单使用邻近的像素来进行平滑,而是根据图像中相似的块来进行去噪。它会在整个图像中找到相似的图像块,并根据这些相似性来进行平均平滑处理。
-
优点:去噪效果非常好,特别是在保留图像纹理的同时,能够有效地去除噪声。
-
缺点:计算复杂,速度较慢。
-
应用场景:高质量去噪,医学图像处理,特别是需要保留图像的局部细节和纹理的应用。
引导滤波(Guided Filter)
-
原理:引导滤波是一种基于输入图像或其他引导图像的滤波方法。它根据引导图像的局部线性模型来对输入图像进行滤波。引导滤波能够在平滑图像的同时,保持细节和边缘。
-
优点:计算效率高,效果类似于双边滤波,但速度更快。能够保留边缘并进行有效的平滑。
-
缺点:虽然效果接近双边滤波,但在一些极端情况下效果可能稍差。
-
应用场景:图像增强、HDR(高动态范围)图像处理、图像细节强化。
自适应双边滤波(Adaptive Bilateral Filter)
-
原理:自适应双边滤波是对双边滤波的改进,它动态调整滤波器参数,适应不同区域的不同噪声水平,从而更灵活地处理复杂的图像。
-
优点:在处理图像的不同区域时更加灵活,适合复杂的噪声环境。
-
缺点:比标准双边滤波计算复杂,速度较慢。
-
应用场景:适合图像中包含多个不同噪声区域的复杂场景,常用于图像增强。
方框滤波(Box Filter)
-
原理:类似均值滤波,但它使用的核是一个全为 1 的矩阵,对每个像素周围的邻域进行简单平均。
-
优点:计算非常快速,适合需要简单快速模糊的场景。
-
缺点:不能保留图像的细节,模糊效果粗糙,容易丢失边缘信息。
-
应用场景:适用于对性能要求很高、对模糊效果要求不高的场景。
方向性滤波(Directional Filter)
-
原理:方向性滤波是一种基于方向的模糊技术,它在特定的方向上对图像进行平滑。可以用来处理图像中的某些结构化噪声或图像的局部方向性纹理。
-
优点:能够处理具有方向性的噪声或图像中的结构化细节。
-
缺点:适用于特定场景,泛用性不强。
-
应用场景:在图像处理中需要处理方向性纹理或者去除特定方向噪声时使用。
卷积模糊(Convolutional Blur)
-
原理:卷积模糊使用预定义的卷积核对图像进行卷积操作。这种方法可以模仿高斯模糊、均值模糊等多种模糊效果,卷积核的形状和权重决定了模糊效果的性质。
-
优点:灵活性高,可以根据需求自定义不同的卷积核。
-
缺点:需要对卷积核进行设计和调整,计算效率视卷积核大小而定。
-
应用场景:适合需要自定义模糊效果或进行更复杂的图像滤波操作时使用。
递归高斯滤波 (Recursive Gaussian Filtering)
-
原理:递归高斯滤波通过利用高斯函数的递归特性,实现快速的高斯模糊操作。与传统的高斯卷积不同,它将计算过程分解为多个小步骤,通过递归方式逐步逼近高斯核的效果,从而减少计算复杂度。
-
优点:计算效率高,特别适用于大核尺寸的模糊处理,能够在较短时间内完成高斯模糊。适合实时处理,如视频流和大图像。
-
缺点:效果上与标准高斯滤波略有差异,对某些精细模糊需求的场景,可能需要额外调整。
-
应用场景:适用于需要快速进行高斯模糊的场景,如实时视频处理、大图像的降噪和平滑、图像预处理等。
拉普拉斯滤波 (Laplacian Filtering)
-
原理:拉普拉斯滤波利用图像的二阶导数来突出图像的边缘和高频部分。通过对图像应用拉普拉斯算子(通常为一个卷积核),可以增强图像的边缘特征并进行边缘检测。
-
优点:边缘检测效果好,能够突出图像中的细节和边缘,适用于需要增强图像锐度和高频细节的应用。
-
缺点:对噪声敏感,容易放大图像中的噪声,因此通常需要结合其他滤波方法(如高斯模糊)进行预处理。
-
应用场景:广泛用于边缘检测、图像锐化、图像增强、医学图像分析和计算机视觉任务,尤其在需要突出细节和高频特征的场景中。
由于篇幅有限,这些滤波算法尤其是拉普拉斯滤波和递归高斯滤波,会在以后的篇幅中再详细介绍。
标签:qt5.15,均值,高斯,VS2019,模糊,滤波,像素,图像 From: https://blog.csdn.net/weixin_44741151/article/details/141904197