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

这篇具有很好参考价值的文章主要介绍了拉普拉斯锐化[原理及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)

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

∂ 2 f ∂ x 2 = f ( x + 1 ) − f ( x − 1 ) + 2 f ( 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),其拉普拉斯算子定义为:

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

x x x 方向和 y y y 方向上有:

∂ 2 f ∂ x 2 = f ( x + 1 , y ) + f ( x − 1 , y ) − 2 f ( 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)

∂ 2 f ∂ y 2 = f ( x , y + 1 ) + f ( x , y − 1 ) − 2 f ( 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)

∇ 2 f ( x , y ) = f ( x + 1 , y ) + f ( x − 1 , y ) + f ( x , y + 1 ) + f ( x , y − 1 ) − 4 f ( 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)

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

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

∇ 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 ) \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

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

锐化过程

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

g ( x , y ) = f ( x , y ) − [ ∇ 2 f ( 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)为锐化后所得到的图像函数。

由于 ∇ 2 f ( 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. 拉普拉斯滤波后的图像

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

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

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

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

代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

def 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_16S
    g[g<0] = 0
    g[g>255] = 255

    plt.figure(figsize=(10,14))

    # origin, des_8U, des_16S, filtered
    plt.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)

预备知识

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

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

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

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

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

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

拉普拉斯锐化[原理及Python实现](含拉氏标定、拉普拉斯标定)文章来源地址https://www.toymoban.com/news/detail-409341.html

参考文献

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

到了这里,关于拉普拉斯锐化[原理及Python实现](含拉氏标定、拉普拉斯标定)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器视觉技术与应用实战(平均、高斯、水平prewitt、垂直prewitt、水平Sobel、垂直Sobel、拉普拉斯算子、锐化、中值滤波)

         扯一点题外话,这一个月经历了太多,接连感染了甲流、乙流,人都快烧没了,乙流最为严重,烧了一个星期的38-39度,咳嗽咳到虚脱。还是需要保护好身体,感觉身体扛不住几次连续发烧!(甲流乙流是病毒,提前准备好奥司他韦,这个是阻断病毒复制的药,48小时内

    2024年01月21日
    浏览(57)
  • 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解

    K近邻算法和KD树详细介绍及其原理详解 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解 决策树算法和CART决策树算法详细介绍及其原理详解 线性回归算法和逻辑斯谛回归算法详细介绍及其原理详解 硬间隔支持向量机算法、软间隔支持向量机算法、非线性支持向量机算

    2024年02月04日
    浏览(83)
  • visual Studio MFC 平台实现拉普拉斯和拉普拉斯与直方图均衡化与中值滤波相结合实现比较

    本文使用visual Studio MFC 平台实现图像增强中的拉普拉斯变换,同时拉普拉斯一般不会单独使用,与其他平滑操作相结合,本文使用了拉普拉斯与直方图均衡化以及与中值滤波相结合,也对三种方式进行了对比 关于基础工程的创建可以参考 01-Visual Studio 使用MFC 单文档工程绘制

    2024年02月04日
    浏览(51)
  • 图像金字塔、高斯金字塔、拉普拉斯金字塔是怎么回事?附利用拉普拉斯金字塔和高斯金字塔重构原图的Python-OpenCV代码

    图像金字塔是对图像进行多分辨率表示的一种有效且简单的结构。 一个图像金字塔是一系列以金字塔形状排列的分辨率逐步降低的图像。图像金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率表示。 图像金字塔有什么作用? 图像金字塔常用于图像缩放、图像重

    2024年02月04日
    浏览(61)
  • 拉普拉斯矩阵的定义,常见的几种形式以及代码实现?

    拉普拉斯矩阵(Laplacian matrix) 也叫做导纳矩阵、基尔霍夫矩阵或离散拉普拉斯算子,主要应用在图论中,作为一个图的矩阵表示。对于图 G=(V,E),其Laplacian 矩阵的定义为 L=D-A,其中 L 是Laplacian 矩阵, D=diag(d)是顶点的度矩阵(对角矩阵),d=rowSum(A),对角线上元素依次为各个顶点

    2023年04月25日
    浏览(48)
  • 【信号与系统】(二十一)拉普拉斯变换与复频域分析——拉普拉斯变换及其性质

    傅里叶变换: j w jw j w 拉普拉斯变换: s = σ + j w s=sigma+jw s = σ + j w 有些函数不满足绝对可积条件 ,求解傅里叶变换困难。为此,可用一衰减因子 e − σ t e^{-sigma t} e − σ t ( σ sigma σ 为实常数)乘信号 f ( t ) f(t) f ( t ) ,适当选取 σ sigma σ 的值,使乘积信号 f ( t ) e −

    2024年02月09日
    浏览(60)
  • 拉普拉斯算子

    在介绍拉普拉斯算子概念之前我们先介绍,哈密尔顿算子( ∇ nabla ∇ ),梯度,散度等概念 所谓哈密尔顿算子即为某一物理量在笛卡尔坐标系下的偏导数的矢量和,其运算符号为: ∇ nabla ∇ ,定义如下: ∇ = δ δ x i + δ δ y j + δ δ z k nabla={frac{delta}{delta x}}pmb{i}+{f

    2024年02月09日
    浏览(49)
  • 拉普拉斯变换

    1.公式:设f(t)在t≥0时有定义, 其中s=β+jw。 注:L(1)=   L(sgnt)=   L()= 2.性质         性质1:          性质2:          性质3:         性质4:L()= 推导性质2:使用欧拉公式进行推导 同理,cosat= ,使用分部积分法,经过两次分部积分后会出现原来的积分,通过合并

    2024年02月05日
    浏览(46)
  • 【电路分析】拉普拉斯变换及其应用

    零状态响应 是指电路的外加激励源为零的情况下,由动态元件的初始储能引起的响应。 零输入响应 是指电路的初始状态为零(即换路前电容电压为零,电感电流为零),由外加激励源产生的响应。 该函数在 t0时幅值为1,在 t0 时幅值为-0,在 t=0时函数没有定义但为有限值

    2024年02月03日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包