用于图像处理的高斯滤波器 (LoG) 拉普拉斯

news/2024/7/21 3:42:49 标签: 图像处理, 人工智能

一、说明

        欢迎来到拉普拉斯和高斯滤波器的拉普拉斯的故事。LoG是先进行高斯处理,继而进行拉普拉斯算子的图像处理算法。用拉普拉斯具有过零功能,实现边缘岭脊提取。

二、LoG算法简述

        在这篇博客中,让我们看看拉普拉斯滤波器和高斯滤波器的拉普拉斯滤波器以及 Python 中的实现。拉普拉斯滤波器的故事始于图论中的拉普拉斯矩阵,这是在矩阵中表示图的最简单方法。图像的拉普拉斯高亮了强度快速变化的区域。任何具有明显不连续性的特征都将由拉普拉斯算子增强。拉普拉斯滤波器属于导数滤波器类别。它是一种二阶滤波器,用于图像处理,用于边缘检测和特征提取。当我们使用一阶导数滤波器时,我们必须应用单独的滤波器来检测垂直和水平边缘,然后将两者结合起来。但是拉普拉斯滤波器可以检测所有边缘,而不管方向如何。

        在数学上,拉普拉斯滤波器定义为:

        拉普拉斯滤波器函数

        存在 2 种类型的拉普拉斯滤波器。

  1. 拉普拉斯阳性
  2. 负拉普拉斯

        正拉普拉斯算子使用掩码,中心元素为负值,角元素为 0。此滤镜可识别图像的外边缘。下面给出了一个过滤器掩码示例。

阳性拉普拉斯掩模

        负拉普拉斯算子用于查找图像的内边缘。它使用标准蒙版,中心元素为正元素,角元素为 0,所有其他元素为 -1。下面给出一个示例。

负拉普拉斯掩码

        在这两种情况下,筛选器中的值总和应为 0。标准面罩有不同的变体可供选择。你可以试穿它。

三、过零功能

        过零点是数学函数的符号在函数图中发生变化的点。在图像处理中,使用拉普拉斯滤波器的边缘检测是通过将图中导致零的点标记为潜在的边缘点来进行的。此方法适用于在两个方向上查找边缘的图像,但当在图像中发现噪点时效果不佳。因此,我们通常在拉普拉斯滤波器之前应用 Guassian 滤波器对图像进行平滑处理。它通常被称为瓜西拉普拉斯 (LoG) 滤波器。我们可以将 Guassian 和 Laplacian 运算组合在一起,组合滤波器的数学表示如下:

LoG滤波器功能

四、代码块

        方法 1

        下面提到了实现 LoG 过滤器的 OpenCV 内置函数方法。

#OPENCV implementation

import cv2
import matplotlib.pyplot as plt
image = cv2.imread(r"E:\eye.png", cv2.IMREAD_COLOR)
image = cv2.GaussianBlur(image, (3, 3), 0)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
filtered_image = cv2.Laplacian(image_gray, cv2.CV_16S, ksize=3)
# Plot the original and filtered images
plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.imshow(image, cmap='gray')
plt.title('Original Image')

plt.subplot(122)
plt.imshow(filtered_image, cmap='gray')
plt.title('LoG Filtered Image')

plt.show()

        程序输出:

        方法 2

        在 openCV 中实现 LoG 过滤器的 Python 函数如下所示。

