当前位置: 首页 > news >正文

关于图像锐化的一份介绍

在这篇文章中,我将介绍有关图像锐化有关的知识,具体包括锐化的简单介绍、一阶锐化与二阶锐化等方面内容。

一、锐化

1.1 概念 

锐化(sharpening)就是指将图象中灰度差增大的方法,一次来增强物体的轮廓与边缘。因为发生锐化的地方都是发生灰度差突变的地方,所以锐化算法都是基于微分作用。

1.2 作用

一般来说,锐化增强灰度差,除了使物体与轮廓的细节增强后,它还是重要的预处理的一步,为了方便之后的物体检测与识别等。

二、一阶微分锐化方法

一阶微分锐化的计算公式十分简单,具体如下:

f'(x,y)=\frac{\partial f}{\partial x}+\frac{\partial f}{\partial y}

2.1 单方向一阶锐化

单方向的一阶锐化即是对某特定方向的边缘信息进行增强。通常,我们通过模板来实现,比如:

H=\begin{bmatrix} 1 & 2 & 1\\ 0 & 0&0 \\ -1 &-2 &-1 \end{bmatrix}

代码与处理后图像分别为:(代码中为了增强最后锐化后的效果,采用了垂直方向的锐化,而非上述模板中水平方向的锐化)

import cv2
import numpy as np
import matplotlib.pyplot as pltimage = cv2.imread(r'C:\Users\20349\Desktop\picture\tree.png')# 定义单方向一阶微分锐化模板
kernel = np.array([[1, 0, -1],[2, 0, -2],[1, 0, -1]])# 应用卷积核到图像上
sharpened_image = cv2.filter2D(image, -1, kernel)image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
sharpened_image_rgb = cv2.cvtColor(sharpened_image, cv2.COLOR_BGR2RGB)fig, axes = plt.subplots(1, 2)# 显示原图和处理后的图像
axes[0].imshow(image_rgb)
axes[0].set_title('Original Image')
axes[0].axis('off')  # 不显示坐标轴axes[1].imshow(sharpened_image_rgb)
axes[1].set_title('Sharpened Image')
axes[1].axis('off')  # 不显示坐标轴plt.show()

具体关于实现锐化部分的函数类似地可以写成代码如下:

def filter_2d(image, kernel):# 获取图像和卷积核的尺寸image_height, image_width, *image_channels = image.shapekernel_height, kernel_width = kernel.shape# 确保卷积核是奇数尺寸,以便有中心点if kernel_height % 2 == 0 or kernel_width % 2 == 0:raise ValueError("卷积核的宽高都应该是奇数")# 计算填充大小pad_size_height = kernel_height // 2pad_size_width = kernel_width // 2# 创建一个带有边框填充的图像副本,使用零填充padded_image = cv2.copyMakeBorder(image, pad_size_height, pad_size_height, pad_size_width, pad_size_width,cv2.BORDER_CONSTANT)# 如果图像是彩色图像,则需要分别处理每个通道if len(image_channels) > 0:channels = cv2.split(padded_image)output_channels = []for channel in channels:output_channel = np.zeros_like(channel)# 对于每个像素位置应用卷积for y in range(pad_size_height, image_height + pad_size_height):for x in range(pad_size_width, image_width + pad_size_width):region = channel[y - pad_size_height:y + pad_size_height + 1,x - pad_size_width:x + pad_size_width + 1]output_channel[y - pad_size_height, x - pad_size_width] = (region * kernel).sum()output_channels.append(output_channel)output_image = cv2.merge(output_channels)else:# 对于灰度图像直接处理output_image = np.zeros_like(image)for y in range(pad_size_height, image_height + pad_size_height):for x in range(pad_size_width, image_width + pad_size_width):region = padded_image[y - pad_size_height:y + pad_size_height + 1,x - pad_size_width:x + pad_size_width + 1]output_image[y - pad_size_height, x - pad_size_width] = (region * kernel).sum()return output_image

