【图像处理OpenCV(C++版)】——5.3 图像平滑之均值平滑(滤波)

这篇具有很好参考价值的文章主要介绍了【图像处理OpenCV(C++版)】——5.3 图像平滑之均值平滑(滤波)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

😊😊😊欢迎来到本博客😊😊😊

🌟🌟🌟 本专栏主要结合OpenCV和C++来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快速查询等,随时更新。

😊😊😊 具体食用方式:可以点击本专栏【OpenCV快速查找(更新中)】–>搜索你要查询的算子名称或相关知识点,或者通过这篇博客👉通俗易懂OpenCV(C++版)详细教程——OpenCV函数快速查找(不断更新中)]查阅你想知道的知识,即可食用。

🎁🎁🎁支持:如果觉得博主的文章还不错或者您用得到的话,可以悄悄关注一下博主哈,如果三连收藏支持就更好啦!这就是给予我最大的支持!😙😙😙


学习目标

  • 了解均值平滑含义
  • 熟悉均值卷积核的构建及分离
  • 熟悉快速均值平滑原理及实现
  • C++实现均值平滑、快速均值平滑案例

  每一张图像都可能包含某种程度的噪声,噪声可以理解为由一种或者多种原因造成的灰度值的随机变化。
  在大多数情况下,通过平滑技术(也常称为滤波技术)进行抑制或者去除,其中具备保持边缘(Edge Preserving)作用的平滑技术得到了更多的关注。
  常用的平滑处理算法包括基于二维离散卷积高斯平滑、均值平滑,基于统计学方法的中值平滑,具备保持边缘作用的平滑算法的双边滤波、导向滤波等。

  下面将详细介绍均值平滑技术原理、常见应用及实现。


一、均值卷积核的构建及分离性

1.1 相关概念

  均值平滑,顾名思义,图像中每一个位置的邻域的平均值作为该位置的输出值

  高为H、宽为W 的均值卷积算子的构建方法很简单,令所有元素均为1/(W*H),即:

均值平滑滤波除不尽,# OpenCV(C++),图像处理,opencv,c++,均值算法,计算机视觉
  其中,W、H均为奇数,锚点位置为 [(H-1)/2,(W-1)/2]。

1.2 均值卷积核构建与分离

  与高斯滤波核一样,均值平滑算子也是可分离卷积核,即:

均值平滑滤波除不尽,# OpenCV(C++),图像处理,opencv,c++,均值算法,计算机视觉

  例如:5行3列的均值平滑算子可以进行以下分离:

均值平滑滤波除不尽,# OpenCV(C++),图像处理,opencv,c++,均值算法,计算机视觉

  代码实现与分离的高斯卷积是类似的,只需将高斯算子替换成均值算子即可。利用卷积核的分离性和卷积的结合律。
  虽然减少了运算量,但是随着卷积核窗口大小的增加,计算量仍会继续增大,可以利用图像的积分,实现时间复杂度为O(1)的快速均值平滑


二、快速均值平滑

  学习快速均值平滑之前,先了解一下图像的积分。r行c列的图像矩阵I的积分Integral可以这样定义:

均值平滑滤波除不尽,# OpenCV(C++),图像处理,opencv,c++,均值算法,计算机视觉

  即任意一个位置的积分等于该位置左上角所有值的和。例如:

均值平滑滤波除不尽,# OpenCV(C++),图像处理,opencv,c++,均值算法,计算机视觉

  同时,也可以利用矩阵的积分,计算出矩阵中任意矩形区域的和

均值平滑滤波除不尽,# OpenCV(C++),图像处理,opencv,c++,均值算法,计算机视觉

  例如:计算I的以(2,2)为中心,从左上角(rTop,cLeft)=(1,1)至右下角(rBottom,cRight)=(3,3)的矩形区域的和:

均值平滑滤波除不尽,# OpenCV(C++),图像处理,opencv,c++,均值算法,计算机视觉

  可以从积分后的图像矩阵中找到对应的值计算:

均值平滑滤波除不尽,# OpenCV(C++),图像处理,opencv,c++,均值算法,计算机视觉
均值平滑滤波除不尽,# OpenCV(C++),图像处理,opencv,c++,均值算法,计算机视觉

即:5+1+7+1+5+9+2+6+2=54+1-8-9

  均值平滑的原理本质上是计算任意一个点的邻域的平均值,而平均值是由该邻域的和除以邻域的面积得到的。这样无论怎样改变平滑窗口的大小,都可以利用图像的积分图快速计算每个点的邻域的和

  对于图像积分,OpenCV提供了函数:


void cv::integral(InputArray src,
OutputArray sum,
int sdepth = -1 
)	
参数 解释
src 输入H×W矩阵,数据类型为CV_8U、CV_32F或者为CV_64F
sum 输出矩阵,大小为(H+1)×(W+1)
depth 输出图位深,若为-1则与src一致

  接下来介绍OpenCV均值平滑函数及C++实现快速均值平滑。


