上一节中我们讲解了灰度变换的原理以及实现方法,本节我们讲解空域滤波增强,与灰度变换相同,空域滤波增强是一种空域处理的方法,不过空域滤波不是一种对点做处理的方法,而是利用相邻像素间的关系进行增强。空域滤波可以按照增强效果的不同分为平滑与锐化两类,又都可分为线性与非线性方法,线性滤波利用空域卷积来实现。接下来我们对平滑与锐化一一进行讲解。

一、图像平滑

图像平滑的目的是抑制和消除噪声,我们首先介绍一种线性平滑方法—邻域平均,平滑算子为

AAA表示已以(i,j)(i,j)(i,j)为中心的邻域点的集合,MMM是AAA中像素点的总数,邻域平均的实现代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
import pylabimg = cv2.imread('Lena.jpg',1)
kernel = np.ones((5,5),np.float32)/25  #5×5卷积核,邻域平均
res = cv2.filter2D(img,-1,kernel)
cv2.imshow('res',res)
cv2.waitKey(0)

opencv提供cv2.filter2D()函数来对图像进行卷积操作

dst = cv2.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
#dst:输出图像
#src:输入图像
#ddepth:输出图像深度,-1为与原图相同
#kernel:卷积核
#anchor:锚点,默认为(-1, -1),指卷积核的中心点
#delta:输出结果时的附加值,默认为0
#borderType:边界模式,默认为BORDER_DEFAULT

我们采用不同大小的卷积核,依次对源图像进行卷积操作,结果如下,

卷积核半径越大,图像平滑的效果越明显,图像越来越模糊。
除了上述线性平滑方法之外,还有非线性平滑滤波器,包括中值滤波、百分比滤波、最大值滤波、最小值滤波,我们特别讲解一下中值滤波,中值滤波是将选定的奇数像素窗口内的各像素灰度按大小排队,用中间的灰度值代替窗口中原图像中间位置的像素,因此是一种非线性滤波。中值滤波对既保留边缘又要求去噪的任务很有用,尤其对椒盐噪声。
我们为Lena添加椒盐噪声,分别对其进行邻域平均与中值滤波,实现代码如下,

import cv2
import numpy as np
import matplotlib.pyplot as plt
import random
import pylabdef cvToplt(img):   #经过颜色转换后plt才能输出彩色图像b,g,r = cv2.split(img)  img = cv2.merge([r,g,b])return img  def main():    img = cv2.imread('Lena.jpg',1)x,y,z = img.shapefor i in range(5000):    #添加椒盐噪声row = random.randint(0,x-1)col = random.randint(0,y-1)img[row][col] = 255kernel = np.ones((5,5),np.float32)/25res = cv2.filter2D(img,-1,kernel) #邻域平均res2=  cv2.medianBlur(img,5)  #中值滤波plt.subplot('131'),plt.imshow(cvToplt(img)),plt.title('Original')plt.subplot('132'),plt.imshow(cvToplt(res)),plt.title('mean')plt.subplot('133'),plt.imshow(cvToplt(res2)),plt.title('median')pylab.show()if __name__ =="__main__":main()

结果如下,

经过对比发现,中值滤波的去噪效果好,且能够较好的保留图像边缘,邻域平均的平滑效果更好但去噪效果相对较差。

二、图像锐化

对正常的图像,通过锐化提取边缘、轮廓、线条等信息,供进一步识别。通过加重图像轮廓克服降质,以达到更好的视觉效果。常见的锐化算法包括Roberts算子、Sobel算子、Prewitt算子、拉普拉斯算子。

(1)基于一阶微分的图像增强—梯度法
我们把图像看成二维离散函数,为了提取图像的边缘,我们需要计算图像的梯度,梯度是方向导数取最大值的方向的向量 ,图像的边缘即为图像梯度较大的地方。
梯度用一个二维列向量来定义,

                

对于离散的二维图像,为计算方便,用绝对值代替幅值,用差分代替微分:
(1)(1)(1)
为了更好的理解,我们考虑一个3×3的图像区域,

zzz代表灰度级,由式(1)(1)(1),在点z5z_5z5​的▽f=∣z6−z5∣+∣z8−z5∣▽f=|z_6-z_5|+|z_8-z_5|▽f=∣z6​−z5​∣+∣z8​−z5​∣

