拉普拉斯锐化[原理及Python实现](含拉氏标定、拉普拉斯标定)

拉普拉斯锐化

[原理及Python实现](含拉氏标定、拉普拉斯标定)

原创文章;转载请注明出处:©️ Sylvan Ding

锐化处理的主要目的是突出灰度的过度部分。图像锐化的用途多种多样,应用范围从电子印刷和医学成像到工业检测和军事系统的制导等。利用图像微分可以增强边缘和其他突变(如噪声),而削弱灰度变化缓慢的区域。

定义

对于一维函数,其一阶微分的定义如下(差值):(为了与二维函数图像的微分保持一致,这里使用了偏导符号)

∂f∂x=f(x+1)−f(x)\frac{\partial f}{\partial x} = f(x+1)-f(x)xf=f(x+1)f(x)

由此,不难推出其二阶微分(差分):

∂2f∂x2=f(x+1)−f(x−1)+2f(x)\frac{\partial ^2f}{\partial x^2} = f(x+1)-f(x-1)+2f(x)x22f=f(x+1)f(x1)+2f(x)

由上式可知,一阶微分需要"前瞻"一个值,而二阶微分不仅需要"前瞻"、还需要"后瞻"才能算出。所以在分析二阶微分的问题时,通常只考虑从第二个点到倒数第二个点的微分计算,以避免前一个点和下一个点不存在的情况。

对于二维函数图像 f(x,y)f(x,y)f(x,y),其拉普拉斯算子定义为:

∇2f=∂2f∂x2+∂2f∂y2\nabla^{2} f=\frac{\partial^{2} f}{\partial x^{2}}+\frac{\partial^{2} f}{\partial y^{2}}2f=x22f+y22f

xxx 方向和 yyy 方向上有:

∂2f∂x2=f(x+1,y)+f(x−1,y)−2f(x,y)\frac{\partial^{2} f}{\partial x^{2}}=f(x+1, y)+f(x-1, y)-2 f(x, y)x22f=f(x+1,y)+f(x1,y)2f(x,y)

∂2f∂y2=f(x,y+1)+f(x,y−1)−2f(x,y)\frac{\partial^{2} f}{\partial y^{2}}=f(x, y+1)+f(x, y-1)-2 f(x, y)y22f=f(x,y+1)+f(x,y1)2f(x,y)

∇2f(x,y)=f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y−1)−4f(x,y)\nabla^{2} f(x, y)=f(x+1, y)+f(x-1, y)+f(x, y+1)+f(x, y-1)-4 f(x, y)2f(x,y)=f(x+1,y)+f(x1,y)+f(x,y+1)+f(x,y1)4f(x,y)

核心思想

一阶微分表征了在某个方向上灰度的变化率,而二阶微分表征的是一阶微分的变化情况。对于灰度值的缓慢变化(斜坡过渡),一阶微分只能产生粗糙的边缘,但二阶微分可以形成"零交叉"(前后连个像素点间二阶微分差值很大,切连线与坐标轴相交,产生零点),比一阶微分更能反应出边界,在边缘检测中发挥着更加重要的作用。

由上述分析知,二阶微分在增强细节方面比一阶微分好得多,是适合锐化图像的立项特征,这就是拉普拉斯二阶微分算子锐化图像的核心思想。

构造拉普拉斯模版

拉普拉斯滤波通过滤波器模板(核)来实现。根据定义中对拉普拉斯算子的描述,不难得到:(模版1)

[0101−41010]\begin{bmatrix}0 & 1 & 0 \\ 1& -4 &1 \\ 0& 1 &0 \end{bmatrix}010141010

模版1中四个角均为 000,没有纳入拉普拉斯算子的线性计算中,因为这样构造出的模版只是在 x、y 坐标轴方向上求了二阶微分,那么可以考虑向定义中拉普拉斯算子里加入 45∘45^\circ45135∘135^\circ135 的对角线方向的二阶微分。

∇2f(x,y)=f(x−1,y+1)+f(x+1,y+1)+f(x+1,y−1)+f(x−1,y−1)+f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y−1)−8f(x,y)\nabla^{2} f(x, y)=f(x-1, y+1)+f(x+1, y+1)+f(x+1, y-1)+f(x-1, y-1)+f(x+1, y)+f(x-1, y)+f(x, y+1)+f(x, y-1)-8 f(x, y)2f(x,y)=f(x1,y+1)+f(x+1,y+1)+f(x+1,y1)+f(x1,y1)+f(x+1,y)+f(x1,y)+f(x,y+1)+f(x,y1)8f(x,y)

