图像去噪(Image Denoising)的过程就是将噪点从图像中去除的同时尽可能的保留原图像的细节和结构。这里讲的去噪跟前面笔记提过的去噪不一样,这里是指高级去噪技术,前面提过的高斯平滑也能去噪,但高斯平滑去噪的同时也把边缘模糊化了,另外使用形态学的方法去噪是指去除一些粗的椒盐噪声。对于一幅密布噪点的图像,如果使其变得清晰又保留边缘细节,这是高级去噪技术所要解决的问题。

全变差

全变差去噪(Total variation denoising)是一种常用的去噪模型。全变差(或叫总变差)大概是指图像梯度的范数(norm)的积分。
一幅图像的细节(噪声或是干扰的不必要的)过多,全变差的值越高,所以让全变差最小化,去掉噪声和没用细节的同时,保留边缘等主要细节,正是这种模型的处理思想。用这种去噪技术产生的图像有点接近卡通的感觉。
下面要介绍的Chambolle去噪算法就是基于全变差去噪模型实现的。

chambolle去噪

scipy.ndimage模块只是提供了基本的图像处理方法,并没有提供Chambolle去噪函数,所以就要借助另一个库——scikit-image。

scikit-image
scikit-image(简称skimage)库是从scipy.ndimage扩展下来的,提供了更丰富的图像处理函数,去噪函数除了Chambolle还有Bilateral算法,比如边缘检测还有以前简单提过的Canny算子滤波器。
它也是由 SciPy 社区所开发的,可以跟NumPy等完美配合。

安装:

sudo apt-get install python-skimage

函数说明:

skimage.restoration.denoise_tv_chambolle(im, weight=50, eps=0.0002, n_iter_max=200, multichannel=False)
im: ndarray类型,2维或3维
weight:越大去噪越多,但图像也会越失真
multichannel:对彩色图像而言,true表示对每一通道去噪返回去噪后的图像,ndarray类型。

下面我用看具体的例子,将chambolle和高斯平滑进行对比:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import filters
from skimage.filter import denoise_tv_chambolle  #for versoin: 0.9.3
#from skimage.restoration import denoise_tv_chambolle  #for new versionim = np.array(Image.open('noising.jpg').convert('L'))index = 221
plt.subplot(index)
plt.gray()
plt.imshow(im)
plt.axis('off')
plt.title("original")chdnim = denoise_tv_chambolle(im, weight=0.2)
plt.subplot(index+1)
plt.imshow(chdnim)
plt.axis('off')
plt.title("chambolle weight=0.2")gs2dnim = filters.gaussian_filter(im, sigma=2)
plt.subplot(index+2)
plt.imshow(gs2dnim)
plt.axis('off')
plt.title("gaussion sigma=2")gs3dnim = filters.gaussian_filter(im, sigma=3)plt.subplot(index+3)
plt.imshow(gs3dnim)
plt.axis('off')
plt.title("gaussion sigmal=3")plt.show()

效果对比如下:

明显感觉使用chambolle的效果要比高斯平滑好很多。

Bilateral滤波器
Bilateral滤波器跟之前介绍过的高斯模糊运算过程相似,而且它也使用了高斯核,但它的特点是在对图像进行平滑的同时能保留边缘。因为它在平滑滤波时同时考虑了像素间的几何距离和色彩距离。具体点说,如果要处理的像素与邻近像素的欧式距离比较大(即像素值相差比较大)时,那么这些邻近像素的权重就比较小,从而使得对滤波后的新像素值影响较小。另外,每个滤波后像素点的值,受与他色彩相近并且距离较近的像素点的影响较大,这两种权值分配方法起到了保护边缘的作用。

Bilateral去噪函数:

skimage.restoration.denoise_bilateral(image, win_size=5, sigma_range=None, sigma_spatial=1, bins=10000, mode='constant', cval=0)

示例:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import filters
from skimage.filter import denoise_bilateral  #for versoin: 0.9.3
#from skimage.restoration import denoise_bilateral  #for new versionim = np.array(Image.open('noising.jpg').convert('L'))index = 221
plt.subplot(index)
plt.gray()
plt.imshow(im)
plt.axis('off')
plt.title("original")plt.subplot(index+1)
plt.imshow(denoise_bilateral(im))
plt.axis('off')
plt.title("default")plt.subplot(index+2)
plt.imshow(denoise_bilateral(im, sigma_range=0.2, sigma_spatial=10))
plt.axis('off')
plt.title("0.2/10")plt.subplot(index+3)
plt.imshow(denoise_bilateral(im, sigma_range=0.8, sigma_spatial=10))
plt.axis('off')
plt.title("0.8/10")plt.show()

效果如图:

感觉比高斯平滑要好一些,但比Chambolle还是要逊色不少。

小结

