Advertisement

OpenCV学习笔记:基本的图像处理

阅读量:

本教程介绍了如何使用OpenCV中的四种线性滤波器对图像进行平滑处理:归一化块滤波器(blur)、高斯滤波器(GaussianBlur)、中值滤波器(medianBlur)和双边滤波器(bilateralFilter)。归一化块滤波器通过均值加权系数实现平滑效果;高斯滤波器使用高斯内核进行加权卷积;中值滤波器通过对像素邻域取中值实现去噪;双边滤波器结合空间和灰度差值进行加权过滤。每种方法都有其特点和适用场景,并附有对应的OpenCV函数及其参数说明。

本教程旨在指导您掌握多种线性滤波器的应用方法,并教会您如何利用这些工具对图像进行有效的平滑处理。该模块具体提供了多个OpenCV函数功能介绍与调用方法说明,请参考后续章节详细讲解

该方法能够实现图像模糊效果的提升

核心内容涉及该文档的详细解释。

Note

基于 Richard Szeliski 的著作《Computer Vision: Algorithms and Applications》(http://szeliski.org/Book/)以及《Learning OpenCV》是该领域的经典教材

平滑 也称 模糊 , 是一项简单且使用频率很高的图像处理方法。

平滑处理具有多种应用领域,在此教程中我们仅专注于其降噪功能(其他应用将在后续课程中探讨)

平滑处理时需要用到一个 滤波器 。 最常用的滤波器是 线性 滤波器,线性滤波处理的输出像素值 (i.e.

g

) 是输入像素值 (i.e.

f

)的加权和 :

g = um_{k,l} f h
h

称为 , 它仅仅是一个加权系数。

我们可以将 滤波器 视为具有加权系数的一个滑动窗口,在对图像进行平滑处理的过程中,我们通过将这一窗口在整个图像上移动来实现细节的模糊。

滤波器的种类有很多, 这里仅仅提及最常用的:

归一化块滤波器(Normalized Box Filter)是一种基于图像处理技术的方法,在OpenCV官方文档中提供了该算法的详细描述

最基本的空间域滤波器其输出结果等于核窗口内所有参与计算的像素值的平均数其中每个像素具有相同的权重

核如下:

K = frac{1}{K_{width} dot K_{height}} egin{bmatrix}    1 & 1 & 1 & ... & 1      1 & 1 & 1 & ... & 1      . & . & . & ... & 1      . & . & . & ... & 1      1 & 1 & 1 & ... & 1   nd{bmatrix}

Gaussian Smoothing Filter (Gaussian Filter) )

虽然效率不高(但效果非常出色)。 虽然效率不高(但效果非常出色)。 高斯滤波是一种通过将输入数据的每个像素点与其邻域区域按照高斯函数加权平均来生成新的图像处理方法。

还记得1维高斯函数的样子吗?

../../../../_images/Smoothing_Tutorial_theory_gaussian_0.jpg

若将图像视为一维结构,则可观察到如下现象:在图像中处于中心位置的像素具有最大的加权系数;而位于周围边缘区域各像素点与其对应中心点之间的距离越大,则其加权系数越低。

Note

2维高斯函数可以表达为 :

G_{0} = A  e^{ frac{ -^{2} }{ 2igma^{2}{x} } +  frac{ -^{2} }{ 2igma^{2}{y} } }

其中

u

为均值 (峰值对应位置),

igma

代表标准差 (变量

x

和 变量

y

各有一个均值,也各有一个标准差)

