OpenCV 图像模糊原理

简介: OpenCV 图像模糊原理

模糊原理


Smooth/Blur(平滑和模糊) 是图像处理中最简单和常用的操作之一。


使用该操作的原因之一就是为了给图像预处理时候降低噪声,把噪声与周围的数值平均一下就可以平滑噪声。


使用Smooth/Blur操作背后是数学的卷积计算,下面我们先来看一下卷积计算相关的知识:


卷积:通过两个函数f 和g 生成第三个函数的一种数学算子,表征函数f 与g经过翻转和平移的重叠部分的面积。


计算公式为:



其中:f()表示一副图像,i、j表示图像的行和列,h(k,l)表示卷积算子(卷积核)(也可以叫掩膜),k,l又可以叫窗口大小(掩膜的大小,比如3*3),g()表示输出的像素值;f()的第一行,第一列数据不要,边缘像素怎么处理后续会有介绍


通常这些卷积算子计算都是线性操作,所以又叫线性滤波


如下图:假设有6x6的图像像素点矩阵(灰色) ,黄色3x3是卷积算子


卷积过程:6x6上面有个3x3的窗口,这个3x3的窗口从左向右,从上向下移动


黄色的卷积算子乘以图像对应的像素点后,将得到的像素点值加在一起,取平均值赋给中心红色像素,作为卷积处理后的新的像素值



更形象的卷积过程如下面gif所示:



具体卷积计算过程


假设有一个卷积核(卷积算子)h,就一般为33的矩阵:



有一个待处理矩阵x:



hx的计算过程分为三步


第一步,将卷积核翻转180°,也就是成为了



第二步,将卷积核h的中心对准x的第一个元素,然后对应元素相乘后相加,没有元素的地方补0。



这样结果Y中的第一个元素值Y11=10+20+10+00+01+02±10±25±1*6=-16


第三步每个元素都像这样计算出来就可以得到一个输出矩阵,就是卷积结果



以此类推的计算每个元素。


最后结果为:



模糊分类


方框滤波


方框滤波内容请参考我的另一篇博文:


https://yangyongli.blog.csdn.net/article/details/121265592


归一化盒子滤波(均值滤波)


归一化盒子滤波(均值滤波): 就是上面的卷积计算,卷积算子(掩膜)中的格子权重都是1,所以卷积和之后还要除以卷积因子的大小取均值


公式



用到的API:


blur(
  Mat src, 
  Mat dst, 
  Size(xradius, yradius), 
  Point(-1,-1)
);


高斯滤波


高斯滤波: 相比于均值滤波,权重是不一样,但是权重和为1,所以计算卷积和之后不用取均值了。


公式:



用到API:


void GaussianBlur( 
  InputArray src, 
  OutputArray dst, 
  Size ksize,
  double sigmaX, 
  double sigmaY = 0
);


中值滤波与双边滤波


中值滤波与双边滤波内容请参考我的另一篇博文:


https://yangyongli.blog.csdn.net/article/details/121261236


代码示例



#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>  
using namespace cv;
int main(int argc, char** argv) {
  Mat src, dst;
  src = imread("./test2.jpg");
  if (!src.data) {
    printf("could not load image...\n");
    return -1;
  }
  char input_title[] = "input image";
  char output_title[] = "blur image";
  namedWindow(input_title, CV_WINDOW_AUTOSIZE);
  namedWindow(output_title, CV_WINDOW_AUTOSIZE);
  imshow(input_title, src);
  blur(src, dst, Size(11, 11), Point(-1, -1));
  imshow(output_title, dst);
  Mat gblur;
  GaussianBlur(src, gblur, Size(11, 11), 11, 11);
  imshow("gaussian blur", gblur);
  waitKey(0);
  return 0;
}


相关文章
|
2月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
378 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
3月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
51 4
|
3月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
4月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
4月前
|
计算机视觉 C++
基于VS2019和Opencv4,对hsv颜色空间的图像分割原理以及实现
这篇文章介绍了基于HSV颜色空间的图像分割原理,包括HSV模型的基本概念和如何在OpenCV中通过设置HSV的色彩范围来实现图像中特定颜色的物体分割,并通过示例代码展示了在静态图像和视频流中进行颜色分割的方法。
基于VS2019和Opencv4,对hsv颜色空间的图像分割原理以及实现
WK
|
4月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
115 1
|
6月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
183 1
|
6月前
|
运维 算法 计算机视觉
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
82 1
|
6月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
96 0
|
5月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。