(OpenCV+Python)图像腐蚀膨胀 开闭运算 线性滤波 非线性滤波_第1页
(OpenCV+Python)图像腐蚀膨胀 开闭运算 线性滤波 非线性滤波_第2页
(OpenCV+Python)图像腐蚀膨胀 开闭运算 线性滤波 非线性滤波_第3页
(OpenCV+Python)图像腐蚀膨胀 开闭运算 线性滤波 非线性滤波_第4页
(OpenCV+Python)图像腐蚀膨胀 开闭运算 线性滤波 非线性滤波_第5页
已阅读5页,还剩15页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

图像腐蚀与膨胀

我们在前两次教程中概述了OpenCV对于图像的滤波,通常对于一个实战项

目而言,滤波之后的下一步操作就是图像的形态学处理了,从本次教程开始,我

们正式步入了OpenCV图像形态学处理的部分。

形态学(morphology)一词通常表示生物学的一个分支,该分支主要研究动

植物的形态和结构。而我们图像处理中指的形态学,往往表示的是数学形态学。

下面一起来了解数学形态学的概念。

数学形态学是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形

态学图像处理的基木理论。其基木的运算包括:二值腐蚀和膨胀,二值开闭运算、

骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、

流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等。

简单来讲,形态学操作就是基于形状的一系列图像处理操作。OpenCV为进

行图像的形态学变换提供了快捷、方便的函数。最基本的形态学操作有二种,他

们是:膨胀与腐蚀(Dilation与Erosion)o

膨胀与腐蚀能实现多种多样的功能,主要如下

消除噪声。

分割出独立的图像元素,在图像中连接相邻的元素。

寻找图像中的明显的极大值区域或极小值区域。

求出图像的梯度。

腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。膨胀就是图

像中的高亮部分进行膨胀,“领域扩张”,效果图拥有比原图更大的高亮区域。腐

蚀就是原图中的高亮部分被腐蚀,”领域被蚕食”,效果图拥有比原图更小的高亮

区域。

▼膨胀

其实,膨胀就是求局部最大值的操作。

按数学方面来说,膨胀或者腐蚀操作就是将图像(或图像的一部分区域,我

们称之为A)与核(我们称之为B)进行卷积。

核可以是任何的形状和大小,它拥有一个单独定义出来的参考点,我们称其

为锚点。多数情况下,核是一个小的中间带有参考点和实心正方形或者圆盘,其

实,我们可以把核视为模板或者掩码。

而膨胀就是求局部最大值的操作,核B与图形卷积,即计算核B覆盖的区

域的像素点的最大值,并把这个最大值赋值给参考点指定的像素。这样就会使图

像中的高亮区域逐渐增长。如下图所示,这就是膨胀操作:

我们来看一下函数原型:

cv2.dilate(img,kernel,iterations)->dst

第一个参数:img指需要膨胀的图。

第二个参数:kernel指膨胀操作的内核,默认是一个简单的3X3矩阵,我们

也可以利用gctStructuringElcment()函数指明它的形状。

第三个参数:iterations指的是膨胀次数,省略是默认为1。

dst则为返回的图像。

定义卷积核需要用到Numpy中的函数,它可以定义一个矩形的卷积核结构

元素,我们来看一下代码:

importcv2importnumpyasnpimg=cv2.imread('01.jpg',O)kernel=

np.ones((5,5),np.uint8)dict=cv2.dilate(img,kernel,iterations=

I)cv2.imshow("org",img)cv2.imshow("result",

dict)cv2.waitKey(0)cv2.destroyAllWindows()

我们定义了一个5*5的矩形卷积核,效果:

事实上,在某些情况下,我们可能需要椭圆形/圆形的内核。因此,为此,

OpcnCV具有一个函数cv.getStructuringElemcnt()。我们只需传递内核的形状和

人小,即可获得所需的内核,函数原型:

ietval=cv.getStructuringElement(shapc,ksize[,anchor])

这个函数的第一个参数表示内核的形状,有三种形状可以选择。

矩形:MORPH_RECT

交叉形:MORPH_CROSS

椭圆形:MORPH_ELLIPSE