接下来我们来看Roberts交叉梯度,z5z_5z5​的▽f=∣z9−z5∣+∣z8−z6∣▽f=|z_9-z_5|+|z_8-z_6|▽f=∣z9​−z5​∣+∣z8​−z6​∣,我们发现计算方法发生了改变,可以理解为各种梯度算子就是不同的梯度计算方法,由于上述的梯度公式本来就是近似的,因此没有绝对的衡量方法,每种梯度算子的功效各不相同,像第一种方式关注的是图像水平方向和垂直方向上的梯度,而Roberts交叉梯度则关注的是斜对角方向上的梯度。
Roberts交叉梯度的计算由两个模板组成,第一个模板求得梯度的第一项,第二个模板求得梯度的第二项,然后求和,得到梯度。两个模板称为Roberts交叉梯度算子。

利用Roberts交叉梯度算子对图像进行处理,实现代码如下,

import cv2
import numpy as np
import matplotlib.pyplot as plt
import pylabdef main():img = cv2.imread('Lena.jpg',0)plt.imshow(img,'gray')kernel_1 = np.array([[-1,0],[0,1]])  #Roberts算子kernel_2 = np.array([[0,-1],[1,0]])res = cv2.filter2D(img,-1,kernel_1)res2 = cv2.filter2D(img,-1,kernel_2)plt.subplot(131),plt.imshow(res,'gray'),plt.title('1')plt.subplot(132),plt.imshow(res2,'gray'),plt.title('2')plt.subplot(133),plt.imshow(res+res2,'gray'),plt.title('1+2')pylab.show()if __name__ == "__main__":main()

实验结果如下,

接下来我们学习Sobel梯度算子,Sobel是一种3×3的梯度模板,▽f=∣(z7+2z8+z9)−(z1+2z2+z3)∣+∣(z3+2z6+z9)−(z1+2z4+z7)∣▽f=|(z_7+2z_8+z_9)-(z_1+2z_2+z_3)|+|(z_3+2z_6+z_9)-(z_1+2z_4+z_7)|▽f=∣(z7​+2z8​+z9​)−(z1​+2z2​+z3​)∣+∣(z3​+2z6​+z9​)−(z1​+2z4​+z7​)∣,

Sobel关注的是水平方向上与垂直方向上的梯度,这点与Roberts不同,Sobel实现代码如下,

import cv2
import numpy as np
import matplotlib.pyplot as plt
import pylabdef main():img = cv2.imread('Lena.jpg',0)kernel_1 = np.array([[-1,-2,-1],[0,0,0],[1,2,1]])  #Sobel算子kernel_2 = np.array([[-1,0,1],[-2,0,2],[-1,0,1]])res = cv2.filter2D(img,-1,kernel_1)res2 = cv2.filter2D(img,-1,kernel_2)plt.subplot(131),plt.imshow(res,'gray'),plt.title('1')plt.subplot(132),plt.imshow(res2,'gray'),plt.title('2')plt.subplot(133),plt.imshow(res+res2,'gray'),plt.title('1+2')pylab.show()if __name__ == "__main__":main()

实验结果如下,

(2)基于二阶微分的图像增强—拉普拉斯算子
对图像求二阶微分(近似),

在xxx方向上,

在yyy方向上,

则二阶微分为
▽2f=[f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y−1)]−4f(x,y)▽^2f = [f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)]-4f(x,y)▽2f=[f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y−1)]−4f(x,y)
拉普拉斯算子模板为

由于拉普拉斯是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。
我们通常的做法是把原图像和拉普拉斯图像叠加在一起,这样既能保护拉式锐化效果,同时又能复原背景信息,具体的做法是:

当然,上述过程也可一步完成,更改拉普拉斯模板即可,如下(注意,此处模板中心只能为正,在以后的应用中,模板中心最好设为正值),

拉普拉斯算子实现代码如下,

import cv2
import numpy as np
import matplotlib.pyplot as plt
import pylabdef main():img = cv2.imread('Lena.jpg',0)kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]])   #拉普拉斯算子res = cv2.filter2D(img,-1,kernel)plt.subplot(121),plt.imshow(img,'gray'),plt.title('1')plt.subplot(122),plt.imshow(res,'gray'),plt.title('2')pylab.show()if __name__ == "__main__":main()

实验结果如下,

总结一下,我们详细讲解了三种算子,Roberts算子、Sobel算子和拉式算子,前两种属于一阶算子,拉式算子属于二阶算子。通常我们在处理图像时,先会用拉式算子突出图像中的小细节,后用梯度法突出图像的边缘。