import cv2
import matplotlib.pyplot as plt
import numpy as np
def LoG_filter_opencv(image, sigma, size=None):
    # Generate LoG kernel
    if size is None:
        size = int(6 * sigma + 1) if sigma >= 1 else 7

    if size % 2 == 0:
        size += 1

    x, y = np.meshgrid(np.arange(-size//2+1, size//2+1), np.arange(-size//2+1, size//2+1))
    kernel = -(1/(np.pi * sigma**4)) * (1 - ((x**2 + y**2) / (2 * sigma**2))) * np.exp(-(x**2 + y**2) / (2 * sigma**2))
    kernel = kernel / np.sum(np.abs(kernel))

    # Perform convolution using OpenCV filter2D
    result = cv2.filter2D(image, -1, kernel)

    return result

# Example usage:
image = cv2.imread(r"E:\eye.png", cv2.IMREAD_GRAYSCALE)  # Replace 'path_to_your_image.png' with your image path
sigma = 2.0
filtered_image = LoG_filter_opencv(image, sigma)
filtered_image = cv2.convertScaleAbs(filtered_image)
plt.imshow(filtered_image, cmap="gray")

        程序的输出:

        方法 3

        下面给出了使用 scipy 包的 LoG 过滤器的 Python 函数实现。

import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import convolve
from scipy import misc

def LoG_filter(image, sigma, size=None):
    # Generate LoG kernel
    if size is None:
        size = int(6 * sigma + 1) if sigma >= 1 else 7

    if size % 2 == 0:
        size += 1

    x, y = np.meshgrid(np.arange(-size//2+1, size//2+1), np.arange(-size//2+1, size//2+1))
    kernel = -(1/(np.pi * sigma**4)) * (1 - ((x**2 + y**2) / (2 * sigma**2))) * np.exp(-(x**2 + y**2) / (2 * sigma**2))
    kernel = kernel / np.sum(np.abs(kernel))

    # Perform convolution
    result = convolve(image, kernel)

    return result

# Example usage:
image = cv2.imread(r"E:\eye.png", cv2.IMREAD_GRAYSCALE)  # Replace 'path_to_your_image.png' with your image path
sigma = 2.0
filtered_image = LoG_filter(image, sigma)

# Plot the original and filtered images
plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.imshow(image, cmap='gray')
plt.title('Original Image')

plt.subplot(122)
plt.imshow(filtered_image, cmap='gray')
plt.title('LoG Filtered Image')

plt.show()

        程序输出:

        希望您喜欢阅读。这是关于图像处理中常用过滤器的另一篇文章的链接 用于图像处理的不同过滤器 | by 拉吉·利尼 |中。


http://www.niftyadmin.cn/n/5167036.html

相关文章

Postgresql数据类型-时间类型

PostgreSQL对时间、日期数据类型的支持丰富而灵活,本节介绍PostgreSQL支持的时间、日期类型,及其操作符和常用函数。 PostgreSQL支持的时间、日期类型如表所示。 我们通过一个简单的例子理解这几个时间、日期数据类型,先来看看系统自带的now…

Elastic Observability 8.11:ES|QL、APM 中的通用分析和增强的 SLOs

作者:Tom Grabowski, Katrin Freihofner, Israel Ogbole Elastic Observability 8.11 引入了 ES|QL for Observability(技术预览版)、Universal ProfilingTM 和 Elastic APM 集成,以及针对 Elastic Observability 的新 SLO &#…

使用sizeof()和strlen()去计算【数组】和【指针】的大小

文章目录 一、知识回顾1、回顾sizeof()、strlen的作用:2、数组和指针3、数组名 二、sizeof()、strlen()的使用区别1、注意区别:2、一维数组与一级指针3、二维数组与二级指针 三、总结回顾 一、知识回顾 1、回顾sizeof()、strlen的作用: siz…

移动医疗科技:开发互联网医院系统源码

在这个数字化时代,互联网医院系统成为了提供便捷、高效医疗服务的重要手段。本文将介绍利用移动医疗科技开发互联网医院系统的源码,为医疗行业的数字化转型提供有力支持。 智慧医疗、互联网医院这一类平台可以通过线上的形式进行部分医疗服务&#xff…

设计模式-命令模式(Command)

设计模式-命令模式(Command) 一、命令模式概述1.1 什么是命令模式1.2 简单实现命令模式1.3 使用命令模式的注意事项 二、命令模式的用途三、命令模式实现方式3.1 使用匿名内部类实现命令模式3.2 使用Lambda表达式实现命令模式3.3 使用Java内置的函数式接…

Redis数据类型之List类型

文章目录 简介常用命令赋值语法LPUSHRPUSHLPUSHXRPUSHX 取值语法LLENLINDEXLRANGE 删除语法LPOPRPOPBLPOPBRPOPLTRIMLREM 修改语法LSETLINSERT 高级命令RPOPLPUSH 应用场景 简介 List类型是一个链表结构的集合,其主要功能有push,pop,获取元素…

C语言中一维指针、二维指针和三维指针

指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。 如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。 假设…

基于nginx在视频播放器与服务器之间反向代理流程

1 服务器部署 由于我手里只有内网服务器,可以使用,因此在部署nginx代理服务器,使之在播放器和服务器之间实现反向代理并且缓存内容之前,需要做内网穿透,获得可与外界进行通信的地址。 如果想进行内网穿透,…