[[HU1][[00100][[00100]

[11111][11111][00100]

[11111][11111][11111]

[11111][11111][00100]

innHl[00100]][00100]]

知形结构精用结构十字形结构

第二和第三个参数分别是内核的尺寸以及锚点的位置。一般在调用erode以

及dilate函数之前,先定义一个变量来获得。

getStructuringElement函数的返回值:对于锚点的位置,有默认值Point

(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,

锚点只是影响了形态学运算结果的偏移。

我们看一下代码:

importcv2importnumpyasnpimg=cv2.imread('01.jpg',O)kernel=

cv2.getStructuringElcmcnt(cv2.MORPH_ELLIPSE,(5,5))dict=

cv2.dilate(img,kernel,iterations=I)cv2.imshow("orgn,irng)cv2.irnshow("result",

dict)cv2.waitKey(0)cv2.destroyAllWindows()

至于卷积核的形状我在这里选择了椭圆形,大家可以自己选择其他形状进行

实验:

▼腐蚀

再来看一下腐蚀,膨胀和腐蚀是一对好友,是相反的一对操作,所以腐蚀就

是求局部最小值的操作。我们一般都会把腐蚀和膨胀对应起来理解和学习。下文

就可以看到,两者的函数原型也是基本上一样的。

我们来看一下函数原型:

cv2.erode(img,kernel,iterations)->dst

第一个参数:img指需要腐蚀的图。

第二个参数:kernel指腐蚀操作的内核,默认是一个简单的3X3矩阵,我们

也可以利用getStructuringElement()函数指明它的形状。

第三个参数:iterations指的是腐蚀次数,省略是默认为1。

▼开运算

开运算指的就是龙一图像先进行腐蚀操作,然后再进行膨胀操作,而通常情况

下,它是对图像的明亮的区域进行操作,可以消除图像中的白噪声,现在我们来

看例子,先看一幅图像:

现在我们想要消除图像中的黑色的毛刺,但是如果直接对图像进行开运算是

不行的,因为开运算是对图像的明亮区域进行操作,看一下直接进行开运算会有

什么效果:

importcv2importnumpyasnpimg=cv2.imreadCopen.jpg',0)kernel=

cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))open

=cv2.moq7hologyEx(img,cv2.MORPII_OPEN,kemel)cv2.imshow("img'\img)cv

2.imshow("result",opcn)cv2.waitKcy(0)cv2.dcstroyAHWindows()

可以看到,图像的毛刺没有被去除,现在我们需要将原图进行阈值化翻转,

也就是黑白颠倒,这样才方便进行形态学的处理,我们在前面阈值部分讲过,这

里就不再讲述了,直接看代码:

importcv2importnumpyasnpimg=cv2.imreadCopen.jpg',O)threshold=

cv2.threshold(img,(),255,cv2.THRESH_BINARYJNV|cv2.THRESH_OTSU)[l]

cv2.imshow("img,,,img)cv2.imshow(',thres",threshold)cv2.waitKey(0)cv2.destro

yAHWindowsO

现在图像已经被黑白颠倒了过来,现在我们可以开始进行开运算了,当然首

先也是需要定义一个卷积核的,这在上个教程中已经谈到,在这里我们定义一个

3*3的矩形卷积核:

importcv2importnumpyasnpimg=cv2.imreadCopen.jpg',O)threshold=

cv2.threshold(img,(),255,cv2.THRESH_BINARY」NV|cv2.THRESH_OTSU)[l]

kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))open

=cv2.morphologyEx(threshold,cv2.MORPH_OPEN,kernel)cv2.imshow("img,,,i

mg)cv2.imshow("thres",threshold)cv2.imshow("result",

opcn)cv2.waitKcy(0)cv2.dcstroyAHWindows()

这样效果就显而易见了,如果我们将卷积核改成5*5的呢:

importcv2importnumpyasnpimg=cv2.imreadCopen.jpg',O)threshold=

cv2.threshold(img,0,255,cv2.THRESH_BINARY」NV|cv2.THRESH_OTSU)[l]

kernel=cv2.getSlrucluringElement(cv2.MORPH_RECTX5,5))open