本节我们所讲属于图像增强技术中的空域滤波技术,即利用各种各样的模板(算子)对图像进行处理,后边我们会讲到基于频域的图像处理技术。

未完待续

图像处理与图像识别笔记(五)图像增强2相关推荐

  1. 图像处理与图像识别笔记(一)

    本系列是研一课程<图像处理与图像识别>的随堂笔记,主要内容是数字图像处理方面,根据老师的讲课内容与自己的理解所书写,还会有一些具体实现的代码,基于Python,欢迎交流.本篇主要介绍图像处 ...

  2. 图像处理与图像识别笔记(三)图像增强1

    图像增强的目的是为了改善图像的视觉效果,为了更便于人或机器的分析和处理,在不考虑图像降质(前提)的情况下,提高图像的可观性.灰度变换是一种典型的图像增强方法,我们通常把图像处理按照处理方法分成空域方法 ...

  3. 图像处理与图像识别笔记(六)图像增强3

    上一章节中我们讲解了空域滤波的图像增强方法,包括图像的平滑和锐化,本文中,我们首先带来频域滤波的图像增强方法,指在频域中对图像进行变换,需要的基础知识是前述过的图像傅里叶变换,请查看学习. 一.频域滤 ...

  4. 图像处理与图像识别笔记(二)图像变换

    在本章节中,将介绍几种常用的图像变换的方法,即利用数学公式将图像变换成另一种具有特定物理意义的图像,通过新的图像,我们可以观察出原图像的某些特性,且可以对原图像进行滤波.压缩等图像处理的操作,包括傅里 ...

  5. 数字图像处理MATLAB学习笔记(五)

    数字图像处理MATLAB学习笔记(五) Color Image Processing 1 Color Image Representation in MATLAB 这里不多说了,彩色图片在计算机中以R ...

  6. [Python从零到壹] 五十五.图像增强及运算篇之图像平滑(均值滤波、方框滤波、高斯滤波)

    又是一年1024,首先,祝大家节日快乐! 欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界 ...

  7. 数字图像识别笔记(第一章绪论)

    title: 数字图像识别笔记(第一章绪论) categories: 数字图像识别 tags: 数字图像识别 date: 2020/9/29 23:59 mathjax: true toc: true ...

  8. [Python从零到壹] 四十五.图像增强及运算篇之图像灰度非线性变换详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  9. 《数字图像处理》读书笔记1:绪论

    <数字图像处理>读书笔记1:绪论 1 基本概念 1.1 函数f(x, y) 1.2 数字图像(Digital Image).像素 1.3 电磁波谱(Electromagnetic Spec ...

最新文章

  1. golang中的权限
  2. spring单元测试报错:Failed to load ApplicationContext 的解决方法
  3. 熊猫烧香源代码(转载)
  4. 怎么看空调定时成功_风管机和中央空调傻傻分不清?看了你就明白怎么选了
  5. iOS多线程的初步研究(十)-- dispatch同步
  6. 快速保留小数点后面几位(转)
  7. Linux下的MySQL测试,Linux下MySQL命令(1)
  8. 两台思科交换机vlan划分_Cisco交换机Vlan划分及ACL配置详细步骤 | 吴文辉博客
  9. SpringCloud Zuul(四)之工作原理
  10. cannot set up a python sdk 3.8_anaconda+pycharm环境下创建新的虚拟环境报错Cannot set up a py...
  11. cnforyou被收购了,没地方买书了
  12. IOS开发之视图和视图控制器
  13. C++bitset二进制有序集
  14. window.external的使用
  15. html动态绑定树形菜单,jQuery ztree实现动态树形多选菜单
  16. SQL:pgsql新建数据表
  17. android tif格式文件,后缀tif文件怎么打开(tif图片查看器安卓版)
  18. java 电子栅栏,Java Exchanger栅栏
  19. SNMP学习笔记之SNMP 原理与实战详解
  20. 如何搭建一个机器人控制系统

热门文章

  1. 李宏毅机器学习(一)基本概念介绍
  2. 什么?!“路由器”也会做信息抽取了?
  3. 最新进展 | 深度学习在天气预测中的应用
  4. 浅入深出被人看扁的逻辑回归!
  5. Shield——开源的移动端页面模块化开发框架
  6. Android官方开发文档Training系列课程中文版:OpenGL绘图之图形定义
  7. 【Java】文件操作
  8. 2021年世界科技进展100项
  9. [Swift]LeetCode853. 车队 | Car Fleet
  10. LVS入门篇(五)之LVS+Keepalived实战