C++调用OpenCV实现图像平滑处理-创新互联
图像的平滑处理,也叫做模糊处理,是在尽量保留原始图像信息的情况下,抑制或去除图像内的噪声、降低细节层次信息等一系列过程。是一种操作简单但使用频率很高的图像处理方法。由于实际的图像索引方式,与我们常用的x和y轴的定义方式不同,为了确保符号清晰,我们在空间坐标系中表示图像处理滤波器或图像时,一般使用n1和n2来分别表示x和y轴方向的离散坐标。
成都创新互联公司专注于网站建设,为客户提供成都网站建设、成都做网站、网页设计开发服务,多年建网站服务经验,各类网站都可以开发,品牌网站建设,公司官网,公司展示网站,网站设计,建网站费用,建网站多少钱,价格优惠,收费合理。比如:以一个像素为核心,其周围像素可以组成一个n1行n1列(简称n1 x n2)的矩阵,这样的矩阵结构在滤波操作中被称为“滤波核”。矩阵的行、列数,决定了滤波核的大小。如下图所示的滤波核大小为3x3,包含9个像素。
在OpenCV中,经常用到的二维图像平滑处理有以下4种:均值滤波、中值滤波、高斯滤波和双边滤波。本节我们一起看一下,用C++调用OpenCV接口,如何实现对图像的平滑处理。
2 均值滤波 2.1 原理均值滤波器是一种典型的线性滤波算法,可以把图像中的每一个像素当成滤波核的核心,然后计算核内所有像素的平均值,最后将核心像素值改成平均值。其计算过程如下图所示:
(89 + 134 + 206 + 198 + 24 + 140 + 154 + 199 + 89) / (3 x 3) = 137
滤波核大小是3 x 3,核心像素值是24,与周围像素值相比偏小,所以可以认为核心像素值是噪声。先将滤波核中的所有像素值相加,然后除以像素个数,就得出了平均值137。最后将核心像素值改成137,其颜色与周围像素颜色差别就不大了,图像看起来就变得平滑了。这就是均值滤波器降噪的原理。
2.2 关键接口C++调用OpenCV实现均值滤波的关键函数原型:
CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
Size ksize, Point anchor = Point(-1,-1),
int borderType = BORDER_DEFAULT );
2.3 代码实现参数说明:
参数1:被处理的图像
参数2:均值滤波处理之后的图像
参数3:滤波核大小,其格式为(高度,宽度),建议使用(3,3),(5,5),(7,7)等 宽、高相等的奇数边长。滤波核越大,处理之后的图像越模糊
参数4:滤波核的锚点,建议采用默认值,可以自动计算锚点
参数5:边界样式,建议采用默认值
示例代码采用5 x 5的滤波核,对图像进行均值滤波处理:
#include#includeusing namespace cv;
using namespace std;
//均值滤波对图像进行平滑处理
int main()
{
//定义滤波核大小5x5
int size = 5;
//打开原图
Mat img = imread("flower.jpg");
//打开失败
if (img.empty())
{
cout<< "打开图片失败"<< endl;
return -1;
}
Mat blurImg;
//均值滤波降低图像噪声
blur(img, blurImg, Size(size, size));
//显示原图像
imshow("原图", img);
//显示去噪后的图像
imshow("均值滤波", blurImg);
imwrite("blur.jpg", blurImg);
waitKey(0);
//关闭所有窗口
destroyAllWindows();
return 0;
}
2.4 效果图均值滤波器的主要作用是减少图像噪声。当图像中有高斯白噪声时,均值滤波器就可以降低该噪声,因为它可以在像素的相邻像素区域之间取平均值,所以零均值的白噪声将会被抑制。均值滤波器在减少白噪声方面做得比较好。
3 中值滤波 3.1 原理二维的中指滤波器原理与均值滤波器类似,不同的地方是不计算滤波核内像素的平均值,而是将所有像素值排序,然后把核心像素值,改成最中间的像素值。整个过程会将图像中的每个像素,以其滤波尺寸大小的邻域内像素强度的中值来替代。
其计算过程如下图所示:
3.2 关键接口24 89 89 134 140 154 198 199 206
C++调用OpenCV实现中值滤波的关键函数原型:
CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );
3.3 代码实现参数说明:
参数1:待处理的图像
参数2:中值滤波处理后的图像
参数3:滤波核大小,其值表示边长,必须是大于1的奇数 3,5,7等
#include#includeusing namespace cv;
using namespace std;
//中值滤波对图像进行平滑处理
int main()
{
//定义滤波核大小5x5
int size = 5;
//打开原图
Mat img = imread("flower.jpg");
//打开失败
if (img.empty())
{
cout<< "打开图片失败"<< endl;
return -1;
}
Mat medianblurImg;
//中值滤波降低图像噪声
medianBlur(img, medianblurImg, size, size);
//显示原图像
imshow("原图", img);
//显示去噪后的图像
imshow("中值滤波", medianblurImg);
imwrite("medianBlur.jpg", medianblurImg);
waitKey(0);
//关闭所有窗口
destroyAllWindows();
return 0;
}
3.4 效果图中值滤波器有利于去除椒盐噪声。椒盐噪声通常是在获取图像时,突然出现的扰动造成的,一般在图像中以黑白像素的形式出现。
4 高斯滤波 4.1 原理高斯滤波器是均值滤波器的修正版本,它将正态分布应用于图像处理中。滤波器中心位置的权重最高,越远离核心的像素权重越低,从中心点向外呈正态分布。像素权重不同不能取平均值,要从权重高的像素中取较多的信息,从权重低的像素中取较少的信息。其权重如下图所示:
高斯滤波的计算过程,涉及到卷积运算,会有一个与滤波核大小相同的卷积核。我们以3 x 3的滤波核为例,来描述一下计算过程。卷积核中保存的值,就是核所覆盖区域的权重值。卷积核中所有权重值相加,结果为1.
如下图所示的3 x 3卷积核。
高斯滤波的计算过程,就是将滤波核中的像素值,与卷积核进行卷积运算,最后将结束结果赋值给滤波核的核心像素。
滤波核中的每个像素值,与卷积核对应位置的权重值相乘,最后计算出9个值:
89 x 0.05 134 x 0.1 206 x 0.05 4.45 13.4 10.3
198 x 0.1 24 x 0.4 140 x 0.1 = 19.8 9.6 14
154 x 0.05 199 x 0.1 89 x 0.05 7.7 19.9 4.45
把这9个值累加,四舍五入取整:
4.45 + 13.4 + 10.3 + 19.8 + 9.6 + 14 + 7.7 + 19.9 + 4.45 = 103.6 ≈ 104
最后得到的这个结果,就是高斯滤波计算结果,滤波核核心像素值,从24改成了104。
4.2关键接口C++调用OpenCV实现高斯滤波的关键函数原型:
CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
double sigmaX, double sigmaY = 0,
int borderType = BORDER_DEFAULT );
4.3 代码实现参数说明:
参数1:待处理的图像
参数2:高斯滤波处理之后的图像
参数3:滤波核的大小,宽高必须是奇数,与均值滤波相同
参数4:卷积核水平方向的标准差,建议填0,会根据滤波核的大小自动计算合适的权重比例
参数5:卷积核垂直方向的标准差,建议填0,会根据滤波核的大小自动计算合适的权重比例
参数6:边界样式,建议使用默认值
#include#includeusing namespace cv;
using namespace std;
//高斯滤波对图像进行平滑处理
int main()
{
//定义滤波核大小5x5
int size = 5;
//打开原图
Mat img = imread("flower.jpg");
//打开失败
if (img.empty())
{
cout<< "打开图片失败"<< endl;
return -1;
}
Mat gaussImg;
//高斯滤波5x5降噪
GaussianBlur(img, gaussImg, Size(size, size), 0, 0);
//显示原图像
imshow("原图", img);
//显示去噪后的图像
imshow("高斯5x5", gaussImg);
imwrite("gauss.jpg", gaussImg);
waitKey(0);
//关闭所有窗口
destroyAllWindows();
return 0;
}
4.4 效果图高斯滤波也被叫做高斯模糊或高斯平滑,是目前应用最广泛的图像平滑处理算法。高斯滤波可以很好地降低图像噪声,同时将保留更多的细节层次,经过处理的图像,呈现“磨砂玻璃”的滤镜效果。
5 双边滤波 5.1 原理双边滤波器是一种非线性滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。双边滤波器会自动判断滤波核处于“平坦”区域还是“边缘”区域:如果滤波核处于“平坦”区域,则会使用类似高斯滤波的算法进行滤波;如果滤波核处于“边缘”区域,则加大“边缘”像素的权重,尽可能地让这些像素值保持不变。
5.2 关键接口C++调用OpenCV实现高斯滤波的关键函数原型:
CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace,
int borderType = BORDER_DEFAULT );
5.3 代码实现参数说明:
参数1:待处理的图像
参数2:双边滤波处理后的图像
参数3:以当前像素为中心的整个滤波区域的直径。如果d<0,则自动根据sigmaSpace参数 计算得到。该值与保留的边缘信息数量成正比,与方法运行效率成反比
参数4:参与计算的颜色范围,这个值是像素颜色值与周围颜色值的大差值,只有颜色值 之差小于这个值时,周围的像素才进行滤波计算。值为255时,表示所有颜色都参与计算
参数5:坐标空间的σ(sigma)值,该值越大,参与计算的像素数量就越多
参数6:边界样式,建议默认值
#include#includeusing namespace cv;
using namespace std;
//双边滤波对图像进行平滑处理
int main()
{
//定义滤波区域直径大小
int d = 5;
//打开原图
Mat img = imread("flower.jpg");
//打开失败
if (img.empty())
{
cout<< "打开图片失败"<< endl;
return -1;
}
Mat bfImg;
//双边滤波平滑处理
bilateralFilter(img, bfImg, d, 2 * d, d / 2);
//显示原图像
imshow("原图", img);
//显示去噪后的图像
imshow("双边滤波", bfImg);
imwrite("bilateral.jpg", bfImg);
waitKey(0);
//关闭所有窗口
destroyAllWindows();
return 0;
}
5.4 效果图前边介绍的均值滤波、中值滤波和高斯滤波,都会使整幅图像变得平滑,图像中的边界会变得模糊不清。双边滤波与它们不同的地方是,在平滑过程中可以有效保护边界信息。
6 测试项目 6.1 创建项目创建测试项目、配置开发环境,具体可参考之前文章,这里就不多说了
Win10+OpenCV4.6.0之开发环境(VS2022)配置入门_来灵的博客-博客
这次测试项目名称image_smoothing,VS2022种创建好的项目截图
文件目录截图
下边代码是四种滤波器的总代码,您也可以创建每个滤波器单独的代码,这里不再赘述。
#include#includeusing namespace cv;
using namespace std;
int main()
{
//定义滤波核大小5x5
int size = 5;
//定义滤波区域直径大小
int d = 5;
//打开原图
Mat img = imread("flower.jpg");
//打开失败
if (img.empty())
{
cout<< "打开图片失败"<< endl;
return -1;
}
Mat blurImg, medianblurImg, gaussImg, bfImg;
//均值滤波降低图像噪声
blur(img, blurImg, Size(size, size));
//中值滤波降低图像噪声
medianBlur(img, medianblurImg, size);
//高斯滤波5x5降噪
GaussianBlur(img, gaussImg, Size(size, size), 0, 0);
//双边滤波平滑处理
bilateralFilter(img, bfImg, d, 2 * d, d / 2);
//显示原图像
imshow("原图", img);
//显示处理后的图像
imshow("均值滤波", blurImg);
imshow("中值滤波", medianblurImg);
imshow("高斯滤波", gaussImg);
imshow("双边滤波", bfImg);
//保存处理后的图像
imwrite("blur.jpg", blurImg);
imwrite("medianBlur.jpg", medianblurImg);
imwrite("gauss.jpg", gaussImg);
imwrite("bilateral.jpg", bfImg);
//按下任何键结束程序
waitKey(0);
//关闭所有窗口
destroyAllWindows();
return 0;
}
6.2 效果图7 总结最后对四种常用的图像滤波器用途做以总结:
滤波器类型 | 用途 |
均值滤波 | 降低高斯白噪声 |
中值滤波 | 降低椒盐噪声 |
高斯滤波 | 降低图像噪声 |
双边滤波 | 降低图像噪声、同时保护图像边界信息 |
1 《Python OpenCV从入门到精通》明日科技
2 OpenCV: Image Filtering
3 OpenCV平滑图像_w3cschool
4 OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波) - 战争热诚 - 博客园
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网站标题:C++调用OpenCV实现图像平滑处理-创新互联
URL标题:http://scjbc.cn/article/iojph.html