python图像处理 ——图像锐化

news2025/5/24 7:05:27

python图像处理 ——图像锐化

  • 前言
  • 一、原理
  • 二、 空间域锐化滤波
    • 1.拉普拉斯算子(Laplacian)
    • 2.罗伯茨算子(Roberts)
    • 3.Sobel算子
    • 4.Prewitt算子
    • 5.Scharr算子
  • 三、实验对比

前言

由于收集图像数据的器件或传输图像的通道存在一些质量缺陷,或者受其他外界因素的影响,使得图像存在模糊和有噪声的情况,从而影响到图像识别工作的开展。一般来说,图像的能量主要集中在其低频部分,噪声所在的频段主要在高频段,同时图像边缘信息主要集中在其高频部分。这将导致原始图像在平滑处理之后,图像边缘和图像轮廓模糊的情况出现。为了减少这类不利效果的影响,就需要利用图像锐化技术,使图像的边缘变得清晰。

一、原理

图像锐化是指增强图像的边缘和细节信息,使图像看起来更加清晰和生动。其原理主要是减小图像中像素值相对差异较小的区域,增加像素值相对差异较大的区域。一般而言,锐化处理的方法主要分为两类:增强高频信息和抑制低频信息

增强高频信息的方法主要是通过使用高通滤波器来实现,例如使用SobelLaplacian等滤波器。这些滤波器可以增强图像中的高频信息,即边缘和细节信息,使其更加明显和突出。

抑制低频信息的方法主要是通过使用平滑滤波器来实现,例如使用均值高斯等滤波器。这些滤波器可以减小图像中的低频信息,使其更加平滑和模糊,从而突出高频信息。

二、 空间域锐化滤波

图像模糊通过平滑(加权平均)来实现,类似于积分运算。图像锐化则通过微分运算(有限差分)实现,使用一阶微分或二阶微分都可以得到图像灰度的变化值。

图像锐化的目的是增强图像的灰度跳变部分,使模糊的图像变得清晰。图像锐化也称为高通滤波,通过和增强高频,衰减和抑制低频。图像锐化常用于电子印刷、医学成像和工业检测。

恒定灰度区域,一阶导数为零,二阶导数为零;
1.灰度台阶或斜坡起点区域,一阶导数非零,,二阶导数非零;
2.灰度斜坡区域,一阶导数非零,二阶导数为零。
3.图像梯度提取方法简单直接,能够有效的描述图像的原始状态,因此发展出多种图像梯度算子:Roberts、Prewitt、Sobel、Laplacian、Scharr。

1.拉普拉斯算子(Laplacian)

Laplacian算子是一种用于图像处理和计算机视觉的数学运算符。它是二阶导数算子的一种,可以用于检测图像中的边缘和纹理等特征。在离散形式下,Laplacian算子可以表示为:

Δ f ( x , y ) = f ( x − 1 , y ) + f ( x + 1 , y ) + f ( x , y − 1 ) + f ( x , y + 1 ) − 4 f ( x , y ) \Delta f(x,y) = f(x-1,y) + f(x+1,y) + f(x,y-1) + f(x,y+1) - 4f(x,y) Δf(x,y)=f(x1,y)+f(x+1,y)+f(x,y1)+f(x,y+1)4f(x,y)

其中 f ( x , y ) f(x,y) f(x,y) 是图像在 ( x , y ) (x,y) (x,y) 处的像素值, Δ f ( x , y ) \Delta f(x,y) Δf(x,y) 是Laplacian算子在 ( x , y ) (x,y) (x,y) 处应用后的结果。

Laplacian算子可以通过卷积运算来实现。在二维情况下,它通常被表示为以下的卷积核:

在这里插入图片描述

2.罗伯茨算子(Roberts)

Roberts算子是一种边缘检测算子,主要用于图像处理中的锐化和边缘检测。它是一种离散空间滤波器,可以检测图像中的垂直和水平边缘。

Roberts算子可以表示为两个卷积核,一个用于检测水平边缘,另一个用于检测垂直边缘。

在这里插入图片描述
如公式所示,分别表示图像的水平方向和垂直方向的计算公式。

在这里插入图片描述
Roberts算子像素的最终计算公式如下:

在这里插入图片描述
在Python中,Roberts算子主要通过Numpy定义模板,再调用OpenCV的filter2D()函数实现边缘提取。该函数主要是利用内核实现对图像的卷积运算,其函数原型如下所示:网址:yii666.com

dst = filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
– src表示输入图像
– dst表示输出的边缘图,其大小和通道数与输入图像相同
ddepth表示目标图像所需的深度
kernel表示卷积核,一个单通道浮点型矩阵
anchor表示内核的基准点,其默认值为(-1,-1),位于中心位置
delta表示在储存目标图像前可选的添加到像素的值,默认值为0
borderType表示边框模式

