前面我们介绍过图像的梯度,其定义是根据微积分的定义在二维离散函数中推导出来的。但是,我们需要理解,梯度只是一个工具,方法,核心目的是得到像素点与其相邻像素的灰度值变化情况,并通过这种变化来增强图像。这种原始定义的梯度只是这种灰度值变化情况的度量工具。

我们再回顾一下,假设某像素与其8领域用如下矩阵表示:

那么,根据图像梯度的定义:
gx = z8 - z5
gy = z6 - z5
上面提到,这种原始定义的梯度只是这种灰度值变化情况的度量工具,这种度量工具只有这一种吗?显然不是的!
z9-z5算不算灰度值的变化?z1-z5呢?z7-z5呢?z4-z5呢?z3-z5呢?

我们利用梯度的本质目的,是要找到某像素与其相邻像素的灰度差值,并放大这种差值,从而用于图像增强。而原始定义的梯度计算方法只是灰度差值计算方法中的一种,还可以有其它计算方法来度量这种变化。

为简化起见,我们把这些计算方法统称为梯度算子。根据不同的相邻像素差值计算得到的效果可能有所不同,但基本原理是一致的。

例如罗伯特(Roberts)交叉梯度算子,定义的是:
gx = z9-z5
gy = z8-z6
为什么名字中有“交叉”,看看下图就知道了。

我们可以看到,不管是原始梯度也好,Roberts算子也好,都只是利用了z5,z6,z8,z9的像素值,那么可不可以扩展到8领域呢,当然是可以的。

例如,你可以自己定义一个:
gx = (z7+z8+z9)-(z1+z2+z3)
gy = (z3+z6+z9)-(z1+z4+z7)

事实上,这个你自定义的算子和著名的Sobel算子非常接近了,只是Sobel算子增加了距离权重而已。Sobel算子的定义如下(与中心点Z5更近的点Z3,Z4,Z6,Z8的权重为2,其它对角线上的权重为1):
gx = (z7+2*z8+z9)-(z1+2*z2+z3)
gy = (z3+2*z6+z9)-(z1+2*z4+z7)

关于Sobel算子后面还会再重点介绍,下面用Roberts交叉算子来看看图像增强的效果。


import cv2
import numpy as npmoon = cv2.imread("moon.tif", 0)
row, column = moon.shape
moon_f = np.copy(moon)
moon_f = moon_f.astype("float")Roberts = np.zeros((row, column))for x in range(row - 1):for y in range(column - 1):gx = abs(moon_f[x + 1, y + 1] - moon_f[x, y])gy = abs(moon_f[x + 1, y] - moon_f[x, y + 1])Roberts[x, y] = gx + gysharp = moon_f + Roberts
sharp = np.where(sharp < 0, 0, np.where(sharp > 255, 255, sharp))
sharp = sharp.astype("uint8")cv2.imshow("moon", moon)
cv2.imshow("Roberts_sharp", sharp)
cv2.waitKey()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

输出结果:

再看看用上面自定义算子的情况:
user_defined = np.zeros((row, column))for x in range(1, row - 1):for y in range(1, column - 1):gx = abs((moon_f[x + 1, y - 1] + moon_f[x + 1, y] + moon_f[x + 1, y + 1]) - (moon_f[x - 1, y - 1] + moon_f[x - 1, y] + moon_f[x - 1, y + 1]))gy = abs((moon_f[x - 1, y + 1] + moon_f[x, y + 1] + moon_f[x + 1, y + 1]) - (moon_f[x - 1, y - 1] + moon_f[x, y - 1] + moon_f[x + 1, y - 1]))user_defined[x, y] = gx + gysharp = moon_f + user_defined
sharp = np.where(sharp < 0, 0, np.where(sharp > 255, 255, sharp))
sharp = sharp.astype("uint8")cv2.imshow("moon", moon)
cv2.imshow("defined_sharp", sharp)
cv2.waitKey()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

输出结果:

转载自:https://blog.csdn.net/saltriver/article/details/78987170

