本章将介绍在图像处理中常用到的几个卷积核(算子)实现图像的边缘检测和锐化操作,有Premittt算子、Roberts算子、Sobel算子、Scharr算子、Laplacian算子、LoG算子、Canny算子。

1.Premittt算子

介绍:Prewitt算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用 。
原理:其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。
水平梯度方向的卷积核3 * 3模板:
Kx=[−101−101−101]K_x= \left[ \begin{array}{ccc} -1&0&1\\ - 1&0&1\\ -1&0&1\\ \end{array} \right] Kx​=⎣⎡​−1−1−1​000​111​⎦⎤​
竖直梯度方向的卷积核3 * 3模板:
Ky=[−1−1−1000111]K_y= \left[ \begin{array}{ccc} -1&-1&-1\\ 0&0&0\\ 1&1&1\\ \end{array} \right] Ky​=⎣⎡​−101​−101​−101​⎦⎤​
水平梯度方向代码:

kx = np.array([[-1,0,1],[-1,0,1],[-1,0,1],
],dtype=np.float64)
img_x = cv.filter2D(img,cv.CV_64F,kx)
show(np.abs(img_x))

输出图像为:

水平梯度方向代码:

ky = np.array([[-1,-1,-1],[0,0,0],[1,1,1]
],dtype=np.float64)
img_y = cv.filter2D(img,cv.CV_64F,ky)
show(np.abs(img_y))

输出图像为:

两者融合则为边缘的检测:
融合有两种方式:
1:Kxy=∣Kx∣+∣Ky∣K_{xy}=|K_x|+|K_y|Kxy​=∣Kx​∣+∣Ky​∣

2:Kxy=Kx2+Ky2K_{xy}=\sqrt{K_x^2+K_y^2}Kxy​=Kx2​+Ky2​​

img_xy1= np.abs(img_x)+np.abs(img_y)img_xy2 = np.power(img_x**2+img_y**2,0.5)show(np.hstack([img_xy1,img_xy2]))
cv.imwrite('test/kxy.jpg',np.hstack([img_xy1,img_xy2]))

输出图像为:

2.Roberts算子

介绍:Roberts算子,又称罗伯茨算子,是一种最简单的算子,是一种利用局部差分算子寻找边缘的算子。检测垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感,无法抑制噪声的影响。
原理:他采用对角线方向相邻两象素之差近似梯度幅值检测边缘。
卷积核2 * 2模板1:
K1=[−1001]K_1= \left[ \begin{array}{ccc} -1&0\\ 0&1\\ \end{array} \right] K1​=[−10​01​]
卷积核2 * 2模板2:
K2=[0−110]K_2= \left[ \begin{array}{ccc} 0&-1\\ 1&0\\ \end{array} \right] K2​=[01​−10​]
代码实现如下:

k_rob1 = np.array([[-1,0],[0,1]
],dtype=np.float64)
img_rob1 = cv.filter2D(img,cv.CV_64F,k_rob1)
k_rob2 = np.array([[0,-1],[1,0]
],dtype=np.float64)
img_rob2 = cv.filter2D(img,cv.CV_64F,k_rob2)
img_xy=np.abs(img_rob1)+np.abs(img_rob2)
img_xy2=np.sqrt(img_rob1**2+img_rob2**2)
show(np.hstack([img_xy,img_xy2]))

输出图像为:

3.Sobel算子

介绍:在边缘检测中,常用的一种模板是Sobel 算子。Sobel 算子有两个,一个是检测水平边缘的 ;另一个是检测垂直边缘的 。与Prewitt算子相比,Sobel算子对于象素的位置的影响做了加权,可以降低边缘模糊程度,因此效果更好。
原理:Sobel算子是把图像中每个像素的上下左右四领域的灰度值加权差,在边缘处达到极值从而检测边缘。
水平梯度方向的卷积核3 * 3模板:
Kx=[−101−202−101]K_x= \left[ \begin{array}{ccc} -1&0&1\\ - 2&0&2\\ -1&0&1\\ \end{array} \right] Kx​=⎣⎡​−1−2−1​000​121​⎦⎤​
竖直梯度方向的卷积核3 * 3模板:
Ky=[−1−2−1000121]K_y= \left[ \begin{array}{ccc} -1&-2&-1\\ 0&0&0\\ 1&2&1\\ \end{array} \right] Ky​=⎣⎡​−101​−202​−101​⎦⎤​
自己实现代码:

kx = np.array([[-1,0,1],[-2,0,2],[-1,0,1],
],dtype=np.float64)
img_x = cv.filter2D(img,cv.CV_64F,kx)ky=np.array([[-1,-2,-1],[0,0,0],[1,2,1]
])
img_y =cv.filter2D(img,cv.CV_64F,ky)img_xy1=np.abs(img_x)+np.abs(img_y)
img_xy2=np.sqrt(img_x**2+img_y**2)
show(np.hstack([img_xy1,img_xy2]))
cv.imwrite('test/Sobel1.jpg',np.hstack([img_xy1,img_xy2]))

