第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波17 - 锐化高通滤波器 - 梯度图像(罗伯特,Sobel算子)

目录

  • 锐化(高通)空间滤波器
      • 使用一阶导数锐化图像-梯度

锐化(高通)空间滤波器

  • 平滑通过称为低通滤波
  • 类似于积分运算
  • 锐化通常称为高通滤波
  • 微分运算
  • 高过(负责细节的)高频,衰减或抑制低频

使用一阶导数锐化图像-梯度

在图像处理中,一阶导数是用梯度幅度实现的,图像的梯度定义为二维列向量
∇f≡grad(f)=[gxgy]=[∂f/∂x∂f/∂y](3.57)\nabla f \equiv \text{grad}(f) = \begin{bmatrix} g_x \\ g_y \end{bmatrix} = \begin{bmatrix} \partial f /\partial x \\ \partial f /\partial y \ \end{bmatrix} \tag{3.57}fgrad(f)=[gxgy]=[f/xf/y ](3.57)

向量∇f\nabla ff的幅度表示为M(x,y)M(x, y)M(x,y),也经常使用向量范数∥∇f∥\lVert\nabla f \rVertf
M(x,y)=∥f∥=mag(∇f)=gx2+gy2(3.58)M(x, y) = \lVert f \rVert = \text{mag}(\nabla f) = \sqrt{g_x^2 + g_y^2} \tag{3.58}M(x,y)=f=mag(f)=gx2+gy2(3.58)

是梯度向量方向的变化率在(x,y)(x, y)(x,y)处的值,是与原图像大小相同的图像,通常称为梯度图像

在某些实现中,使用绝对值来近似平方运算和平方根运算更合适:
M(x,y)≈∣gx∣+∣gy∣(3.59)M(x,y) \approx |g_x| + |g_y| \tag{3.59}M(x,y)gx+gy(3.59)

这个表达式通常会损失各向同性。

最简近似的一阶导数是gx=(z8−z5)g_x = (z_8 - z_5)gx=(z8z5)gy=(z6−z5)g_y = (z_6 - z_5)gy=(z6z5)

罗伯特交叉梯度算子,早期的图像处理使用交叉差值

gx=(z9−z5)和gy=(z8−z6)(3.60)g_x = (z_9 - z_5)和g_y = (z_8 - z_6) \tag{3.60}gx=(z9z5)gy=(z8z6)(3.60)
梯度图像计算为:
M(x,y)=[(z9−z5)2+(z8−z6)2]1/2(3.61)M(x, y) = \Big[(z_9 - z_5)^2 + (z_8 - z_6)^2 \Big]^{1/2} \tag{3.61}M(x,y)=[(z9z5)2+(z8z6)2]1/2(3.61)
M(x,y)≈∣z9−z5∣+∣z8−z6∣(3.62)M(x, y) \approx |z_9 - z_5| + |z_8 - z_6| \tag{3.62}M(x,y)z9z5+z8z6(3.62)

3×33\times 33×3的核
gx=∂f/∂x=(z7+2z8+z9)−(z1+2z2+z3)(3.63)g_x = \partial f/ \partial x = (z_7 + 2z_8 + z_9) - (z_1 +2z_2 + z_3) \tag{3.63}gx=f/x=(z7+2z8+z9)(z1+2z2+z3)(3.63)
gy=∂f/∂y=(z3+2z6+z9)−(z1+2z4+z7)(3.64)g_y = \partial f/ \partial y = (z_3 + 2z_6 + z_9) - (z_1 +2z_4 + z_7) \tag{3.64}gy=f/y=(z3+2z6+z9)(z1+2z4+z7)(3.64)
M(x,y)=[gx2+gy2]1/2=[[(z7+2z8+z9)−(z1+2z2+z3)]2+[(z3+2z6+z9)−(z1+2z4+z7)]2]1/2(3.65)M(x, y) = [g_x^2 + g_y^2]^{1/2} = \Big[[(z_7 + 2z_8 + z_9) - (z_1 +2z_2 + z_3)]^2 + [(z_3 + 2z_6 + z_9) - (z_1 +2z_4 + z_7)]^2\Big]^{1/2} \tag{3.65}M(x,y)=[gx2+gy2]1/2=[[(z7+2z8+z9)(z1+2z2+z3)]2+[(z3+2z6+z9)(z1+2z4+z7)]2]1/2(3.65)