三、 C++实现

3.1 均值平滑

  OpenCV提供了函数:

void cv::blur(InputArray src,
		OutputArray dst,
		Size ksize,
		Point anchor = Point(-1,-1),
		int borderType = BORDER_DEFAULT 
)
参数 解释
src 输入矩阵,数据类型为CV_8U、CV_32F或者为CV_64F
dst 输出矩阵,大小和数据类型与src一致
ksize 均值平滑卷积核尺寸大小,Size(宽,高)
anchor 锚点,Point(-1,-1)表示中心点
borderType 边界扩充类型

注:边界扩充说明

均值平滑滤波除不尽,# OpenCV(C++),图像处理,opencv,c++,均值算法,计算机视觉

  例如:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <cmath>
#include <opencv2/imgproc.hpp>

using namespace std;
using namespace cv;

int main(){
	cv::Mat src=cv::imread("image/path");
	cv:Mat dst;
	cv::blur(src,dst,Size(3,3),cv::Point(-1,-1));
	cv::imshow("src",src);
	cv::imshow("dst",dst);
	cv::waitKey(0);
	
	return 0;

均值平滑滤波除不尽,# OpenCV(C++),图像处理,opencv,c++,均值算法,计算机视觉

  还有一个函数,也能实现均值平滑功能:


void cv::boxFilter(InputArray src,
		OutputArray dst,
		int ddepth,
		Size ksize,
		Pointanchor = Point(-1,-1),
		bool normalize = true,
		int borderType = BORDER_DEFAULT 
)	
参数 解释
src 输入矩阵,数据类型为CV_8U、CV_32F或者为CV_64F
dst 输出矩阵,大小和数据类型与src一致
depth 输出图位深,若为-1则与src一致
ksize 均值平滑卷积核尺寸大小,Size(宽,高)
anchor 锚点,Point(-1,-1)表示中心点
normalize 是否归一化
borderType 边界扩充类型(具体详见上面blur())

3.2 快速均值平滑

  通过定义函数fastMeanBlur()来实现快速均值平滑,其中该函数的参数image代表输入图像winSize代表平滑窗口的尺寸borderType代表边界扩充类型。具体代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <cmath>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;

//快速均值平滑滤波
cv::Mat fastMeanBlur(cv::Mat image,cv::Size winSize,int boderType,Scalar value=Scalar()) {
	//判断滑动窗口大小是否为奇数
	int hei = winSize.height;
	int wei = winSize.width;
	CV_Assert(hei % 2 == 1 && wei  % 2 == 1);
	
	//滑动窗口的中心点
	int h_center = (hei - 1) / 2;
	int w_center = (wei - 1) / 2;

	//滑动窗口面积
	float area = float(hei * wei);
	cv::Mat padImg;
	//边界扩充
	cv::copyMakeBorder(image,padImg,h_center, h_center,w_center,w_center,boderType,value);

	//图像积分
	cv::Mat integralImage;
	cv::integral(padImg, integralImage,CV_32FC1);

	//输入图像矩阵宽高
	int cols = image.cols;
	int rows = image.rows;
	int c = 0, r = 0;
	
	Mat meanImage = Mat::zeros(image.size(), CV_32FC1);
	for (int h = h_center;h < h_center+rows; h++)
	{
		for (int w = 0; w < w_center+cols; w++)
		{
			float BottomRight = integralImage.at<float>(h + h_center + 1, w + w_center + 1);
			float TopLeft = integralImage.at<float>(h - h_center, w - w_center);
			float TopRight = integralImage.at<float>(h + h_center + 1, w -w_center);
			float BottomLeft = integralImage.at<float>(h - h_center,w + w_center+1);
			meanImage.at<float>(r, c) =(BottomRight + TopLeft - TopRight - BottomLeft) / area;
			c++;
		}
		r++;
		c = 0;
	}
	return meanImage;
}
	
}	

四、 总结

  最后,长话短说,大家看完就好好动手实践一下,切记不能三分钟热度、三天打鱼,两天晒网。OpenCV是学习图像处理理论知识比较好的一个途径,大家也可以自己尝试写写博客,来记录大家平时学习的进度,可以和网上众多学者一起交流、探讨,有什么问题希望大家可以积极评论交流,我也会及时更新,来督促自己学习进度。希望大家觉得不错的可以点赞、关注、收藏。文章来源地址https://www.toymoban.com/news/detail-761602.html


🚶🚶🚶 今天的文章就到这里啦~
喜欢的话,点赞👍、收藏⭐️、关注💟哦 ~
均值平滑滤波除不尽,# OpenCV(C++),图像处理,opencv,c++,均值算法,计算机视觉

