图像锐化是和平滑相反的操作,目的是为了使模糊的图像变得清晰。既然是相反的目的,那么操作应该也是相反的,平滑使用的是图像邻域的加权求和或者是积分运算,而锐化则是使用求导数(梯度)或有限差分来实现。

基于一阶导数的图像增强——梯度算子

对于二维的连续函数,在点(x,y)处的梯度为

其中两个偏导数的计算公式为

梯度的幅值作为变化率的度量,其值如下。为什么要求梯度的幅值?想一下平滑的处理思路,最简单的平均平滑,在简单的一维情况下就是就某个位置上的数值替换成基于这个位置的邻域的积分值;而积分的逆变换就是微分,也就是将该位置的数值替换成这个位置的效斜率。所以二维情况下,就是将梯度幅值的值作为新的值。

对应到我们的二维离散图像中,就用差分来代替求导

上式中涉及平方和开方的运算,可以近似为绝对值的形式

而在实际应用中,经常被采用的是另一种近似梯度——Robert交叉梯度。可以将第一项和第二项都用模板的形式展示,如下所示。

                

使用模板参与计算的方法和前面一致,只是根据我们的习惯,更偏向于采用奇数尺寸的模板。所以有一种计算Sobel梯度的Sobel模板更加常用。我看的书中也没有关于Sobel梯度的推导,百度了一下也似乎没看到有人怎么详细的写。所以就自己推了一下。基本的思想和推导Robert交叉梯度是相同的,都是用绝对值的和来代替平方和开方,减少计算量。区别在于将2x2的模板扩张成3x3,很直观的:

此时我们可以将w1写成

进而继续调整,考虑到,即一个点的数值近似与它两侧(可以是上下也可以是左右)的点的数值的均值,适当变形代入上式中可得

整理成模板,即为

同理我们可以推导出

接下来我们试试将我们推到得到的Sobel模板,用于一张相对简单的图片来看看效果。为了计算方便,我们可以直接用前面写的一些函数拿来,然后修改其中的滤波模板,就可以达到效果。注意边界填充的方式,之前我们讲到,平滑的目的是为了消除噪声而不是突出边缘,所以各种各样的填充方法都可以尝试,影响不大;但是现在是为了突出图像中有意义的边缘,所以当我们在边界是做全0填充时,很有可能填充的部分和图像的边界就形成了变化剧烈的边缘,进而较大的梯度幅值在我们调整灰度范围时,将真正的图像中有意义的边缘的数值范围压缩到很小的范围,导致图像不清晰。所以最好要使用重复填充或者是镜像填充。

注意一下,因为我们的模板中含有负数,而图像中的像素点的数值类型是uint8,在相乘时很可能会发生截断。所以首先要确保先将图像中的像素点的数值类型在与模板相乘时转化成整数型,或者是在读取图像时做一下设定如下:

  1. from PIL import Image
  2. import numpy as np
  3. im = Image.open(...)
  4. arr = np.array(im, dtype = "int16")