mediate filter (median filter) [http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.html#median-filter "Permalink to this headline"]

该方法通过中值滤波技术,在图像处理过程中对每个像素进行操作。具体而言,在每个目标像素周围设定一个基于当前像素为中心的正方形领域,并对该领域的所有相关 pixels 取其中值作为新的 target pixel 值。

双像素滤波技术 (Bilateral Filter)

  • 目前我们了解的滤波器都是为了 平滑 图像, 问题是有些时候这些滤波器不仅仅削弱了噪声, 连带着把边缘也给磨掉了。 为避免这样的情形 (至少在一定程度上 ), 我们可以使用双边滤波。
  • 类似于高斯滤波器,双边滤波器也给每一个邻域像素分配一个加权系数。 这些加权系数包含两个部分, 第一部分加权方式与高斯滤波一样,第二部分的权重则取决于该邻域像素与当前像素的灰度差值。
  • 详细的解释可以查看 链接

源码

该程序的功能是什么? * 读取并加载一张待处理的图像

  • 在处理过程中, 该程序将综合运用包括图像平滑在内的4种不同的滤波技术. (具体方法可参考原理部分)

获取代码文件 : 单击此处

代码一瞥:

复制代码
    #include "opencv2/imgproc/imgproc.hpp"#include "opencv2/highgui/highgui.hpp"usingnamespacestd;usingnamespacecv;/// 全局变量intDELAY_CAPTION=1500;intDELAY_BLUR=100;intMAX_KERNEL_LENGTH=31;Matsrc;Matdst;charwindow_name[]="Filter Demo 1";/// 函数申明intdisplay_caption(char*caption);intdisplay_dst(intdelay);/** *  main 函数 */intmain(intargc,char**argv){namedWindow(window_name,CV_WINDOW_AUTOSIZE);/// 载入原图像src=imread("../images/lena.jpg",1);if(display_caption("Original Image")!=0){return0;}dst=src.clone();if(display_dst(DELAY_CAPTION)!=0){return0;}/// 使用 均值平滑if(display_caption("Homogeneous Blur")!=0){return0;}for(inti=1;i<MAX_KERNEL_LENGTH;i=i+2){blur(src,dst,Size(i,i),Point(-1,-1));if(display_dst(DELAY_BLUR)!=0){return0;}}/// 使用高斯平滑if(display_caption("Gaussian Blur")!=0){return0;}for(inti=1;i<MAX_KERNEL_LENGTH;i=i+2){GaussianBlur(src,dst,Size(i,i),0,0);if(display_dst(DELAY_BLUR)!=0){return0;}}/// 使用中值平滑if(display_caption("Median Blur")!=0){return0;}for(inti=1;i<MAX_KERNEL_LENGTH;i=i+2){medianBlur(src,dst,i);if(display_dst(DELAY_BLUR)!=0){return0;}}/// 使用双边平滑if(display_caption("Bilateral Blur")!=0){return0;}for(inti=1;i<MAX_KERNEL_LENGTH;i=i+2){bilateralFilter(src,dst,i,i*2,i/2);if(display_dst(DELAY_BLUR)!=0){return0;}}/// 等待用户输入display_caption("End: Press a key!");waitKey(0);return0;}intdisplay_caption(char*caption){dst=Mat::zeros(src.size(),src.type());putText(dst,caption,Point(src.cols/4,src.rows/2),CV_FONT_HERSHEY_COMPLEX,1,Scalar(255,255,255));imshow(window_name,dst);intc=waitKey(DELAY_CAPTION);if(c>=0){return-1;}return0;}intdisplay_dst(intdelay){imshow(window_name,dst);intc=waitKey(delay);if(c>=0){return-1;}return0;}

详细分析OPCVcn官网文档中的这一部分内容

下面看一看有关平滑的OpenCV函数,其余部分大家已经很熟了。

归一化块滤波器:

OpenCV函数 blur 完成了归一化块滤波处理。

复制代码
    for(inti=1;i<MAX_KERNEL_LENGTH;i=i+2){blur(src,dst,Size(i,i),Point(-1,-1));if(display_dst(DELAY_BLUR)!=0){return0;}}

我们输入4个实参 (详细的解释请参考 Reference):

源图像:输入图像
目标图像:输出图像
核心参数:定义内核大小为_w_像素宽度与_h_像素高度
平滑点设置:指定平滑点的位置为(-1, -1),若采用负值,则以核中心作为平滑点

高斯滤波器:

基于OpenCV的图像处理函数 GaussianBlur 被广泛应用于图像去噪

复制代码
    for(inti=1;i<MAX_KERNEL_LENGTH;i=i+2){GaussianBlur(src,dst,Size(i,i),0,0);if(display_dst(DELAY_BLUR)!=0){return0;}}

我们输入4个实参 (详细的解释请参考 Reference):

  • src : 输入图像
  • dst : 输出图像
  • Size(w, h) : 定义内核的大小(需要考虑的邻域范围)。
w

h

必须是正奇数,否则将使用

igma_{x}

igma_{y}

参数来计算内核大小。

igma_{x}

: x 方向标准方差, 如果是

0

igma_{x}

使用内核大小计算得到。

igma_{y}

: y 方向标准方差, 如果是

0

igma_{y}

使用内核大小计算得到。.

中值滤波器:

该算法基于图像去噪的原理进行处理。 OpenCV中的medianBlur函数通过中值滤波器完成图像去噪运算。

复制代码
    for(inti=1;i<MAX_KERNEL_LENGTH;i=i+2){medianBlur(src,dst,i);if(display_dst(DELAY_BLUR)!=0){return0;}}

我们用了3个参数:

  • src: 源图像

  • dst: 目标图像, 必须保持一致的类型特征

  • i: 内核尺寸(仅需单一设定),必须为奇数。

双边滤波器

改写说明

复制代码
    for(inti=1;i<MAX_KERNEL_LENGTH;i=i+2){bilateralFilter(src,dst,i,i*2,i/2);if(display_dst(DELAY_BLUR)!=0){return0;}}

我们使用了5个参数:

复制代码
 * _src_ : 输入图像
 *  _dst_ : 输出图像
 *  _d_ : 像素的邻域直径
igma_{Color}

: 颜色空间的标准方差
*

igma_{Space}

: 坐标空间的标准方差(像素单位)

结果

程序显示了原始图像( lena.jpg) 和使用4种滤波器之后的效果图。

这里显示的是使用 中值滤波 之后的效果图:

Smoothing with a median filter

全部评论 (0)

还没有任何评论哟~