def visualize_show_annot(img_show, img_annot, ax, string='img_annot'):"""add annotation to the image, values of each pixelparam: img: input imageparam: ax: axes of the matplotlib"""height, width = img_annot.shapeimg_show = img_show[:height, :width]ax.imshow(img_show, cmap='gray', vmin=0, vmax=255)thresh = 10 #img_show.max()/2.5for x in range(height):for y in range(width):if string == 'img_annot':ax.annotate(str(round(img_annot[x][y],2)), xy=(y,x),horizontalalignment='center',verticalalignment='center',color='white' if img_annot[x][y]>thresh else 'black')else:ax.annotate(string + str(x + y + 1), xy=(y,x),horizontalalignment='center',verticalalignment='center',color='white' if img_annot[x][y]>thresh else 'black')
# 一阶导数算子,罗伯特交叉梯度算子,Sobel算子
height, width = 3, 3
img_show = np.ones([height, width], dtype=np.uint8) * 250
img_ori = np.zeros([height, width], dtype=np.uint8)fig = plt.figure(figsize=(8, 6))
ax1 = fig.add_subplot(2, 3, 1)
ax1.set_title('3x3 Region'), visualize_show_annot(img_show, img_ori, ax1, string='z'), plt.xticks([]), plt.yticks([])img_ori = np.zeros([2, 2], np.int)
img_ori[0, 0] = -1
img_ori[1, 1] = 1
ax2 = fig.add_subplot(2, 3, 2)
ax2.set_title('Robert operator'), visualize_show_annot(img_show, img_ori, ax2), plt.xticks([]), plt.yticks([])img_ori = np.zeros([2, 2], np.int)
img_ori[0, 1] = -1
img_ori[1, 0] = 1
ax3 = fig.add_subplot(2, 3, 3)
ax3.set_title('Robert operator'), visualize_show_annot(img_show, img_ori, ax3), plt.xticks([]), plt.yticks([])img_ori = np.zeros([3, 3], np.int)
img_ori[0, :] = np.array([-1, -2, -1])
img_ori[2, :] = np.array([1, 2, 1])
ax4 = fig.add_subplot(2, 3, 4)
ax4.set_title('Sobel operator'), visualize_show_annot(img_show, img_ori, ax4), plt.xticks([]), plt.yticks([])img_ori = np.zeros([3, 3], np.int)
img_ori[:, 0] = np.array([-1, -2, -1])
img_ori[:, 2] = np.array([1, 2, 1])
ax5 = fig.add_subplot(2, 3, 5)
ax5.set_title('Sobel operator'), visualize_show_annot(img_show, img_ori, ax5), plt.xticks([]), plt.yticks([])plt.tight_layout()
plt.show()

在这里插入图片描述

# Sobel梯度增强边缘
img_ori = cv2.imread("DIP_Figures/DIP3E_Original_Images_CH03/Fig0342(a)(contact_lens_original).tif", 0)sobel_x = np.zeros([3, 3], np.int)
sobel_x[0, :] = np.array([-1, -2, -1])
sobel_x[2, :] = np.array([1, 2, 1])sobel_y = np.zeros([3, 3], np.int)
sobel_y[:, 0] = np.array([-1, -2, -1])
sobel_y[:, 2] = np.array([1, 2, 1])# gx = separate_kernel_conv2D(img_ori, kernel=sobel_x)
# gy = separate_kernel_conv2D(img_ori, kernel=sobel_y)gx = cv2.filter2D(img_ori, ddepth=-1, kernel=sobel_x)
gy = cv2.filter2D(img_ori, ddepth=-1, kernel=sobel_y)gx = np.where(gx >= 100, gx, 0)
gx = np.where(gx < 100, gx, 1)
gy = np.where(gy >= 100, gy, 0)
gy = np.where(gy < 100, gy, 1)# 先对gx gy做二值化处理再应用下面的公式
# img_sobel = np.sqrt(gx**2 + gy**2)   # 二值化后,平方根的效果与绝对值很接近
img_sobel = abs(gx) + abs(gy)
img_sobel = np.uint8(normalize(img_sobel) * 255)plt.figure(figsize=(15, 12))
plt.subplot(1, 2, 1), plt.imshow(img_ori,   'gray', vmax=255), plt.title("Original"), plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(img_sobel, 'gray', vmax=255), plt.title("Sobel"), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