(该函数代码与实际调用的函数代码略有不同)

此外,在进行了上述步骤后进行取绝对值操作,可以增强对比度,避免负值影响问题等。 

2.2 无方向一阶锐化

通过观察处理结果,我们发现单方向一阶微分锐化对于矩形特征的物体处理效果优秀,但对于不规则的物体处理效果有所欠缺,此时就需要无方向一阶微分锐化。

交叉微分锐化

首先是交叉微分锐化,其表达式为:

g(i,j)=|f(i+1,j+1)-f(i,j)|+|f(i+1,j)-f(i,j+1)|

该方法可以用代码表示为如下,以及其处理结果也如下所示:

def roberts_cross(image):image_height, image_width = image.shapeoutput_image = np.zeros_like(image)# 定义Roberts算子kernel_x = np.array([[1, 0], [0, -1]])kernel_y = np.array([[0, -1], [1, 0]])# 对每个像素应用Roberts算子for y in range(0, image_height - 1):for x in range(0, image_width - 1):region = image[y:y + 2, x:x + 2]gradient_x = (region * kernel_x).sum()gradient_y = (region * kernel_y).sum()output_image[y, x] = np.sqrt(gradient_x ** 2 + gradient_y ** 2)# 归一化output_image = cv2.normalize(output_image, None, 0, 255, cv2.NORM_MINMAX)return output_image.astype(np.uint8)

Sobel锐化

关于Sobel锐化可以用表达式表示为:

g(i,j)=(d^2 _x(i,j)+d^2 _y(i,j))^{\frac{1}{2}}

其中:

d_x =\begin{bmatrix} -1 &0 &1 \\ -2&0 &2 \\ -1&0 &1 \end{bmatrix}        d_y = \begin{bmatrix} -1 & -2 &1 \\ 0&0 &0 \\ 1 &2 &1 \end{bmatrix}

代码以及结果分别为:

def sobel_sharpen(image):image_float = image.astype(float)# 定义Sobel算子kernel_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])kernel_y = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])# 计算x方向和y方向的梯度gradient_x = cv2.filter2D(image_float, -1, kernel_x)gradient_y = cv2.filter2D(image_float, -1, kernel_y)# 合并两个方向的梯度gradient_magnitude = np.sqrt(gradient_x ** 2 + gradient_y ** 2)sharpened_image = image_float + gradient_magnitudesharpened_image = np.clip(sharpened_image, 0, 255)return sharpened_image.astype(np.uint8)

Prewitt锐化

如果将刚才的Sobel算法中核进行修改即可得到Prewitt算法,具体Prewitt算法的核为:

d_x =\begin{bmatrix} -1 & 0 &1 \\ -1& 0& 1\\ -1& 0& 1 \end{bmatrix}        d_y = \begin{bmatrix} -1& -1 & -1\\ 0 & 0 &0 \\ 1& 1 &1 \end{bmatrix}

其处理结果为:

三、二阶微分锐化方法

Laplacin算法

关于Laplacin算法的模板为:

H_1 = \begin{bmatrix} 0 & -1 & 0\\ -1 & 4 &-1 \\ 0 & -1 & 0 \end{bmatrix}

这个模板可以通过如下的表达式推导得出:

\triangledown ^2 f = \frac{\partial ^2f}{\partial x^2}+\frac{\partial ^2f}{\partial y^2}

(具体推导过程省略)

那么我们将这个模板用于锐化后得到结果为:

接着,我们为了增强最后Laplacian微分锐化的效果,我们可以对于刚才的模板进行修改,比如:

H_2=\begin{bmatrix} -1 &-1 &-1 \\ -1 & 8 & -1\\ -1 & -1 & -1 \end{bmatrix}

但要注意在修改这个模板时要注意配平,不然会出现问题。

刚才这个模板得到的结果如下:

为了展示效果,这里再提供一个未配平的模板,如下:

 H_2=\begin{bmatrix} -1 &-1 &-1 \\ -1 & 9 & -1\\ -1 & -1 & -1 \end{bmatrix}