在进行Roberts算子处理之后,还需要调用convertScaleAbs()函数计算绝对值,并将图像转换为8位图进行显示。其算法原型如下:

dst = convertScaleAbs(src[, dst[, alpha[, beta]]])
src表示原数组
dst表示输出数组,深度为8位
alpha表示比例因子
beta表示原数组元素按比例缩放后添加的值
最后调用addWeighted()函数计算水平方向和垂直方向的Roberts算子。其运行代码如下:

3.Sobel算子

Sobel算子是一种边缘检测算子,常用于图像处理中。它可以检测图像中的水平和垂直边缘,并将它们分别表示为两个图像。这个算子是由Irwin Sobel于1968年提出的,可以用于提取图片中平滑区域与纹理区域之间的边界。

Sobel算子的原理是利用了图像像素点之间的差异来检测边缘。具体而言,Sobel算子将每个像素点周围的8个像素点加权求和,来检测该点周围像素的强度变化,从而确定像素点是否属于边缘。

Sobel算子分为水平与垂直两个方向:

在水平方向上,Sobel算子的卷积核如下:

   -1  -2  -1
    0   0   0
    1   2   1

在垂直方向上,Sobel算子的卷积核如下:

  -1   0  +1 
  -2   0  +2 
  -1   0  +1 

4.Prewitt算子

Prewitt是一种图像边缘检测的微分算子,其原理是利用特定区域内像素灰度值产生的差分实现边缘检测。由于Prewitt算子采用3×3模板对区域内的像素值进行计算,而Robert算子的模板为2×2,故Prewitt算子的边缘检测结果在水平方向和垂直方向均比Robert算子更加明显。Prewitt算子适合用来识别噪声较多、灰度渐变的图像,其计算公式如下所示。

在这里插入图片描述
具体的水平和垂直方向计算公式如下所示:

在这里插入图片描述
Prewitt算子像素的最终计算如公式所示。
在这里插入图片描述

5.Scharr算子

Scharr 算子也称为 Scharr 滤波器,计算 x 轴或 y 轴方向的图像差分。

Scharr 算子是 Soble 算子在 ksize=3 时的优化,与 Soble 的速度相同,且精度更高。Scharr 算子与 Sobel 算子的不同点是在平滑部分,其中心元素占的权重更重,相当于使用较小标准差的高斯函数,也就是更瘦高的模板。

Scharr 算子的卷积核为:
在这里插入图片描述
Scharr 算子很容易通过卷积操作 cv.filter2D 实现,OpenCV 也提供了函数 cv.Scharr 实现 Scharr 算子。

三、实验对比

选择一张模糊图像,将下列代码中的Laplace_kernel

cv2.filter2D(img, -1, Laplace_kernel)

替换成不同的卷积核,既可以完成锐化处理

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