那么,将对角方向灰度变化纳入锐化中的拉普拉斯扩展模版2

[1111−81111]\begin{bmatrix} 1& 1 &1 \\ 1& -8 &1 \\ 1& 1 &1 \end{bmatrix}111181111

锐化过程

拉普拉斯算子强调的是图像中灰度的突变,并不强调灰度级缓慢变化的区域,将原图像和拉普拉斯图像叠加,可以增强边界的灰度值,以实现锐化。

g(x,y)=f(x,y)−[∇2f(x,y)]g(x, y)=f(x, y)-\left[\nabla^{2} f(x, y)\right]g(x,y)=f(x,y)[2f(x,y)]

其中,f(x,y)f(x,y)f(x,y) 为原图,g(x,y)g(x,y)g(x,y)为锐化后所得到的图像函数。

由于 ∇2f(x,y)\nabla^{2} f(x, y)2f(x,y) 拉普拉斯图像中既有负值也有正值,故在展示拉普拉斯图像时,负值会截断成灰度值 0,超过 255 的灰度值也会截断成 255,所以需要标定,本质上是归一化。

"卷积"过程中,为了避免产生黑边,所以边缘填充为镜像,对应openCV中BORDER_REFLECT_101.

二维卷积函数 filter2D

cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) -> dst

Convolves an image with the kernel.

The function applies an arbitrary linear filter to an image. In-place operation is supported. When the aperture is partially outside the image, the function interpolates outlier pixel values according to the specified border mode.

The function does actually compute correlation, not the convolution:

dst⁡(x,y)=∑0≤x′<kernel.cols 0≤y′<kernel.rows kernel⁡(x′,y′)∗src⁡(x+x′−anchor. x,y+y′−anchor.y )\operatorname{dst}(x, y)=\sum_{\begin{array}{l} 0 \leq x^{\prime}<\text { kernel.cols } \\ 0 \leq y^{\prime}<\text { kernel.rows }\end{array} } \operatorname{kernel}\left(x^{\prime}, y^{\prime}\right) * \operatorname{src}\left(x+x^{\prime}-\text { anchor. } x, y+y^{\prime}-\text { anchor.y }\right)dst(x,y)=0x< kernel.cols 0y< kernel.rows kernel(x,y)src(x+x anchor. x,y+y anchor.y )

That is, the kernel is not mirrored around the anchor point. If you need a real convolution, flip the kernel using flip and set the new anchor to (kernel.cols - anchor.x - 1, kernel.rows - anchor.y - 1).

Parameters:

  • src: input image.
  • dst: output image of the same size and the same number of channels as src.
  • ddepth: desired depth of the destination image, if set to -1, it will keep the same as the input
  • kernel: convolution kernel.
  • anchor: default value (-1,-1) means that the anchor is at the kernel center.
  • delta: optional value added to the filtered pixels before storing them in dst.
  • borderType: pixel extrapolation method.

ddepth:

CV_8U (0…255)

CV_8S (-128…127)

CV_16U (0…65535)

CV_16S (-32768…32767)

C is channel number, CV_8UC1 means 8 unsigned with a channel.

borderType:

cv2.BORDER_CONSTANT: It adds a constant colored border. The value should be given as a keyword argument

cv2.BORDER_REFLECT: The border will be mirror reflection of the border elements. Suppose, if image contains letters “abcdefg” then output will be “gfedcba|abcdefg|gfedcba“.

cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT: It does the same works as cv2.BORDER_REFLECT but with slight change. Suppose, if image contains letters “abcdefgh” then output will be “gfedcb|abcdefgh|gfedcba“.

cv2.BORDER_REPLICATE: It replicates the last element. Suppose, if image contains letters “abcdefgh” then output will be “aaaaa|abcdefgh|hhhhh“.

实验

使用模版1进行锐化的结果如下,从上到下依次为图片编号1、2、3、4:

  1. 原图
  2. 未标定的拉普拉斯图像
  3. 标定的拉普拉斯图像
  4. 拉普拉斯滤波后的图像

在这里插入图片描述

使用模版2进行锐化的结果如下:

在这里插入图片描述

不难发现,模版2 比 模版1 效果更好。

代码