到了这里,关于【图像处理OpenCV(C++版)】——5.3 图像平滑之均值平滑(滤波)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【图像处理OpenCV(C++版)】——5.5 图像平滑之双边滤波

    前言 : 😊😊😊 欢迎来到本博客 😊😊😊 🌟🌟🌟 本专栏主要结合OpenCV和C++来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快速查询等,随时更新。 😊😊😊 具体食用方式:可以点击本专栏【OpenCV快速查找(更新中)】–搜索你要查询的算子

    2024年02月13日
    浏览(31)
  • python --opencv图像处理滤波详解(均值滤波、2D 图像卷积、方框滤波、 高斯滤波、中值滤波、双边滤波)

    第一件事情还是先做名词解释,图像平滑到底是个啥? 从字面意思理解貌似图像平滑好像是在说图像滑动。 emmmmmmmmmmmmmmm。。。。 其实半毛钱关系也没有,图像平滑技术通常也被成为图像滤波技术(这个名字看到可能大家会有点感觉)。 每一幅图像都包含某种程度的噪声,

    2024年02月04日
    浏览(37)
  • opencv 31-图像平滑处理-方框滤波cv2.boxFilter()

    方框滤波(Box Filtering)是一种简单的图像平滑处理方法,它主要用于去除图像中的噪声和减少细节,同时保持图像的整体亮度分布。 方框滤波的原理很简单:对于图像中的每个像素,将其周围的一个固定大小的邻域内的像素值取平均,然后将这个平均值赋值给当前像素。这

    2024年02月14日
    浏览(32)
  • opencv-34 图像平滑处理-双边滤波cv2.bilateralFilter()

    双边滤波(BilateralFiltering)是一种图像处理滤波技术,用于平滑图像并同时保留边缘信息。与其他传统的线性滤波方法不同,双边滤波在考虑像素之间的空间距离之外,还考虑了像素之间的灰度值相似性。这使得双边滤波能够有效地去除噪声,同时保持图像的细节和边缘。

    2024年02月14日
    浏览(25)
  • opencv(15) 图像平滑处理之二:cv2.GaussianBlur()高斯滤波

    高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。 高斯模板是通过对二维高斯函数进行采样(高斯模糊的卷积核里的数值满足高斯分布)、量化并归一化得到的,它考虑了邻域像素位置的影响,距离当前被平滑像素越近的点,加权系数越大

    2024年02月10日
    浏览(32)
  • Opencv-C++笔记 (13) : opencv-图像卷积一(均值、中值、高斯、双边滤波)与 边缘处理

    头文件 quick_opencv.h:声明类与公共函数 主函数调用 src:输入图像 。 dst:输出图像 。 ksize:内核大小 ,一般用 Size(w,h),w 为宽度,h 为深度。 anchor:被平滑的点,表示取 内核中心 ,默认值 Point(-1,-1)。 boderType:推断图像外部像素的某种边界模式。默认值 BORDER_DEFAULT 目的:

    2024年02月16日
    浏览(31)
  • 图像处理:均值滤波算法

    目录 前言 概念介绍 基本原理 Opencv实现均值滤波 Python手写实现均值滤波 参考文章 在此之前,我曾在此篇中推导过图像处理:推导五种滤波算法(均值、中值、高斯、双边、引导)。这在此基础上,我想更深入地研究和推导这些算法,以便为将来处理图像的项目打下基础。

    2023年04月23日
    浏览(73)
  • Matlab图像处理-均值滤波

    均值滤波 均值滤波所使用的运算是卷积。均值滤波用邻域内像素的平均值来代替中心像素的值,相当于低通滤波,有将图像模糊化的趋势,对椒盐噪声基本无能为力。 在 MATLAB 中,可使用 imfilter 函数 来实现线性空间滤波,该函数的语法如下 : J = imfilter ( I,w,filtering_mode,bound

    2024年02月06日
    浏览(36)
  • 数字图像处理(七)均值滤波

    题目:使用均值滤波器对图像进行滤波。 采用国际标准测试图像Lena。 3*3的均值滤波器定义如下: c++代码: 结果展示: 均值滤波器的特点: 计算均值会将图像中的边缘信息和特征信息模糊掉,丢失很多特征,使得景物的清晰度降低,画面变得模糊。对于高斯噪声,当滤波器

    2024年02月11日
    浏览(78)
  • (数字图像处理MATLAB+Python)第六章图像平滑-第一节:图像平滑概述和空间域平滑滤波

    图像平滑(Image Smoothing) :是一种数字图像处理技术,用于减少图像中的 噪声 和 不规则性 ,使图像更加平滑和连续。在图像中,噪声通常表现为不规则的、突出的像素值,这可能会导致图像细节丢失,使其难以进行分析和处理。图像平滑技术可以通过对像素值进行滤波来

    2023年04月24日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包