数字图像处理--图像梯度算子的本质相关推荐

  1. 数字图像处理--图像梯度的基本原理

    前面我们提到,当用均值滤波器降低图像噪声的时候,会带来图像模糊的副作用.我们当然希望看到的是清晰图像.那么,清晰图像和模糊图像之间的差别在哪里呢?从逻辑上考虑,图像模糊是因为图像中物体的轮廓不明显,轮 ...

  2. 数字图像处理课设图像的锐化_数字图像处理图像锐化处理.ppt

    数字图像处理图像锐化处理 4.7.2 灰度级到彩色转换 灰度级到彩色转换(例) 在HSI彩色空间的直方图均衡强度均衡处理没有改变图像的色调和饱和度值,但它的确影响了整体图像的彩色感观. 向量分量可以用 ...

  3. 数字图像处理之拉普拉斯算子

    OpenCV-跟我一起学数字图像处理之拉普拉斯算子 Laplace算子和Sobel算子一样,属于空间锐化滤波操作.起本质与前面的Spatial Filter操作大同小异,下面就通过Laplace算子来 ...

  4. OpenCV中的图像处理 —— 图像梯度+Canny边缘检测+图像金字塔

    OpenCV中的图像处理 -- 图像梯度+Canny边缘检测+图像金字塔 目录 OpenCV中的图像处理 -- 图像梯度+Canny边缘检测+图像金字塔 1. 图像梯度 1.1 Sobel和Schar ...

  5. 数字图像处理图像反转的实现_使用8086微处理器反转16位数字

    数字图像处理图像反转的实现 Problem statement: 问题陈述: Write an assembly language program in 8086 microprocessor to ...

  6. 数字图像处理图像反转的实现_反转8位数字| 8085微处理器

    数字图像处理图像反转的实现 Problem statement: 问题陈述: To reverse 8 bits number using 8085 microprocessors. 使用8085微处 ...

  7. matlab 求其骨架,数字图像处理图像的骨架生成和提取(Matlab)三种方法

    [实例简介] 数字图像处理图像的骨架生成和提取(Matlab),有三种方法,推荐给大家! [实例截图] [核心代码] Programe ├── Programe1 │   ├── 00.JPG │   ...

  8. Matlab数字图像处理——图像的空间变换

    Matlab空间变换函数 imtransform Matlab空间变换函数 imtransform 可以实现图像仿射变换(如 平移.旋转.剪切.缩放).投影变换, 该函数可与 maketform 配合 ...

  9. opencv for python的图像梯度算子以及canny边缘检测

    opencv for python的图像梯度算子以及canny边缘检测 一.图像梯度算子: 二.Canny边缘检测(一个多级边缘检测算法): 一.图像梯度算子: 1.概念简介(部分引自百度百科): 图 ...

最新文章

  1. git更新代码报错,error: The following untracked working tree files would be overwritten by ch
  2. DriverManager 驱动管理器类简介 JDBC简介(三)
  3. python3爬虫实例-python3.7简单的爬虫实例详解
  4. 关于微机开操作票的研究22437
  5. 日本的酒店主题能有多丰富?
  6. Java获取系统时间
  7. Java-基本运算符
  8. 这才是真正适合小白的教程:Python有什么用?数据化运营怎么做?
  9. struts2 s:property/标签的使用--输出时间格式转换
  10. 导盲机器人 英语作文_小米有品推学习平板:小爱AI陪娃学英语,一台陪娃十年成长...
  11. 搞定所有的跨域请求问题 : jsonp CORS
  12. python数据建模优缺点_Python数据分析\建模入门建议
  13. zipentry java_java中的ZipEntry是什么意思?
  14. apt-get 提示 无法解析域名“cn.archive.ubuntu.com” 的解决
  15. 铁是这样炼成的——IT项目经理的职业生涯
  16. c语言 proteus 延迟2秒_几种延时的汇编执行代码对比与总结
  17. usb设备驱动之uvc设备
  18. 电路中各种地的区别及处理
  19. solidworks与matlab接口,CAD软件与Matlab_SimMechanics接口问题研究
  20. HDU 4262 Juggler (模拟+线段树优化)

热门文章

  1. Java异常处理: 缺包 ClassNotFound javax/xml/bind/JAXBException
  2. 容器编排技术 -- Kubernetes kubectl edit 命令详解
  3. Oracle 性能优化之内核的shmall 和shmmax 参数
  4. 虚拟机网络无法连接问题解决(超简单)
  5. 面试刷题7:int和Integer有什么区别?
  6. leetcode 有效的字母异位词
  7. 【C语言】分别用下标法,地址法和指针法输出数组中的全部元素
  8. 【C语言】将输入的10个数排序
  9. javascript_如何不再害怕JavaScript
  10. javascript 应用_如何利用JavaScript的功能使您的应用脱机工作