# 读取图像
img = cv2.imread('girl.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# ===============================拉普拉斯算子锐化============================
Laplace_kernel = np.array([[-1,-1,-1],
                   [-1, 9,-1],
                   [-1,-1,-1]], dtype=np.float32)  # 定义拉普拉斯算子
                   # 应用锐化卷积核
Laplace_img = cv2.filter2D(img, -1, Laplace_kernel)

在这里插入图片描述

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

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

相关文章

pip install -r requirements.txt

挂了梯子报错 不挂梯子gg下

橙河网络:坏人是怎么形成的?

小A是一个非常热心的人,给谁帮忙,都免费。 大家都说,小 A,实在人呀,哈哈。 小B搬来了,他活多,弄不过来,常找小 A 来帮忙。 小A 每次来帮忙,小B 都给小A一张大团结(100…

SpringBoot集成Swagger接口文档/测试

文章目录 Swagger 介绍Swagger 使用常用注解 Swagger 介绍 使用 Swagger 你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。官网:https://swagger.io/ Knife4j 是为 Java MVC 框架集成 Swagg…

【Python】列表、集合、字典基础知识

列表 列表中元素的类型可以不同,列表内部存储方式是元素值存储在不连续的空间,但是把他们的指针存在一块连续的空间 列表的创建 1.list1[] 创建一个空列表 2.用list函数 3.split函数截取 列表的更新 1.通过索引[]改变 2.切片修改 3.列表方法更新 列表…

SLAM从入门到精通(参数标定)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 标定是slam开发过程中很重要的一个环节。这部分内容涉及到很多方面,比如说传感器、比如说算法、比如说机械,总之好的标定不…

C3P0、DBCP、Druid 三种数据库连接池的使用

文章目录 数据库连接池1 C3P0 数据库连接池2 DBCP 数据库连接池3 Druid 数据库连接池 数据库连接池 JDBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现&#xff…

SpringCloudTencent(上)

SpringCloudTencent 1.PolarisMesh介绍2.北极星具备的功能3.北极星包含的组件4.功能特性1.服务管理1.服务注册2.服务发现3.健康检查 2.配置管理 5.代码实战1.环境准备2.服务注册与发现3.远程调用 1.PolarisMesh介绍 1.北极星是腾讯开源的服务治理平台,致力于解决分…

Dev-C调试的基本方法2-1

在Dev-C中调试程序,首先需要在程序中设置断点,之后以调试的方式运行程序。 1 设置断点 当以调试的方式运行程序时,程序会在断点处停下来。点击要设置断点代码行号左侧部分,此时会有如图1所示的红点和绿色对勾,表示断…

Mybatis与Mybatis-Plus(注解与Xml)(单表与多表)

准备工作 这里我们准备了两个与数据库表对应的实体类,stu为学生表,cls为班级表 类属性上的注解如 TableId等 为Mybatis-Plus的注解,使用mybatis会无视掉这些注解 在Stu 类的最后一个属性我们定义了Cls实体类的对象,对于单表查询&…

使用php打印时间精确到毫秒及毫秒转成11位时间戳

在PHP中,可以使用microtime函数来获取当前时间,包括毫秒。以下是示例代码: // 获取当前时间戳(秒) $time microtime(true); // 将当前时间戳转换为毫秒 $milliseconds round($time * 1000); // 输出当前时间&#…

【C语法学习】12 - scanf()函数

文章目录 0 前言1 函数原型2 参数2.1 格式字符串2.1.1 转换说明 2.2 参数列表 3 返回值4 读取机制4.1 基本概念4.2 转换说明4.3 读取过程4.4 读取示例4.5 多参数 6 示例6.1 示例16.2 示例26.3 示例36.4 示例4 0 前言 scanf()函数虽然使用起来较为灵活,但是其读取机…

SpringBoot集成JPA实现分页和CRUD

SpringBoot集成JPA实现分页和CRUD 文章目录 SpringBoot集成JPA实现分页和CRUDpom.xmlapplication.propertiesaddCategory.jspeditCategory.jsphello.jsplistCategory.jspCategoryCategoryDAOCategoryServiceCategoryServiceImplPage4NavigatorRedisConfigCategoryControllerHel…

CH10_简化条件逻辑

分解条件表达式(Decompose Conditional) if (!aDate.isBefore(plan.summerStart) && !aDate.isAfter(plan.summerEnd))charge quantity * plan.summerRate; elsecharge quantity * plan.regularRate plan.regularServiceCharge;if (summer())…

C#中List<T>的 AddRange方法使用说明

文章目录 C#中List<T>的 AddRange方法使用说明 C#中List的 AddRange方法使用说明 AddRange可以一次性添加集合A到当前集合B。 本身不能为空&#xff0c;但是可以保存null的数据。 List 中会保留集合中元素的顺序 将集合A添加到集合B的末尾 本身为null&#xff0c;使用 A…

国际测试委员会BenchCouncil首发“开源系统杰出成果榜” 百度飞桨上榜

&#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于恒川的日常汇报系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初阶、C…

轻量封装WebGPU渲染系统示例<14>- 多线程模型载入(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/ModelLoadTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 细节请见&#xff1a;引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调用隔离。 …

uniapp 解决H5跨域的问题

uniapp 解决h5跨域问题 manifest.json manifest.json文件中&#xff0c;点击“源码视图”,在此对象的最后添加以下代码&#xff1a; "h5" : {"devServer" : {"port" : 8080, //端口号"disableHostCheck" : true,"proxy" :…

作为一个初学者,入门大模型其实没那么难

在生成式 AI 盛行的当下&#xff0c;你是否被这种技术所折服&#xff0c;例如输入一段简简单单的文字&#xff0c;转眼之间&#xff0c;一幅精美的图片&#xff0c;又或者是文笔流畅的文字就展现在你的面前。 相信很多人有这种想法&#xff0c;认为生成式 AI 深不可测&#xf…

通过@ConfigrationProperties读取配置文件属性并赋值

这种设计使得 Anything 成为 Something 类的静态成员&#xff0c;因此不依赖于外部类的实例。静态内部类通常更独立&#xff0c;它们可以单独存在且无需引用外部类的实例。 如果将 Anything 类定义为非静态的内部类&#xff0c;它将依赖于 Something 类的实例。这意味着每个 S…

Sybase PowerDesigner 16.7.7.7536 Crack

Power Designer 是Sybase公司的CASE工具集&#xff0c;使用它可以方便地对管理信息系统进行分析设计&#xff0c;他几乎包括了数据库模型设计的全过程。利用Power Designer可以制作数据流程图、概念数据模型、物理数据模型&#xff0c;还可以为数据仓库制作结构模型&#xff0c…