然后计算完的数值,有可能大于0也有可能小于0,我们关心的是绝对值的大小所以可以取绝对值。最后需要将数值的范围调整到0-255之间即可。实现的代码如下:

  1. from PIL import Image
  2. import numpy as np
  3. def SobelFilter(src, dst, filter_kind = 1, padding = "replicate"):
  4. imarray = np.array(Image.open(src),dtype='double')
  5. #print(imarray.dtype)
  6. height, width = imarray.shape
  7. new_arr = np.zeros((height, width), dtype = "uint16")
  8. filter1 = np.array([[-1,0,1],[-2,0,2],[-1,0,1]])
  9. filter2 = np.array([[-1,-2,-1],[0,0,0],[1,2,1]])
  10. if filter_kind == 1:
  11. filter = filter1
  12. elif filter_kind == 2:
  13. filter = filter2
  14. k = filter.shape[0]
  15. for i in range(height):
  16. for j in range(width):
  17. total = 0
  18. for n in range(pow(k,2)):
  19. '''
  20. k = 3, n = 0, 1, 2 ..., 8, a = -1, 0, 1, b = -1, 0, 1
  21. k = 5, n = 0, 1, 2, 3 ..., 24, a = -2, -1, 0, 1, 2
  22. '''
  23. a, b = int(n//k - (k-1)/2), int(n%k - 1)
  24. #filter_value
  25. aa, bb = int(n//k), int(n%k)
  26. f_value = filter[aa, bb]
  27. if i + a <= 0:
  28. if j + b <= 0:
  29. total += imarray[0, 0]*f_value
  30. elif j + b >= width - 1:
  31. total += imarray[0, -1]*f_value
  32. else:
  33. total += imarray[0, j + b]*f_value
  34. elif i + a >= height - 1:
  35. if j + b <= 0:
  36. total += imarray[-1, 0]*f_value
  37. elif j + b >= width - 1:
  38. total += imarray[-1, -1]*f_value
  39. else:
  40. total += imarray[-1, j + b]*f_value
  41. else:
  42. if j + b <= 0:
  43. total += imarray[i + a, 0]*f_value
  44. elif j + b >= width - 1:
  45. total += imarray[i + a, -1]*f_value
  46. else:
  47. total += imarray[i + a, j + b]*f_value
  48. new_arr[i, j] = abs(total)
  49. max = np.max(new_arr)
  50. min = np.min(new_arr)
  51. final_arr = np.zeros((height, width), dtype = "uint8")
  52. for i in range(height):
  53. for j in range(width):
  54. final_arr[i, j] = 255*(new_arr[i, j] - min)/(max - min)
  55. final_im = Image.fromarray(final_arr)
  56. final_im.save(dst)
  57. #print("Suceess.")
  58. src = "C:/Users/60214/Desktop/python_work/DigitalExecution/geometry.jpg"
  59. dst1 = "C:/Users/60214/Desktop/python_work/DigitalExecution/sobel1.jpg"
  60. dst2 = "C:/Users/60214/Desktop/python_work/DigitalExecution/sobel2.jpg"
  61. SobelFilter(src, dst1, 1)
  62. SobelFilter(src, dst2, 2)

得到的结果如下。可以看到,这两个不同的滤波模板,前者突出了图像中竖直方向上的边缘,而后者突出的是水平方向上的边缘,各有特长。

基于二阶导数的图像增强——拉普拉斯算子

二维函数f(x,y)的二阶微分定义为

同理的,我们要试图用差分来代替微分

两式相加就得到了用于图像锐化的拉普拉斯算子

对应的滤波模板为

记得在一维微分的锐化中,我们对响应都取了绝对值,这意味着滤波模板与图像图像像素的计算值,绝对值相同的正值和负值表示相同的响应,所以也等同于使用下面的模板。

然后来分析模板的结构。所谓模板的结构,例如W1,模板如果旋转90度,实际上还是同一个模板;而Sobel算子,旋转90度会变成一组的另一个算子,这就对应了,一个水平一个竖直的特性。那么拉普拉斯算子,既然旋转90度等于自身,也就说明它对接近水平和接近竖直方向的边缘都有很好的加强。更进一步,我们构造对于45度旋转各向同性的滤波器如下:

                             

计算的代码和上面的一致,只是模板修改了一下下。但从结果中,看到效果并不好,甚至非常的模糊,这是因为我第一次实践使用的图片是素描作品,图像比较粗糙,不适合用来做这种操作。

  1. filter1 = np.array([[0,1,0],[1,-4,1],[0,1,0]])
  2. filter2 = np.array([[1,1,1],[1,-8,1],[1,1,1]])
  3. filter3 = np.array([[1,4,1],[4,-20,4],[1,4,1]])

用回之前的动漫人物,处理的结果如下。可以看到,大致勾画出了人物的边缘,是比较准确有效的,其中,第二幅图和第三幅图都比第一幅图效果要好,是因为它们俩对于倾斜的45度走向的四个方向的边缘的捕捉能力要强于主要突出水平和竖直的第一种滤波模板。

总结

一阶导数和二阶导数都有锐化图像,突出边缘的作用。区别可以归纳成三个:第一,一阶导数通常会产生较宽的边缘;第二,二阶导数对于阶跃性边缘中心产生零交叉,而对屋顶状的边缘,二阶导数取极值;第三,二阶导数对细节有较强的响应,如细线和孤立噪声点。

原文链接:https://blog.csdn.net/baidu_41902768/article/details/94613788

图像锐化原理及实现(PY)相关推荐

  1. OpenCV学习笔记(十二)之USM图像锐化

    一.图像锐化原理   图像锐化,是使图像边缘更加清晰的一种图像处理方法,说白了就是让图像的边缘看起来更加清晰明了.其原理主要就是利用图像的高频分量来实现的,将原图像的高频分量提取出来,再和原图像按一定 ...

  2. CV:计算机视觉技术之图像基础知识(二)—以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础)

    CV:计算机视觉技术之图像基础知识(二)-以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础) 目录 ...

  3. 转——图像锐化算法原理

    http://dsqiu.iteye.com/blog/1638589 本文内容构成: 1.图像锐化和边缘检测的基本概念,微分梯度已经差分的定义 2.锐化和边缘检测的像素处理方式(3种) 3.单方向一 ...

  4. TIT 数字图像处理 原理与实践(MATLAB) 入门教学 实验三 图像平滑与图像锐化

    文章目录 数字图像处理 原理与实践(MATLAB) 入门教学 实验三 图像平滑与图像锐化 实验要求 知识点 实验内容 1.采用二维中值滤波函数medfilt2对受椒盐噪声干扰的图像滤波,窗口分别采用3 ...

  5. opencv进阶学习笔记5:图像模糊操作,图像锐化,边缘保留滤波EPF(图像滤镜)

    基础版传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 模糊操作 方法:均值模糊,中值模 ...

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

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

  7. Opencv实战【3】——图像修复与图像锐化(darling in the franxx)

    目录 前言 图像修复 图像锐化 darling in the franxx图片 总结 前言 前天,在群里看见有人发了这张表情包: 感觉女主有点好看,然后问室友是啥番剧(darling in the f ...

  8. matlabrobert锐化_基于Matlab的图像锐化的研究

    杨虹++吴萌 摘要:在图像处理时,常常需要对图像进行平滑,但是平滑后图像的轮廓往往变的有些模糊,为了改变这一影响,需要对图像进行锐化处理,使图像边缘信息呈现出来.对几种图像锐化的方法进行研究,并且对S ...

  9. 图像锐化(增强)和边缘检测

    转自:http://dsqiu.iteye.com/blog/1638589 图像锐化和边缘检测 本文内容构成: 1.图像锐化和边缘检测的基本概念,微分梯度已经差分的定义 2.锐化和边缘检测的像素处理 ...

最新文章

  1. 第二讲 完全背包问题(对背包九讲的学习)
  2. [Recompose] Pass a React Prop to a Stream in RxJS
  3. 短视频SDK架构设计,短视频APP开发目标首选
  4. Guacamole 介绍以及架构
  5. 精心为学弟学妹整理了60个适合练手的C语言/C++项目,值得收藏!
  6. 基于MicroPython实现ESP32+SSD1306的小恐龙游戏
  7. 7-10 365次方 (10 分)
  8. 城市大数据及开放数据索引
  9. 一个3D引擎Demo 源码
  10. vs2015 ankhsvn插件(AnkhSVN) v2.7.0.6493
  11. 【http-flv】zlmedia http 客户端拉取 http-flv 流程
  12. Android发展趋势分析
  13. Unity2019LTS版本终于来了
  14. SysML实践指南第二版(中文翻译:刘亚龙)第四章 汽车案例
  15. 学生喂养三种宠物:猫、狗和鸟
  16. iOS 【如何写出最简洁优雅的网络封装 Moya + RxSwift】
  17. python ddos攻击_DDoS攻击工具
  18. 天使纪元登录不了服务器正在维护,天使纪元ios无法充值的原因|这4个步骤或许能帮上忙...
  19. 人脸识别算法优化总结
  20. 始终在 SwiftUI 的导航栏中显示搜索栏

热门文章

  1. Vmware中鼠标移动时滚轮失效没反应Ubuntu20.04.1
  2. nginx隐藏x-real-ip头配置
  3. 2022-07-13 第五小组 瞒春 学习笔记
  4. D3DWindower(游戏窗口化工具)v1.88 绿色版
  5. OA办公管理系统,让协同触手可及
  6. 首届零一科技节震撼来袭 汇集100+黑科技企业、3万平沉浸空间
  7. 中国移动明年推出首批5G手机,用户不应急着购买
  8. 文件夹共享和分享其实区别很大!
  9. java边界布局东南西北_破局!发展大南昌格局!城市向南生长或是关键!
  10. 像 word 手动插入分页符一样实现报表中强制分页(强制分页)