运用这个模板处理后的结果如下:(可以发现这个处理结果十分接近原图)

Wallis算法

如果对于刚才的这些模板中加入对数的处理,就可以得到Wallis算法,这种算法更接近人眼的视觉特性,得到的结果在暗区也可以很好处理,下面是一个模板举例:

H_2=\begin{bmatrix} -\frac{1}{8} &-\frac{1}{8} &-\frac{1}{8} \\-\frac{1}{8}& 1 & -\frac{1}{8}\\ -\frac{1}{8}& -\frac{1}{8} & -\frac{1}{8} \end{bmatrix}

处理结果如下:

 此上

相关文章:

关于图像锐化的一份介绍

在这篇文章中,我将介绍有关图像锐化有关的知识,具体包括锐化的简单介绍、一阶锐化与二阶锐化等方面内容。 一、锐化 1.1 概念 锐化(sharpening)就是指将图象中灰度差增大的方法,一次来增强物体的轮廓与边缘。因为发…...

Django开发入门 – 0.Django基本介绍

Django开发入门 – 0.Django基本介绍 A Brief Introduction to django By JacksonML 1. Django简介 1) 什么是Django? 依据其官网的一段解释: Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. …...

多智能体协作架构模式:驱动传统公司向AI智能公司转型

前言 在数字化浪潮的席卷下,传统公司的运营模式正面临着前所未有的挑战。随着市场竞争的日益激烈,客户需求的快速变化以及业务复杂度的不断攀升,传统公司在缺乏 AI 技术支撑的情况下,暴露出诸多痛点。在决策层面,由于…...

CentOS服务器部署Docker+Jenkins持续集成环境

一、准备工作 一台运行 CentOS 的服务器,确保有足够的磁盘空间、内存资源,并且网络连接稳定。建议使用 CentOS 7 或更高版本,本文以 CentOS 7 为例进行讲解。 拥有服务器的 root 权限,因为后续安装软件包、配置环境等操作需要较…...

【prompt实战】AI +OCR技术结合ChatGPT能力项目实践(BOL提单识别提取专家)

本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 1. 需求背景 2. 目标 3. BOL通用处理逻辑…...

【Android】Android开发应用如何开启任务栏消息通知

Android开发应用如何开启任务栏消息通知 1. 获取通知权限2.编写通知工具类3. 进行任务栏消息通知 1. 获取通知权限 在 AndroidManifest.xml 里加上权限配置&#xff0c;如下。 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android…...

上传文件报错:the request was rejected because no multipart boundary was found

后端使用的springboot的MultipartFile上传文件&#xff0c;接口使用apifox调试过没有问题&#xff0c;但前端调接口报错。前端使用了fetch发送formData数据。 the request was rejected because no multipart boundary was found 前端使用的请求头是 multipart/form-data 没有…...

大模型—Dify本地化部署实战

Dify本地化部署实战 系统要求 安装 Dify 之前, 请确保你的机器已满足最低安装要求: CPU >= 2 CoreRAM >= 4 GiB本地部署 开始前先简单介绍下部署Dify需要用到的组件,稍微有点多,但放心,有Docker你怕啥? 关系数据库:postgres缓存:Redis向量数据库:支持weaviate…...

功能架构元模型

功能架构的元模型是对功能架构进行描述和建模的基础框架,它有助于统一不同团队对系统的理解,并为系统的设计和开发提供一致的标准和规范。虽然具体的元模型可能因不同的应用领域和特定需求而有所差异,但一般来说,功能架构的元模型可以涵盖以下几个方面: 组件/模块元模型:…...

常用工具类——Collections集合框架

常用工具类——Collections集合框架 Collections 是 JDK 提供的一个工具类&#xff0c;提供了一系列静态方法&#xff0c;分类来复习&#xff01; 1.排序操作 reverse(List list) :反转顺序shuffle(List list) &#xff1a; 洗牌&#xff0c;将顺序打乱sort(List list) &…...

