python等值线图平滑_python 简单图像处理(10) 空间域图像平滑

图象平滑的主要目的是减少图像噪声

图像噪声来自多方面,常见的噪声有以下几种:

加性噪声、乘性噪声、量化噪声、椒盐噪声

减少噪声的方法可以在空间域或是在频率域

在空间域,基本方法是求像素的平均值或中值

在频率域,运用的是低通滤波技术

在这里我们只讲空间域的图象平滑。频率域以后有机会再讲

空间域的各种滤波器虽然形状不同,但在空间域实现图像滤波的方法是相似的。

都是利用模板卷积,即将图像模板下的像素与模板系数的乘积求和操作。

我们先来看3×3的模板:

我们先来看看领域平均法:

常用的平滑掩模算子有

我们写程序来实现:

importcvdefFilter(image,array):

w=image.width

h=image.height

size=(w,h)

iFilter=cv.CreateImage(size,8,1)foriinrange(h):forjinrange(w):ifiin[0,h-1]orjin[0,w-1]:

iFilter[i,j]=image[i,j]else:

a=[0]*9forkinrange(3):forlinrange(3):

a[k*3+l]=image[i-1+k,j-1+l]

sum=0forminrange(9):

sum=sum+array[m]*a[m]

iFilter[i,j]=int(sum)returniFilter

H1=[1.0/9]*9H2=[1.0/10]*9H2[4]=0.2H3=[1.0/16,2.0/16,1.0/16,2.0/16,4.0/16,2.0/16,1.0/16,2.0/16,1.0/16]

H4=[1.0/8]*9H4[4]=0

image=cv.LoadImage('lena.jpg',0)

iH1F=Filter(image,H1)

iH2F=Filter(image,H2)

iH3F=Filter(image,H3)

iH4F=Filter(image,H4)

cv.ShowImage('image',image)

cv.ShowImage('iH1F',iH1F)

cv.ShowImage('iH2F',iH2F)

cv.ShowImage('iH3F',iH3F)

cv.ShowImage('iH4F',iH4F)

cv.WaitKey(0)

效果如下:

不同算子间差别很小,至少这幅图是这样的

我们再来看看中值滤波器

中值滤波器不存在算子的概念,只有窗口的概念

选取以某一点为中心的窗口,对窗口中所有点灰度值取中值,将灰度值的中值付给这一点。这就是中值滤波的全部

改造一下刚才的程序:

importcvdefMFilter(image):

w=image.width

h=image.height

size=(w,h)

iMFilter=cv.CreateImage(size,8,1)foriinrange(h):forjinrange(w):ifiin[0,h-1]orjin[0,w-1]:

iMFilter[i,j]=image[i,j]else:

a=[0]*9forkinrange(3):forlinrange(3):

a[k*3+l]=image[i-1+k,j-1+l]

a.sort()

iMFilter[i,j]=a[4]returniMFilter

image=cv.LoadImage('lena.jpg',0)

iMF=MFilter(image)

cv.ShowImage('image',image)

cv.ShowImage('iMF',iMF)

cv.WaitKey(0)

看看效果:

中间为平均值滤波,右边是中值滤波。有没有看出差别?

我们来更直观的看看两种滤波方式对不同信号的处理效果吧

对线性信号,为了处理简单,我用的窗的长度为3

我们从效果可以看出中值平滑只对特别尖锐的信号平滑,而平均值平滑对所有的信号都平滑

所有平均值平滑不仅消除了噪声,还损失了原图中陡峭的边缘

对于含有点,线,尖角较多的图不适应采取中值滤波,他们容易被误认为噪声

好啦,简单的空域平滑滤波就讲到这里了

你可能感兴趣的:(python等值线图平滑)