因全变差的数学原理比较高深,所以暂时没去研究,只大概了解下并使用skimage库的接口进行了一番对比,结论就是使用chambolle去噪效果非常好。

至此,书中第一章的内容结束了。后面将开始下一章节的内容学习——图像描述。

你还可以查看我的其它笔记。

参考资料

scikit-image.org
scikit denoising example
Bilateral Filtering

Programming Computer Vision with Python (学习笔记八)相关推荐

  1. Programming Computer Vision with Python (学习笔记一)

    转载自:http://segmentfault.com/a/1190000003941588 介绍 <Programming Computer Vision with Python>是一本 ...

  2. Programming Computer Vision with Python【学习笔记】【第一章】

    第1章 基本的图像操作和处理 1.1 PIL:Python图像处理类库 1.1.1 转换图像格式--save()函数 1.1.2 创建缩略图 1.1.3 复制并粘贴图像区域 1.1.4 调整尺寸和旋转 ...

  3. Programming Computer Vision with Python (学习笔记四)

    上一个笔记主要是讲了PCA的原理,并给出了二维图像降一维的示例代码.但还遗留了以下几个问题: 在计算协方差和特征向量的方法上,书上使用的是一种被作者称为compact trick的技巧,以及奇异值分解 ...

  4. Programming Computer Vision with Python (学习笔记十二)

    ORB(Oriented FAST and Rotated BRIEF)可用来替代SIFT(或SURF),它对图像更具有抗噪特性,是一种特征检测高效算法,其速度满足实时要求,可用于增强图像匹配应用. ...

  5. Programming Computer Vision with Python (学习笔记十一)

    尺度不变特征变换(Scale-invariant feature transform, 简称SIFT)是图像局部特征提取的现代方法--基于区域/图像块的分析.在上篇笔记里我们使用的图像之间对应点的匹配 ...

  6. Programming Computer Vision with Python (学习笔记九)

    角检测(Corner detection)是指检测图像中具有代表性的(我们感兴趣的)角点,一般讲为形状或边缘的拐角处,这些点可以大略标记对象在图像中的轮廓和位置,如果从一个图像序列中检测每个图像的角点 ...

  7. Programming Computer Vision with Python (学习笔记七)

    数学形态学(mathematical morphology)关注的是图像中的形状,它提供了一些方法用于检测形状和改变形状.起初是基于二值图像提出的,后来扩展到灰度图像.二值图像就是:每个像素的值只能是 ...

  8. Programming Computer Vision with Python (学习笔记五)

    SciPy库 SciPy库,与之前我们使用的NumPy和Matplotlib,都是scipy.org提供的用于科学计算方面的核心库.相对NumPy,SciPy库提供了面向更高层应用的算法和函数(其实也 ...

  9. Programming Computer Vision with Python (学习笔记二)

    首先介绍跟图像处理.显示有关两个库:NumPy和Matplotlib,然后介绍增强图像对比度的实现原理. NumPy NumPy是Python用于科学计算的基础库,提供了一些很有用的概念,如:N维数组 ...

最新文章

  1. 解决机器学习问题的一般流程
  2. 实现用户协议显示_HTTP协议工作原理及其特点
  3. LeetCode Clone Graph(搜索问题)
  4. 蓄电池维护中的几大误区
  5. Application.mk用法详解
  6. 学习《图解HTTP》有感
  7. java将对象 缓存_ehcache java 对象缓存怎么实现
  8. 报警服务器物理内存,从内存告警谈ESXi主机内存管理——内存构成
  9. 下面属于javascript内部对象的有_JavaScript从零开始——面向对象编程(2)
  10. Php 安装 zend_loader,在Linux系统中为PHP5.x安装Zend Guard Loader
  11. 源码学习-String类
  12. js中判断数组中是否含有某个字符串方法
  13. VS2010 MFC 使用GDI+给图片添加汉字
  14. 计算机专业男生宿舍,实拍大学男生宿舍,男生们不是玩电脑游戏,就是瘫在床上看手机!...
  15. 期货资管系统-分仓系统-反向跟单系统
  16. Linux之/etc/fstab文件详解及实践
  17. 自走棋手游服务器稳定,2020最火的自走棋手游
  18. 个人 OKR 案例,帮助你变得更好
  19. JDBC部署到Tomcat驱动加载失败
  20. 名人名言大全API 推荐

热门文章

  1. Docker源码分析(十一):镜像存储
  2. Redis BitMap适应场景
  3. Kafka设计解析(三):Kafka High Availability (下)--转
  4. Lesson 13.1 深度学习建模目标与性能评估理论
  5. 【采用】风控老客户续贷业务知识
  6. linux下的%zu
  7. 让Elasticsearch飞起来!——性能优化实践干货
  8. 日本那个大户又要抛了?
  9. 在Kaggle上赢得大数据竞赛的技巧和窍门
  10. 高效计算基础与线性分类器