e2studio开发RA2E1(9)----定时器GPT配置输入捕获

e2studio开发RA2E1.9--定时器GPT配置输入捕获 概述视频教学样品申请硬件准备参考程序源码下载选择计时器时钟源UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()printf输出重定向到串口定时器输入捕获配…...

25/2/7 <机器人基础>雅可比矩阵计算 雅可比伪逆

雅可比矩阵计算 雅可比矩阵的定义 假设我们有一个简单的两个关节的平面机器人臂&#xff0c;其末端执行器的位置可以表示为&#xff1a; 其中&#xff1a; L1​ 和 L2 是机器人臂的长度。θ1​ 和 θ2是关节的角度。 计算雅可比矩阵 雅可比矩阵 JJ 的定义是将关节速度与末…...

网络爬虫js逆向之异步栈跟栈案例

【注意&#xff01;&#xff01;&#xff01;】 前言&#xff1a; 1. 本章主要讲解js逆向之异步栈跟栈的知识&#xff08;通过单步执行调试&#xff09; 2. 使用关键字搜定位加密入口 3. 本专栏通过多篇文章【文字案例】的形式系统化进行描述 4. 本文章全文进行了脱敏处理 5. 详…...

使用Ollama本地部署deepseek

1、下载安装Ollama 前往下载页面 https://ollama.com/download下载好安装包&#xff0c;如同安装软件一样&#xff0c;直接安装即可 win中默认为C盘&#xff0c;如果需要修改到其他盘&#xff0c;查找具体教程 运行list命令&#xff0c;检查是否安装成功 2、修改模型下载的…...

Rust错误处理:从灭火器到核按钮的生存指南

开篇&#xff1a;错误处理的生存哲学 在Rust的平行宇宙里&#xff0c;错误分为两种人格&#xff1a; panic! → 核按钮&#x1f4a3;&#xff08;不可恢复&#xff0c;全系统警报&#xff09;Result → 灭火器&#x1f9ef;&#xff08;可控制&#xff0c;局部处理&#xff0…...

Golang:Go 1.23 版本新特性介绍

流行的编程语言Go已经发布了1.23版本&#xff0c;带来了许多改进、优化和新特性。在Go 1.22发布六个月后&#xff0c;这次更新增强了工具链、运行时和库&#xff0c;同时保持了向后兼容性。 Go 1.23 的新增特性主要包括语言特性、工具链改进、标准库更新等方面&#xff0c;以下…...

电脑运行黑屏是什么原因?原因及解决方法

电脑运行黑屏是指电脑在正常开机或使用过程中&#xff0c;突然出现屏幕变黑&#xff0c;无法显示任何内容的现象。这种现象可能会给用户带来很多不便&#xff0c;甚至造成数据丢失或硬件损坏。那么&#xff0c;电脑运行黑屏是什么原因呢&#xff1f;下面我们将分析几种可能的原…...

redis之AOF持久化过程

流程图 在redis.conf文件中配置appendonly为yes则开启aof持久化机制 #开启aof持久化&#xff0c;默认关闭为no appendonly no也可以在命令行开启 aof刷盘策略 #每个写操作都会同步刷盘。 appendfsync always #执行命令后先放入aof缓冲区&#xff0c;每秒钟将缓冲区数据刷盘…...

Elasticsearch:向量搜索的快速介绍

作者&#xff1a;来自 Elastic Valentin Crettaz 本文是三篇系列文章中的第一篇&#xff0c;将深入探讨向量搜索&#xff08;也称为语义搜索&#xff09;的复杂性&#xff0c;以及它在 Elasticsearch 中的实现方式。 本文是三篇系列文章中的第一篇&#xff0c;将深入探讨向量搜…...

Docker在安装时遇到的问题(第一部分)

一、在用docker-config-manager安装yum源时出现错误 [rootlocalhost ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 已加载插件&#xff1a;fastestmirror, langpacks adding repo from: https://download.docker.com/linux/ce…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...