=cv2.morphologyEx(threshold,cv2.MORPH_OPEN,kernel)cv2.inishow("thresu,t

hreshold)cv2.imshow("resultn,open)cv2.waitKcy(0)cv2.destroyAUWindows()

I-

这就说明操作过度了,所以对于形态学处理卷积核的适当选取是非常重要

的,现在我们对处理之后的图像进行还原:

importcv2importnumpyasnpimg=cv2.imreadCopen.jpg',O)threshold=

cv2.threshold(img,0,255,cv2.THRESH_BINARYJNV|cv2.THRESH_OTSU)[l]

kernel=cv2.getStructuringElemenl(cv2.MORPH_RECT,(3,3))open

=cv2.morphologyEx(threshold,cv2.MORPH_OPEN,kernel)result=

cv2.threshold(open,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[

I]cv2.imshow("img",img)cv2.imshow("thrcs,,,thrcshold)cv2.imshow(',opcn",

open)cv2.imshow('result",result)cv2.waitKey(0)cv2.destroyAHWindows()

看一下最终还原的结果:

事实上,卷积核的灵活运用将会极大的方便图像的形态学处理,我们来进行

一个实战,比如现在给出一幅图像:

我们将用开运算分别提炼出横线和竖线,我们使用13*1的卷积核进行实验:

importcv2importnumpyasnpimg=cv2.imreadChengshu.jpg',())kernel=

cv2.getStructuringElement(cv2.MORPH_RECT,(l3,l))open

=cv2.morphologyEx(img,cv2.MORPH_OPEN,kcrncl)cv2.imshow(',inig",img)cv

2.imshow("openn,open)cv2.waitKey(0)cv2.destroyAHWindows()

是不是很神奇,现在我们使用1*13的卷积核进行实验:

importcv2importnumpyasnpimg=cv2.imreadChengshu.jpg',())kernel=

cv2.getStructuringElement(cv2.MORPH_RECT,(1,13))open

=cv2.morphologyEx(img,cv2.MORPH_OPEN,kerneI)cv2.imshow("imgH,ime)cv

2.imshow("open",open)cv2.waitKey(0)cv2.destroyAHWindows()

竖线也被完美的提取出来了,在以后的项目实战中,我们将会用到这些知识,

合理的过滤掉图像中多余的信息,事实上,我们还发现,处理之后的图像偏暗,

没有原图那么明亮,这在下次教程中的顶帽一一黑帽操作中可以进行处理。

▼闭运算

我们折腾r半天的开运算,现在我们来玩玩团运算,闭运算跟开运算相反,

是先膨胀再腐蚀,它通常被用来去除图像明亮区域内部的噪声。我们来看一幅图

像:

现在我们将要用闭运算去除图像明亮区域内部的黑点,定义一个7*7的卷积

核,我们看代码:

importcv2importnumpyasnpimg=cv2.imreadCclose.jpg',())kernel=

cv2.getStructuringElement(cv2.MORPH_RECT,(7,7))open

=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)cv2.imshow(Mimg",img)c

v2.imshow("open",open)cv2.wailKey(0)cv2.destroyAHWindows()

可以看到,效果很好,现在我们来进行另一个具有实战意义的实验,先看图

片:

44为援,

我图.为牟9

打动近慢,

可泳附见>我而士一多.

我们需要将这些字轮廓提炼出来,并且用方桂标定出来,每一行字用一个方

框标定出来,当然,这个涉及到以后将要讲解的轮廓提取以及轮廓近似,但是在

这里我们先进行一个实验,如果我们想将每一行字用一个方框标定出来,那么首

先需要满足的条件就是每一行的字必须连在一块,形成一个整体,这样的话才可

以用OpcnCV提取他们整体的轮廓,进而标定出来,但现在我们看到这些字都是

独立的,它们并没有连在一起,这个时候我们就可以采用闭运算了。

我们来看代码:

importcv2importnumpyasnpimg=cv2.imread('text1.jpg',())kernel=

cv2.gelSlructuringElement(cv2.MORPH_RECT,(21,5))open

=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kcrnel)cv2.imshow("img",img)c

v2.imshow("open'\open)cv2.waitKey(0)cv2.destroyAHWindows()

■Jima-□XIclose一□X

44为抵,IT

我廛为车,AM.

行动茁慢,

可论曾见武后是一些.

这样的话所有的字体连在一起,这也方便了后期的轮廓提取。

我在这里给出综合代码,大家可以玩玩:

importcv2importnumpyasnpimg=cv2.imread('text1.jpg^test=

img.copyOgray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)kernel=

cv2.getStructuringElement(cv2.MORPH_RECT,(19,5))close=

cv2.morphologyEx(gray,cv2.MORPH_CLOSE,kcrnel)contour,_=

cv2.findContours(close,cv2.RETR_EXTERNAL,

cv2.CHAIN_APPROX_SlMPLE)cv2.dra\vCon(ours(test,contour,-1,(0,0,255),

2)forcincontour:x,y,w,h=cv2.boundingRect(c)cv2.rectangle(img,(x,y),

(x+w,y+h),(0,0,255),2)cv2.imshow("result,,,

img)cv2.imshow(,,test",test)cv2.imshow(,'close",

close)cv2.waitKey(0)cv2.destroyAHWindows()

人夕为"*人“为援;

我及.为春>帝&为卒9

可论曾见我忘士一多.可为曾处我后正一多.

第一个图是对图像的轮廓进行提取,第二个则是提取轮廓的外接矩形,是不

是很有意思,这在以后都会慢慢讲述。

闭运算一般则被用于处理内部噪声情况,开运算处理外部噪声情况,所以合

理的运用它们是非常重要的。

(OpenCV+Python)线性滤波&非线性滤波

线性滤波

本次教程将介绍几种OpenCV常用的滤波器,将介绍它们详细的原理,图像

滤波对于OpenCV图像处理来说是至关重要的一环,它在整个OpenCV中的分

量是举足轻重的,我们必须完完全全的掌握它。

图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑

制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像

处理和分析的有效性和可靠性。

消除图像中的噪声成分叫作图像的平滑化或滤波操作。信号或图像的能量大

部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经

常被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。

图像滤波的目的有两个:

一是抽出对象的特征作为图像识别的特征模式。

另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声。

而对•滤波处理的要求也有两条:

一是不能损坏图像的轮廓及边缘等重要信息。

一是使图像清晰神帝效果好。

平滑滤波是低频增强的空间域滤波技术。它的目的有两类:

一类是模糊。

一类是消除噪音。

空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的平均亮度

值。邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,

平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻

域的大小。

关于滤波器,一种形象的比喻法是:我们可以把滤波器想象成一个包含加权

系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像之上,

透过这个窗口来看我们得到的图像。

▼原理

邻域算子(局部算子)是利用给定像素周围的像素值的决定此像素的最终输

HI值的一种算子。而线性邻域滤波是一种常用的邻域算子,像素的输出值取决于

输入像素的加权和,具体过程如下图:

6995116125129132

6S力110120126132

6686KM114124132

62・8108

5769839S11:124

53607185100114

"(•3)gW)

左边图像与中间图像的卷积产生右边图像。目标图像中蓝色标记的像素是利

用原图像中红色标记的像素计算得到的。

邻域算子除了用于局部色调调整以外,还可以用于图像滤波,实现图像的平

滑和锐化,图像边缘增强或者图像噪声的去除。本篇文章,我们介绍的主角是线

性邻域滤波算子,即用不同的权重去结合一个小邻域内的像素,来得到应有的处

理效果。

线性滤波处理的输出像素值是输入像素值的加权和:

其中的加权和我们称其为“核”,滤波器的加权系数,即滤波器的“滤波系

数“0

上面的式子可以简单写作:

其中f表示输入像素值,h表示加权系数”核“,g表示输出像素值

在新版本的OpcnCV中,提供了如下三种常用的线性滤波操作,他们分别被

封装在单独的函数中,使用起来非常方便:

均值滤波一一blur函数

方框滤波——boxblur函数

高斯滤波---GaussianBlur函数

▼均值滤波器

均值波波器是一种低通滤波器,也是线性滤波器。对于一幅图像,我们都知

道其像素值在0-255,通常来讲,滤波器所用的一个滤波模板都为奇数,这里我

们以3*3为例:

INPUTIMAGE

~51

5512175789588

3524204113109221

315410423525130

1525322515978233

68&51802142450

中间黄色部分即为滤波器的模板(卷积核),其将用于与图像进行卷积进而

滤波,对于均值滤波器,顾名思义,其像素点为中间九个像素值的均值,从而将

整个图像的像素用这个均值像素代替:

g(x,y)/”)

函数原型:

dst=cv.blur(src,ksize[,dst[,anchor[,bcrderType]]])

其中第一个参数为输入的图像,第二个参数为卷积核的大小,后面的我们都

采用默认值就可以。

给出示例代码:

importcv2importniatplotlib.pyplotaspitimportnumpyasnpimg=

cv2.imread("cat.jpg")blur=

cv2.blur(img,(5,5))cv2.imshow("org",img)cv2.imshow("result",

blur)cv2.waitKey(0)cv2.destroyAllWindows()

缺陷:均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在

图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去

除噪声点。特别是椒盐噪声。

▼方框滤波器

事实上,方框滤波器与均值滤波渊是基本上一样的,我们直接看源码:

importcv2importmatplotlib.pyplotaspitimportnumpyasnpimg=

cv2.imrcad(,,shu.jpg',)blur=

cv2.boxFilter(img,-l,(3,3),normalize=False)cv2.imshow("org",img)cv2.imshow(

"result",blur)cv2.waitKcy(0)cv2.dcstroyAllWindows()

boxFilter则为i方框滤波函数,当

normalize=True

它就完全相当于是一个均值滤波器,滤波像素值计算方法也是均值计算,如

图:

但是当

normalize二False

其并非均值,而是卷积核中所有的像素值相加,不除9,那么对于大于255

的值,它会全取255进行代替,如图:

▼高斯滤波

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理

的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个

像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波

的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模

板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值

先来了解一下高斯函数,高斯分布函数指的就是概率论中的正态分布的概率

密度函数,均值口二0时的一维形式和二维形式如下。其中。为正态分布的标准

偏差,其值决定了函数的衰减快慢。

1X2

G(x)=e2d

V27T(T

1%2+y2

从这两个公式不难看出,二维公式其实等于两个一维函数相乘。从概率论角

度看,因为随机变量X,Y是相互独立的,那么他们的联合概率密度就等于边缘

概率密度之积。这个特性是非常重要的,现在让我们先看一下高斯函数的图像分

布与二维高斯卷积核的样子:

008s

006、

0.04、

0.02、

0

50

50

40

30

20

10

00

2321

25652

1

36863

84

25652

12321

图像上,靠近原点的位置地势高,距离原点越远则地势越低。相应地,卷积

核也是中心数值最大,并向四周减小,减小的幅度并不是随意的,而是要求整个

卷积核近似高斯函数的图像。由于高斯滤波实质是一种加权平均滤波,为了实现

平均,核还带有一个系数,例如上图中的十六分之一、八十四分之一,这些系数

等于矩阵中所有数值之和的倒数。

可能有人看不太懂,我简单解释一下高斯滤波的原理,以下面那个数字图为

例:

INPUTIMAGE

185451239244188

5512175789588

3524204113109221

315410423525130

1525322515978233

68&51802142450

假设中间的204为中心点,高斯滤波的原理就是距离中心点最近其权重系数

越大,就类似这样一个图:

/气I小

5球MJ

那么距离204越近则其权重系数越大,它跟均值滤波还是有很大不同的,均

值滤波对于204周闱的75和24这两个较小值非常的不友好,会导致误差较大。

但是高斯波波表示,离我近的,吃嘛嘛香,离我远的,说话分量就没有那么重了,

不管你值有多大或者多小。我们看一下函数原型:

GaussianBlur(src>ksize,sigmaX[,dst[,sigmaY[,borderType]]])->dst

src输入图像;图像可以具有任意数量的通道,这些通道可以独立处理,但

深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。

dsi输出图像的大小和类型与src相同。

ksize高斯内核大小。ksize.width和ksize.height可以不同,但它们都必须为

正数和奇数,也可以为零,然后根据sigma计算得出。

sigmaXX方向上的高斯核标准偏差。

sigmaYY方向上的高斯核标准差;如果sigmaY为零,则将其设置为等于

sigmaX;如果两个sigmas为零,则分别从ksize.width和ksize.height计算得出;

为了完全控制结果,而不管将来可能对所有这些语义进行的修改,建议指定所有

ksize,sigmaX和sigmaYo

我们来看代码:

importcv2importmatplotlib.pyplotaspitimportnumpyasnpimg=

cv2.imread(',shu.jpg',)blur=

cv2.GaussianBlur[img,(3,3),0)CY2.imshow("org”,img)cv2.imshow("resuIt",

blur)cv2.waitKey(0)cv2.destroyAHWindows()

我们可以看到,三种线性滤波器都无法很好的去除图片中的椒盐噪声,而要

想去除椒盐噪声,我们需要用非线性滤波器,这将在下次介绍。现在我们来总结

一下这二种滤波器:

三曾比

san材祥

使用<1及内加41代.RK中g*左发.3收加■发疗F犹.不应全

不用%-的中g・T量•么fiASIB

加JMI号匕1!”1不逢GJ

为8EQW加,器之行彳漕盟.0战内硒仁宜X被整对匿,老行照射浜药.

・于不冏的税0度分IW征

非线性滤波

我们在上个教程中谈到了线性滤波,相比较而言,线性滤波中的高斯滤波最

为受欢迎,但是我们也遗留了一个问题,线性滤波对于椒盐噪声的过滤并不是很

好,由此我们本次将谈到OpcnCV中的非线性滤波。

之前我们说的线性滤波,即两个信号之和的响应和他们各自响应之和相等。

换句话说,每个像素的输出值是一些输入像素的加权和,线性滤波器易于构造,

并且易于从频率响应角度来进行分析工

其实在很多情况下,使用邻域像素的非线性滤波也许会得到更好的效果。比

如在噪声是散粒噪声而不是高斯噪声,即图像偶尔会出现很大的值的时候。在这

种情况下,用高斯滤波器对图像进行模糊的话,噪声像素是不会被去除的,它们

只是转换为更为柔和但仍然可见的散粒。这就到了中值滤波登场的时候了。

▼中值滤波

中值淀波是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的

中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时又能保

留图像边缘细节。

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技

术,其基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值

的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点,对于斑点

噪声和椒盐噪声来说尤其有用,因为它不依赖于邻域内那些与典型值差别很大的

值。中值滤波器在处理连续图像窗函数时与线性滤波器的工作方式类似,但滤波

过程却不再是加权运算。

中值漉波在一定的条件下可以克服常见线性滤波器如最小均方流波、方框滤

波器、均值滤波等带来的图像细节模糊,而且对淀除脉冲干扰及图像扫描噪声非

常有效,也常用于保护边缘信息,保存边缘的特性使它在不希望出现边缘模糊的

场合也很有用,是非常经典的平滑噪声处理方法。

顾名思义,中值滤波选择每个像素的邻域像素中的中值作为输出,或者说中

值滤波将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度道的

中值。

通俗的来讲,就找中位数嘛,仍然以那个图为例:

INPUTIMAGE

185451239244188

5512175789588

3524204113109221

315410423525130

1525322515978233

68851802142450

我们将值从小到大排列一下:

247578104113121154204235

那么中间值就是113了。

一般采用奇数点的邻域来计算中值,但如果像素点数为偶数时,中值就取排

序像素中间两点的平均值。

中值滤波对于去除椒盐噪声特别的有效,我们先来看一下椒盐噪声的定义:

椒盐噪声是由图像传感器,传输信道,解码史理等产生的黑白相间的亮喑点

噪声。椒盐噪声是指两种噪声,一种是盐噪声(sailnoise)盐=白色(255),另一

种是胡椒噪声(peppernoise),楸=黑色(0)。前者是高灰度噪声,后者属于低灰

度噪声。一般两种噪声同时出现,呈现在图像上就是黑白杂点。对于彩色图像,

则表现为在单个像素BGR三个通道随机出现的255与0,而中值滤波的取值恰

恰是中间值,所以会将这些极端值过滤掉,我们来看函数原型:

dst=cv.mcdianBlur(src,ksize[,dst])

dst为输出的图像

src为输入的图像

ksize为卷积核的大小,它必须为奇数且大于1

代码如下:

niportcv2importmatplotlib.pyplotaspltimportnumpyasnpimg=

cv2.imread(',shu.jpg',)blur=

cv2.mcdianBlur(img,3)cv2.imshow("org",img)cv2.imshow("result",

blur)cv2.waitKey(0)cv2.destro

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论