输出图像为:
OpenCV自带有Sobel(原图像,数据类型,x梯度方向,y梯度方向),代码实现为:

img_sobel_x = cv.Sobel(img,cv.CV_16S,1,0)
img_sobel_y = cv.Sobel(img,cv.CV_16S,0,1)img_sobel1=np.abs(img_sobel_x)+np.abs(img_sobel_y)
img_sobel2=np.sqrt(img_sobel_x**2+img_sobel_y**2)
show(img_sobel1)
#show(np.stack([img_sobel1,img_sobel2]))
cv.imwrite('test/Sobel2.jpg',img_sobel1)

4.Scharr算子

介绍:Sobel算子可以有效的提取图像边缘,但是对图像中较弱的边缘提取效果较差。因此为了能够有效的提取出较弱的边缘,需要将像素值间的差距增大,因此引入Scharr算子。
原理:Scharr算子是把图像中每个像素的上下左右四领域的灰度值加权差,在边缘处达到极值从而检测边缘。
水平梯度方向的卷积核3 * 3模板:
Kx=[−303−10010−303]K_x= \left[ \begin{array}{ccc} -3&0&3\\ - 10&0&10\\ -3&0&3\\ \end{array} \right] Kx​=⎣⎡​−3−10−3​000​3103​⎦⎤​
竖直梯度方向的卷积核3 * 3模板:
Ky=[−3−10−30003103]K_y= \left[ \begin{array}{ccc} -3&-10&-3\\ 0&0&0\\ 3&10&3\\ \end{array} \right] Ky​=⎣⎡​−303​−10010​−303​⎦⎤​
OpenCV自带有Scharr(原图像,数据类型,x梯度方向,y梯度方向),代码实现为

img_x = cv.Scharr(img,cv.CV_64F,1,0)
img_y = cv.Scharr(img,cv.CV_64F,0,1)img_Scharr = np.power(img_x**2+img_y**2,0.5)
img_Scharr = img_Scharr.clip(0,255)
show(img_Scharr)
cv.imwrite('test/img_Scharr.jpg',img_Scharr)

输出图像为:

5.Laplacian算子

介绍:Laplacian 算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度grad的散度div。可使用运算模板来运算这定理定律。
原理:函数的Laplacian 算子也是该函数的黑塞矩阵的迹,可以证明,它具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。
卷积核3 * 3模板1:
K1=[0101−41010]K_1= \left[ \begin{array}{ccc} 0&1&0\\ 1&-4&1\\ 0&1&0\\ \end{array} \right] K1​=⎣⎡​010​1−41​010​⎦⎤​
卷积核3 * 3模板2:
K2=[1111−81111]K_2= \left[ \begin{array}{ccc} 1&1&1\\ 1&-8&1\\ 1&1&1\\ \end{array} \right] K2​=⎣⎡​111​1−81​111​⎦⎤​
OpenCV提供了Laplacian(原图像,数据类型)

img_lap=cv.Laplacian(img,cv.CV_64F)
show(np.hstack([img,np.abs(img_lap)]))
cv.imwrite('test/img_Lap.jpg',np.hstack([img,np.abs(img_lap)]))

输出图像:

6.LoG算子

介绍:也就是 Laplace of Gaussian function(高斯拉普拉斯函数)。常用于数字图像的边缘提取和二值化。LoG 算子源于D.Marr计算视觉理论中提出的边缘提取思想, 即首先对原始图像进行最佳平滑处理, 最大程度地抑制噪声, 再对平滑后的图像求取边缘。
原理:在Laplacian 算子基础之上增加了高斯模糊。

img_GBlur=cv.GaussianBlur(img,(3,3),1)
img_LoG = cv.Laplacian(img_GBlur,cv.CV_64F)
show(np.hstack([img,np.abs(img_lap),np.abs(img_LoG )]))
cv.imwrite('test/img_Lap.jpg',np.hstack([img,np.abs(img_lap),np.abs(img_LoG )]))

输出图像:

6.Canny算子(了解)

Canny的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:

  • 好的检测- 算法能够尽可能多地标识出图像中的实际边缘。
  • 好的定位- 标识出的边缘要与实际图像中的实际边缘尽可能接近。
  • 最小响应-
    图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。

OpenCV提供了Canny(原图像,阈值1,阈值2)

img_Canny=cv.Canny(img,2,200)
show(img_Canny)
cv.imwrite('test/img_Canny.jpg',img_Canny)

输出图像:

数字图像处理_05_(图像锐化与边缘检测——Premittt算子、Roberts算子、Sobel算子、Scharr算子、Laplacian算子、LoG算子、Canny算子)相关推荐

  1. 数字图像处理之图像锐化算法

    图像锐化 图像锐化,主要用于增强图像的边缘,及灰度跳变部分.因为图像中边缘及急剧变化部分与图像的高频分量有关,所以当利用高通滤波器衰减图像信号中的低频分量时就会相对的强调其高频分量,从而加强图像中的边 ...

  2. 【数字图像处理】图像锐化:拉普拉斯算子(Laplacian)、高通滤波、Sobel算子、Isotropic算子、Prewitt算子

    图像锐化 图像锐化处理的目的是使模糊的图像变得更加清晰起来,通常针对引起图像模糊的原因而进行相应地锐化操作属于图像复原的内容.图像的模糊实质就是图像受到平均或积分运算造成的,因此可以对图像进行还原运算 ...

  3. python图像锐化 增强边缘_[Python图像处理]十一.图像锐化与边缘检测之Roberts算子、Prewitt算子、Sobel算子和Laplacian算子,Schar算子...

    Roberts算子 Roberts算子即为交叉微分算法,它是基于交叉差分的梯度算法,通过局部差分计算检测边缘线条.常用来处理具有陡峭的第噪声图像,当图像边缘接近于正45度或负45度时,该算法处理效果更 ...

  4. 数字图像处理,图像锐化算法的C++实现

    http://blog.csdn.net/ebowtang/article/details/38961399 之前一段我们提到的算法都是和平滑有关, 经过平滑算法之后, 图像锐度降低, 降低到一定程度 ...

  5. 【数字图像处理】图像直方图均衡化、空域滤波(均值滤波、中值滤波)、图像锐化(Laplace算子)、图像傅里叶变换实验

    图像直方图均衡化.空域滤波.图像锐化.图像傅里叶变换 一.图像直方图均衡化 二.图像空域滤波 1.均值滤波(滤波次数n→3) 2.中值滤波(滤波次数n→3) 3.图像锐化(Laplace算子) 三.图 ...

  6. [Python图像处理] 四十二.Python图像锐化及边缘检测万字详解(Roberts、Prewitt、Sobel、Laplacian、Canny、LOG)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  7. [Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  8. Python中的图像处理(第十一章)Python图像锐化及边缘检测(1)

    Python中的图像处理(第十一章)Python图像锐化及边缘检测(1) 前言 一. Python准备 二. Python仿真 三. 小结 前言 随着人工智能研究的不断兴起,Python的应用也在不断 ...

  9. 数字图像处理:图像的频域

    数字图像处理:图像的频域 一.图像高频信号和低频信号的理解 1.1 图像中的低频信号和高频信号也叫做低频分量和高频分量. 1)空间频率指的是图像中灰度值相对它的邻居点变化方式.如果一副图像中灰度从一边 ...

  10. 数字图像处理之图像基础

    最近在学数字图像处理,图像基础包括以下部分: 导入库 import numpy as np import matplotlib.pyplot as plt import cv2 as cv 图片展示函 ...

最新文章

  1. 10 年前被删的初恋,凌晨 1 点突然加我…
  2. 仿真环境跟车2分钟,就让自动驾驶系统撞上马路牙子,攻破率超90%,多传感器融合系统都失效...
  3. IPv6 — 与 5G 共荣共生
  4. 业务规则的生命周期管理
  5. CKMLCP前期未结算_报错
  6. vbs用mysql语句查询数据库_vbs脚本实现window环境下的mysql数据库的备份及删除早期备份...
  7. 内置函数(面向对象)
  8. Asp.Net Core Ocelot Consul 微服务
  9. P3455 [POI2007]ZAP-Queries
  10. androidx86 9.0下载_13.3寸大屏安卓9.0强悍性能刷新你认知!BOOX MAX3电纸书上手测评...
  11. python画三维图-Python+matplotlib绘制三维图形5个精选案例
  12. 工厂模式在 Calendar 类中的应用
  13. IDEA新特性真牛逼:提前知道代码怎么走!
  14. maven项目添加新dependency jar后本地可正常运行,但打包后加载不上
  15. 除了大家知道的navicat,再介绍两款免费的数据库连接工具
  16. 小米路由器MINI架设WEB服务
  17. js金额小写转换成大写
  18. CNI IPAM插件分析 --- 以hostlocal为示例
  19. 如何查看wifi密码
  20. 2D骨骼动画工具DragonBones的使用教程

热门文章

  1. 微信公众号如何实现支付功能?
  2. 微信小程序中图表可视化
  3. 黑马java idea (据说是完整的)网盘
  4. 武汉大学计算机学院电子与通信工程,武汉大学电子信息学院信息与通信工程
  5. Arcgis 10.2 软件安装教程
  6. 万里汇WorldFirst个人和公司帐户注册教程(送$25+0.3%提现费)
  7. 数字类型转换以及函数全介绍
  8. 非度量多维标度_16s分析作图之NMDS非度量多维尺度分析
  9. 番茄的随笔4:Clark变换与Park变换
  10. 大道至简:企业需要的中台是什么?答案是:指挥官体系