import cv2
import numpy as np
import matplotlib.pyplot as pltdef Laplace(img, kernel):des_8U = cv2.filter2D(img, -1, kernel=kernel, borderType=cv2.BORDER_DEFAULT)des_16S = cv2.filter2D(img, ddepth=cv2.CV_16SC1, kernel=kernel, borderType=cv2.BORDER_DEFAULT)g = img - des_16Sg[g<0] = 0g[g>255] = 255plt.figure(figsize=(10,14))# origin, des_8U, des_16S, filteredplt.subplot(221)plt.imshow(img, cmap='gray')plt.title('origin')plt.subplot(222)plt.imshow(des_8U, cmap='gray')plt.title('des-8U')plt.subplot(223)plt.imshow(des_16S, cmap='gray')plt.title('des-16S')plt.subplot(224)plt.imshow(g, cmap='gray')plt.title('g')plt.show()img0 = 'moon.tif'f = cv2.imread(img0, cv2.IMREAD_GRAYSCALE)kernel1 = np.asarray([[0, 1, 0],[1, -4, 1],[0, 1, 0]])Laplace(f, kernel1)kernel2 = np.asarray([[1, 1, 1],[1, -8, 1],[1, 1, 1]])Laplace(f, kernel2)

预备知识

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

参考文献

  1. 数字图像处理:第3版,北京:电子工业出版社
  2. 图像分割——线检测——拉普拉斯标定(Matlab)
  3. 数据集下载地址

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

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

相关文章

以太坊 方法签名

最近在工作中使用web3j调用合约&#xff0c;发现一个比较头疼的问题&#xff1f;复杂一点的合约参数多了&#xff0c;函数的方法签名老是出错。在这之前调用合约方法一直都是拼接合约的函数签名以及参数。为了能快速的获取每个合约的函数签名&#xff0c;我在思考是否便捷可行解…

训练 GPT-3,为什么原有的深度学习框架吃不消?

来源&#xff1a;AI前线作者&#xff1a;一流科技 CEO 袁进辉近年来&#xff0c;深度学习被广泛应用到各个领域&#xff0c;包括计算机视觉、语言理解、语音识别、广告推荐等。在这些不同领域中&#xff0c;一个共同的特点就是模型规模越来越大&#xff0c;比如 GPT-3 模型的参…

Canny边缘检测原理及其python实现

Canny边缘检测原理及其python实现 转载请注明出处&#xff1a;©️ Sylvan Ding Canny边缘检测算法 多数分割算法均基于灰度值的两个基本性质之一&#xff1a;不连续性和相似性。图像的边缘检测就是基于灰度的不连续性&#xff08;灰度突变&#xff09;来实现图像分割的。…

离奇的梦境,能够防范大脑过拟合

来源&#xff1a;混沌巡洋舰 1 )梦让我们对世界的理解不再那么简单化关于为什么大脑进化出夜间做梦&#xff1f;神经科学界提出了各种假说&#xff0c;诸如通过梦来调节情绪&#xff0c;巩固记忆&#xff0c;或梦可以帮助我们选择性的遗忘&#xff0c;对我们应对现实世界的问题…

RGB空间中的彩色图像分割原理及其python实现

RGB空间中的彩色图像分割 ⭐️ 为尊重原创性&#xff01;转载请注明出处&#xff1a;©️ Sylvan Ding’s Blog 概述 本文论述了基于欧式距离和曼哈顿距离的彩色图像分割算法&#xff0c;并用python实现了各个算法。之后将二者的优势结合&#xff0c;提出了改进后的曼哈顿…

路飞学城Python-Day171

Evernote Export 线性结构&#xff1a;python的列表操作列表是如何存储的&#xff1a;顺序存储的&#xff0c;是一块连续的内存&#xff0c;内存是一堆格子&#xff0c;列表是一串连续的编号32位机器上一个整数占4个字节数组和列表有2点不同&#xff0c;1.数组的元素类型要求是…

HarmonyOS 2面世!是没有退路还是时机成熟?中国操作系统崛起元年或已到来

来源&#xff1a;21Tech(News-21)作者&#xff1a;倪雨晴编辑&#xff1a;张星6月2日晚间&#xff0c;华为鸿蒙操作系统HarmonyOS迎来重要时刻&#xff0c;华为正式发布多款搭载HarmonyOS 2的新产品&#xff0c;包括HUAWEI Mate 40系列新版本、Mate X2新版本、HUAWEI WATCH 3系…

操作系统:线程同步

操作系统&#xff1a;线程同步 使用Linux无名信号量实现了读写者线程的互斥和同步。 实验环境 环境&#xff1a;Linux语言&#xff1a;CCMake&#xff1a;3.17.1GCC&#xff1a;7.5.0IDE&#xff1a;Clion 2020.3.1 实验目标 理解进程同步的两种制约关系&#xff1a;互斥与…

中国工程院2021年院士增选第二轮候选人名单公布