在这里插入图片描述

梯度还可用来突出灰度级图像中很难看到的小尺度图像(如异物、保护液中的气泡或镜片中的微小缺陷)。在平坦的灰度场中增强小的不连续的能力是梯度的呬个重要特征

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260757.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何学习Linux / 新手入门

如何学习Linux / 新手入门 一、从基础开始&#xff1a;常常有些朋友在Linux论坛问一些问题&#xff0c;不过&#xff0c;其中大多数的问题都是很基础的。例如&#xff1a;为什么我使用一个命令的时候&#xff0c;系统告诉我找不到该目录&#xff0c;我要如何限制使用者的权限等…

opacity用法:

/* older safari/Chrome browsers */ -webkit-opacity: 0.5; /* Netscape and Older than Firefox 0.9 */ -moz-opacity: 0.5; /* Safari 1.x (pre WebKit!) 老式khtml内核的Safari浏览器*/ -khtml-opacity: 0.5; /* IE9 etc...modern browsers */ opacity: .5; /* IE…

网络传输层之TCP、UDP详解

1、传输层存在的必要性 由于网络层的分组传输是不可靠的&#xff0c;无法了解数据到达终点的时间&#xff0c;无法了解数据未达终点的状态。因此有必要增强网络层提供服务的服务质量。 2、引入传输层的原因 面向连接的传输服务与面向连接的网络服务类似&#xff0c;都分为建立连…

关机与禁止关机代码

今天抽空,写完了定时关机程序的代码,测试了一下,还不错,以前写过个禁止关机的程序,用来测试一下,看哪个强,先运行禁止关机的程序,用Windows xp的关闭计算机试了一下,关不了. 代码很少: private procedure QueryEndSession(var Msg:TMessage);Message WM_QueryEndSession;…

pythonweb开发面试_Python web 面试题(一)

1、列举django的内置组件&#xff1f; url 、view、model、template、中间件 2、列举django中间件的5个方法&#xff1f;以及django中间件的应用场景&#xff1f; process_request(self,request) process_view(self, request, callback, callback_args, callback_kwargs) proce…

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波18 - 低通、高通、带阻和带通滤波器、组合使用空间增强方法

低通、高通、带阻和带通滤波器 得到空间滤波器的第三种方法&#xff0c;生成一维滤波器函数&#xff0c;然后要么使用式(3.42)wvvTw vv^TwvvT生成二维可分离的滤波器函数&#xff0c;要么旋转这些一维函数来生成二维核。旋转后的一维函数是圆对称&#xff08;各向同性&#x…

MySQL两千万数据优化迁移

最近有一张2000W条记录的数据表需要优化和迁移。2000W数据对于MySQL来说很尴尬&#xff0c;因为合理的创建索引速度还是挺快的&#xff0c;再怎么优化速度也得不到多大提升。不过这些数据有大量的冗余字段和错误信息&#xff0c;极不方便做统计和分析。所以我需要创建一张新表&…

Linux Tomcat 6.0安装配置实践总结

系统环境&#xff1a; Red Hat Enterprise Linux Server release 5.7 (Tikanga) 64位 Tomcat下载 从官方网站 http://tomcat.apache.org/下载你需要的Tomcat版本&#xff0c;目前Tomcat主要版本有Tomcat 6.0、Tomcat 7.0、Tomcat 8.0三个版本&#xff0c;下面我们以6.0(6.0.39…

如何给FormPanel表单中的元素赋值以及获取表单元素值

1.定义表单元素的name属性如下 var HLV new Ext.form.TextField({fieldLabel: 汇率,name:EXCHANGERATE,anchor: 30%}); 2.定义数据源 var ExchangeRatestore new Ext.data.Store({proxy: new Ext.data.HttpProxy({ url: WsECOTAX01.asmx/SelectExchangeRate, method: "po…

第4章 Python 数字图像处理(DIP) - 频率域滤波1 - 傅里叶级数和变换简史

本章主要讲解频域域滤波的技术&#xff0c;主要技术用到是大家熟悉的傅里叶变换与傅里叶反变换。这里有比较多的篇幅讲解的傅里叶的推导进程&#xff0c;用到Numpy傅里叶变换。本章理论基础比较多&#xff0c;需要更多的耐心来阅读&#xff0c;有发现有错误&#xff0c;可以与我…

python中str是什么函数_python str函数怎么用

展开全部 是将一个2113对象转成字符串显示5261&#xff0c;注意只是显示用&#xff0c;有些对象4102转成字符串没有直1653接的意思。 str():将变量转化为字符串类型 a 1 b [1, 2, 3] str_a str(a) print(a) print(type(a)) str_b str(b) print(b) print(type(b)) The str()…

[ofbiz]less-than (lt;) and greater-than (gt;) symbols

问题描述&#xff1a; In field [updateItemStr] less-than (<) and greater-than (>) symbols are not allowed 此处的field [updateItemStr]是services的一个IN参数&#xff0c;错误描述的意思是"<,>"不能出现在这个域内。 解决办法&#xff1a; 在ser…

分页探究--Filter+JSTL

最近卡了一个功能就是分页&#xff0c;查了很多资料&#xff0c;分页大概是两种类型&#xff1a;一种是把数据库的东西全部查出来然后放在session里&#xff0c;用list一页一页传到页面&#xff0c;这样的消耗比较大;另一种就是使用sql语句的limit来进行数据库分页查询。我使用…

iPhone开发资料之内存管理 ,循环引用导致的内存问题

iPhone开发资料之内存管理 ,循环引用导致的内存问题 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447 http://en.wikipedia.org/wiki/Reference_counting 【IT168 技术文档】开…

python能做大型游戏吗_python有做大型游戏的潜力吗?

著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 岂止是有潜力&#xff0c;简直是很合适&#xff01; 猪厂两大游戏客户端引擎&#xff0c;NeoX 和 Messiah&#xff0c;都使用 Python 作为脚本语言。 你最近所了解的比较火的挂着猪厂旗号的&a…

第4章 Python 数字图像处理(DIP) - 频率域滤波2 - 复数、傅里叶级数、连续单变量函数的傅里叶变换、卷积

目录基本概念复数傅里叶级数冲激函数及其取样&#xff08;筛选&#xff09;性质连续单变量函数的傅里叶变换卷积基本概念 复数 复数CCC的定义为 CRjI(4.3)C R jI \tag{4.3}CRjI(4.3) R,IR,IR,I为实数&#xff0c;RRR是实部&#xff0c;III是虚部&#xff0c;j−1j \sqrt{-…

不要迷失在技术的海洋中【转】

转自http://www.cnblogs.com/lovecherry/archive/2007/10/28/940555.html 不要迷失在技术的海洋中 技术就好像一片汪洋大海&#xff0c;越深入越望不到边际。就拿自己的体验来说吧&#xff0c;2000年的时候在学校搞ASP&#xff0c;觉得网页开发就是这么简单&#xff0c;把数据库…

使用代码设置Item级的权限(权限总结1)

itle in english:set Item Level Permission for SharePoint (MOSS/WSS) List/Document Library Programmatically 有些时候&#xff0c;我们需要为文档库里面某个文件设置特殊的权限&#xff0c;这个权限不继承自列表权限&#xff0c;当然最简单的最好是再创建一个列表&#…

echarts 4.0.4怎么下载_怎么让ECharts的提示框tooltip自动轮播?

1. 怎么让ECharts的提示框tooltip自动轮播?在用ECharts做大屏或者可视化展示项目的时候&#xff0c;让提示框tooltip自动轮播是比较常见的需求&#xff0c;给大家推荐一个插件叫echarts-tooltip-auto-show,名字是有点长&#xff0c;但是挺好用的。在hover显示tooltip之后&…

[React Native]高度自增长的TextInput组件

之前我们学习了从零学React Native之11 TextInput了解了TextInput相关的属性。 在开发中,我们有时候有这样的需求, 希望输入区域的高度随着输入内容的长度而增长, 如下&#xff1a; 这时候我们需要自定义一个组件&#xff1a; 在项目中创建AutoExpandingTextInput.js import …