当前位置: 首页 > 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…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...