来源&#xff1a;先进制造业中国工程院2021年院士增选进入第二轮评审候选人名单&#xff08;按候选人姓名拼音排序&#xff09;未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城…

vsftpd部署流程和常见问题详解

vsftpd部署流程和常见问题详解 ⭐️ 网上关于在云服务器里配置vsftpd的文章鱼龙混杂&#xff0c;没有一篇是可以彻底解决问题的&#xff0c;有些问题虽简单&#xff0c;但也让初学者感到困惑。本文详细说明vsftpd的部署流程和一些常见问题的解决方法&#xff0c;详述用户创建过…

谷歌发布史上最强人类大脑「地图」,1.3亿个突触,在线可视3D神经元「森林」!...

来源&#xff1a;Google AI Blog编辑&#xff1a;yaxin, LQ &#xff08;新智元&#xff09;突触&#xff0c;是神经网络的「桥梁」。我们知道&#xff0c;人类大脑有860亿个神经元&#xff0c;因为有了突触&#xff0c;才可以把神经元上的电信号传递到下一个神经元。长久以来&…

智慧食堂项目策划书(商业计划书/立项计划)

金鹰物联智慧食堂项目策划书&#xff08;商业计划书/立项计划&#xff09; ©️ 金鹰物联项目组&#xff0c;转载请注明出处&#xff01; ⭐️ 技术部分请参考博文&#xff1a;基于YOLOv5的中式快餐店菜品识别系统 文章目录金鹰物联智慧食堂项目策划书&#xff08;商业计划…

pipelineDB学习笔记-2. Stream (流)

一、流的定义&#xff1a; 所谓的“流”&#xff08;stream&#xff09;在pipelineDB中是指那些被允许的数据库客服端推送到 Continuous View&#xff08;连续视图&#xff09; 的时序化数据的一种“抽象”。流中的每一个raw(数据列)或者event(事件)&#xff0c;看起来是和普通…

银行家算法之Python实现[操作系统实验]

银行家算法 银行家算法是著名的死锁避免算法&#xff0c;其思想是&#xff1a;把操作系统视为银行家&#xff0c;操作系统管理的资源相当于银行家管理的资金&#xff0c;进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源。进程…

城市智能化发展中,AI公司应该做什么?

来源&#xff1a;虎嗅APP题图来源:视觉中国在上海长宁区的部分区域&#xff0c;你会发现共享单车总是能够整整齐齐的排列&#xff0c;并且在每一个你需要的街道路边&#xff0c;都能找到空闲的单车&#xff0c;既不会车辆爆满&#xff0c;也不会无车可骑。这些城市细微之处的体…

getchar(),putchar()用法

1.getchar函数可以接收用户输入的多个字符&#xff0c;只用等用户按下回车键后&#xff0c;getchar()函数才会从键盘缓冲区依次读出字符&#xff1b; 2.getchar()和putchar()结合使用&#xff0c;可以将读取的字符输出到屏幕&#xff1b; 3.函数原型&#xff1a; int getchar…

[操作系统]页面置换算法实验及C++实现(OPT、FIFO、LRU)

虚拟内存页面置换算法实验&#xff08;OPT、FIFO、LRU&#xff09; 进程运行时&#xff0c;若其访问的页面不再内存中而需将其调入&#xff0c;但内存已无空闲空间时&#xff0c;就需要从内存中调出一页程序或数据&#xff0c;送入磁盘的对换区。选择调出页面的算法就称为页面…

智谱AI多项成果惊艳亮相2021北京智源大会

来源&#xff1a;学术头条2021 年 6 月 1 日&#xff0c;由北京智源人工智能研究院&#xff08;以下简称 “智源”&#xff09;主办的 2021 北京智源大会在北京中关村国家自主创新示范区会议中心成功开幕。包括 Yoshua Bengio、David Patterson 等图灵奖获得者在内的两百余位国…

python-字典方法

1.字典的格式化字符串在转换说明符%后面加上键(圆括号括起来)&#xff1b;phonebook{"A":45,"B":"56"} s"As phone number is %(A)s." print(s%phonebook) 运行结果&#xff1a; #字典方法&#xff1a; #clear():清楚字典中的所有的项…

获得诺贝尔奖的底层小职员 | 从来没有一个高手,是在一夜之间强大起来的

来源&#xff1a;Pinterest优选2019年初NHK的一个访谈纪录片&#xff0c;看哭了很多网友。“感动&#xff0c;这才是真正的大神啊&#xff01;”纪录片的主人公&#xff0c;是2002年的诺贝尔化学奖得主——田中耕一。十九年前&#xff0c;他的获奖几乎是“都市传说”般的爆炸新…