python 简单图像处理(10) 空间域图像平滑
2010-12-29 09:53
399 查看
图象平滑的主要目的是减少图像噪声
图像噪声来自多方面,常见的噪声有以下几种:
加性噪声、乘性噪声、量化噪声、椒盐噪声
减少噪声的方法可以在空间域或是在频率域
在空间域,基本方法是求像素的平均值或中值
在频率域,运用的是低通滤波技术
在这里我们只讲空间域的图象平滑。频率域以后有机会再讲
空间域的各种滤波器虽然形状不同,但在空间域实现图像滤波的方法是相似的。
都是利用模板卷积,即将图像模板下的像素与模板系数的乘积求和操作。
我们先来看3×3的模板:
![](http://pic002.cnblogs.com/images/2010/221871/2010122822590369.png)
![](http://pic002.cnblogs.com/images/2010/221871/2010122823004683.png)
我们先来看看领域平均法:
常用的平滑掩模算子有
![](http://pic002.cnblogs.com/images/2010/221871/2010122823074649.png)
我们写程序来实现:
效果如下:
![](http://pic002.cnblogs.com/images/2010/221871/2010122823341255.jpg)
不同算子间差别很小,至少这幅图是这样的
我们再来看看中值滤波器
中值滤波器不存在算子的概念,只有窗口的概念
选取以某一点为中心的窗口,对窗口中所有点灰度值取中值,将灰度值的中值付给这一点。这就是中值滤波的全部
改造一下刚才的程序:
看看效果:
![](http://pic002.cnblogs.com/images/2010/221871/2010122908491424.jpg)
中间为平均值滤波,右边是中值滤波。有没有看出差别?
我们来更直观的看看两种滤波方式对不同信号的处理效果吧
![](http://pic002.cnblogs.com/images/2010/221871/2010122909472072.png)
对线性信号,为了处理简单,我用的窗的长度为3
我们从效果可以看出中值平滑只对特别尖锐的信号平滑,而平均值平滑对所有的信号都平滑
所有平均值平滑不仅消除了噪声,还损失了原图中陡峭的边缘
对于含有点,线,尖角较多的图不适应采取中值滤波,他们容易被误认为噪声
好啦,简单的空域平滑滤波就讲到这里了
图像噪声来自多方面,常见的噪声有以下几种:
加性噪声、乘性噪声、量化噪声、椒盐噪声
减少噪声的方法可以在空间域或是在频率域
在空间域,基本方法是求像素的平均值或中值
在频率域,运用的是低通滤波技术
在这里我们只讲空间域的图象平滑。频率域以后有机会再讲
空间域的各种滤波器虽然形状不同,但在空间域实现图像滤波的方法是相似的。
都是利用模板卷积,即将图像模板下的像素与模板系数的乘积求和操作。
我们先来看3×3的模板:
![](http://pic002.cnblogs.com/images/2010/221871/2010122822590369.png)
![](http://pic002.cnblogs.com/images/2010/221871/2010122823004683.png)
我们先来看看领域平均法:
常用的平滑掩模算子有
![](http://pic002.cnblogs.com/images/2010/221871/2010122823074649.png)
我们写程序来实现:
import cv def Filter(image,array): w = image.width h = image.height size = (w,h) iFilter = cv.CreateImage(size,8,1) for i in range(h): for j in range(w): if i in [0,h-1] or j in [0,w-1]: iFilter[i,j] = image[i,j] else: a= [0]*9 for k in range(3): for l in range(3): a[k*3+l] = image[i-1+k,j-1+l] sum = 0 for m in range(9): sum = sum+array[m]*a[m] iFilter[i,j] = int(sum) return iFilter H1 = [1.0/9]*9 H2 = [1.0/10]*9 H2[4] = 0.2 H3 = [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]*9 H4[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)
效果如下:
![](http://pic002.cnblogs.com/images/2010/221871/2010122823341255.jpg)
不同算子间差别很小,至少这幅图是这样的
我们再来看看中值滤波器
中值滤波器不存在算子的概念,只有窗口的概念
选取以某一点为中心的窗口,对窗口中所有点灰度值取中值,将灰度值的中值付给这一点。这就是中值滤波的全部
改造一下刚才的程序:
import cv def MFilter(image): w = image.width h = image.height size = (w,h) iMFilter = cv.CreateImage(size,8,1) for i in range(h): for j in range(w): if i in [0,h-1] or j in [0,w-1]: iMFilter[i,j] = image[i,j] else: a= [0]*9 for k in range(3): for l in range(3): a[k*3+l] = image[i-1+k,j-1+l] a.sort() iMFilter[i,j] = a[4] return iMFilter image = cv.LoadImage('lena.jpg',0) iMF = MFilter(image) cv.ShowImage('image',image) cv.ShowImage('iMF',iMF) cv.WaitKey(0)
看看效果:
![](http://pic002.cnblogs.com/images/2010/221871/2010122908491424.jpg)
中间为平均值滤波,右边是中值滤波。有没有看出差别?
我们来更直观的看看两种滤波方式对不同信号的处理效果吧
![](http://pic002.cnblogs.com/images/2010/221871/2010122909472072.png)
对线性信号,为了处理简单,我用的窗的长度为3
我们从效果可以看出中值平滑只对特别尖锐的信号平滑,而平均值平滑对所有的信号都平滑
所有平均值平滑不仅消除了噪声,还损失了原图中陡峭的边缘
对于含有点,线,尖角较多的图不适应采取中值滤波,他们容易被误认为噪声
好啦,简单的空域平滑滤波就讲到这里了
相关文章推荐
- python 简单图像处理(11) 空间域图像锐化(边缘检测)
- python数字图像处理(10):图像简单滤波
- python数字图像处理(10):图像简单滤波
- python 简单图像处理(11) 空间域图像锐化(边缘检测)
- Python与图像处理10
- 用python简单处理图片(2):图像通道\几何变换\裁剪
- python 简单图像处理(3) 平移
- python 简单图像处理(4) 旋转
- python 简单图像处理(6) 错切
- python 简单图像处理(8) 直方图均衡化
- 用python简单处理图片(4):图像中的像素访问
- python 简单图像处理(13) 二值图腐蚀和膨胀,开运算、闭运算
- 图像处理之基础---肤色检测算法 - 基于不同颜色空间简单区域划分的皮肤检测算法
- 图像处理平滑处理--高斯滤波,简单模糊,中值模糊,双边滤波,简单无放缩变换
- Python之简单的图像处理
- [Python] 图像简单处理(PIL or Pillow)
- openCV—Python(10)—— 图像阈值化处理
- [Python] 图像简单处理(PIL or Pillow)
- Python3与OpenCV3.3 图像处理(四)--色彩空间
- C++简单学习(Part3_lecture 10)(文件、流、异常处理、动态内存、命名空间)