图像处理:Python使用OpenCV进行图像锐化 (非锐化掩模、拉普拉斯滤波器)

文章目录

      • 非锐化掩模 (Unsharp Masking)
      • 拉普拉斯滤波器 (Laplacian Filter)
      • 效果对比
      • 总结

在图像处理中,锐化操作用于增强图像的边缘和细节,使图像看起来更清晰。常见的图像锐化方法包括非锐化掩模(Unsharp Masking)和拉普拉斯滤波器(Laplacian Filter)。

非锐化掩模 (Unsharp Masking)

步骤

  1. 模糊图像:使用高斯模糊滤波器对原图像进行模糊处理,得到模糊图像。
  2. 计算细节层:通过从原图像中减去模糊图像,得到细节层。
  3. 增强图像:将细节层乘以一个增益系数后加回到原图像,得到增强后的图像。

公式
设原图像为 ( I ),模糊图像为 (I blur ),细节层为 ( D ),增益系数为 ( k ),最终的锐化图像 ( I’ ) 计算如下:

D = I − I blur D = I - I_{\text{blur}} D=IIblur

I ′ = I + k ⋅ D I' = I + k \cdot D I=I+kD

代码示例

import cv2
import numpy as np

def unsharp_mask(image, k=1.5):
    # 高斯模糊图像
    blurred = cv2.GaussianBlur(image, (9, 9), 10.0)
    # 计算细节层
    detail = image - blurred
    # 增强图像
    sharpened = image + k * detail
    return np.clip(sharpened, 0, 255).astype(np.uint8)

image = cv2.imread('Task3.jpg')
sharpened_image = unsharp_mask(image)
cv2.imshow('Original Image', image)
cv2.imshow('Unsharp Masked Image', sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

拉普拉斯滤波器 (Laplacian Filter)

步骤

  1. 计算拉普拉斯图像:使用拉普拉斯算子计算图像的二阶导数,得到拉普拉斯图像。
  2. 增强图像:将拉普拉斯图像加回到原图像中,得到锐化后的图像。

公式
设原图像为 ( I ),拉普拉斯图像为 ( L ),最终的锐化图像 ( I’ ) 计算如下:

L = Δ I = ∂ 2 I ∂ x 2 + ∂ 2 I ∂ y 2 L = \Delta I = \frac{\partial^2 I}{\partial x^2} + \frac{\partial^2 I}{\partial y^2} L=ΔI=x22I+y22I

I ′ = I + k ⋅ L I' = I + k \cdot L I=I+kL

代码示例

import cv2
import numpy as np

def laplacian_sharpen(image, k=1.0):
    # 计算拉普拉斯图像
    laplacian = cv2.Laplacian(image, cv2.CV_64F)
    laplacian = np.uint8(np.absolute(laplacian))
    # 增强图像
    sharpened = cv2.addWeighted(image, 1, laplacian, k, 0)
    return sharpened

image = cv2.imread('path_to_your_image.jpg')
sharpened_image = laplacian_sharpen(image)
cv2.imshow('Original Image', image)
cv2.imshow('Laplacian Sharpened Image', sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果对比

了将非锐化掩模(Unsharp Masking)和拉普拉斯滤波器(Laplacian Filter)的方法整合到一个代码中,并对比展示效果,将两个锐化方法的结果放在同一个窗口中进行展示

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

def unsharp_mask(image, k=1.5):
    # 高斯模糊图像
    blurred = cv2.GaussianBlur(image, (9, 9), 10.0)
    # 计算细节层
    detail = image - blurred
    # 增强图像
    sharpened = image + k * detail
    return np.clip(sharpened, 0, 255).astype(np.uint8)

def laplacian_sharpen(image, k=1.0):
    # 计算拉普拉斯图像
    laplacian = cv2.Laplacian(image, cv2.CV_64F)
    laplacian = np.uint8(np.absolute(laplacian))
    # 增强图像
    sharpened = cv2.addWeighted(image, 1, laplacian, k, 0)
    return sharpened

def display_images(original, unsharp, laplacian):
    titles = ['Original Image', 'Unsharp Masked ', 'Laplacian Sharpened ']
    images = [original, unsharp, laplacian]
    plt.figure(figsize=(10, 10)) 
    for i in range(3):
        plt.subplot(1, 3, i + 1)
        plt.imshow(cv2.cvtColor(images[i], cv2.COLOR_BGR2RGB))
        plt.title(titles[i])
        plt.xticks([]), plt.yticks([])

    plt.show()

def main():
    image_path = 'Task3.jpg'  # 请替换为你的图像路径
    image = cv2.imread(image_path)

    if image is None:
        print(f"Error: Unable to load image at {image_path}")
        return

    unsharp_image = unsharp_mask(image)
    laplacian_image = laplacian_sharpen(image)

    display_images(image, unsharp_image, laplacian_image)

if __name__ == "__main__":
    main()

具体效果对比如下:不同的图片的效果可能不同
在这里插入图片描述

总结

这两种锐化方法各有优缺点,要根据具体需求选择合适的方法:

  • 非锐化掩模

    • 优点:能够灵活控制图像的锐化程度,通过调整增益系数和模糊程度,可以获得较为自然的锐化效果。
    • 缺点:在处理带有高噪声的图像时,容易放大噪声。
  • 拉普拉斯滤波器

    • 优点:计算简单,能够快速增强图像边缘和细节。
    • 缺点:容易引入噪声和伪影,对噪声不敏感的图像效果更好。

通过应用这些方法,可以有效增强图像的边缘和细节,使图像看起来更加清晰和锐利。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux:基础IO(二.缓冲区、模拟一下缓冲区、详细讲解文件系统)

上次介绍了:Linux:基础IO(一.C语言文件接口与系统调用、默认打开的文件流、详解文件描述符与dup2系统调用) 文章目录 1.缓冲区1.1概念1.2作用与意义 2.语言级别的缓冲区2.1刷新策略2.2具体在哪里2.3支持格式化 3.自己来模拟一下缓…

Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描

Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描 Burp Suite Professional, Test, find, and exploit vulnerabilities. 请访问原文链接:Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描…

JWT令牌、过滤器Filter、拦截器Interceptor

目录 JWT令牌 简介 JWT生成 解析JWT 登陆后下发令牌 过滤器(Filter) Filter快速入门 Filter拦截路径 过滤器链 登录校验Filter-流程 拦截器(Interceptor) Interceptor 快速入门 拦截路径 登录校验流程 JWT令牌 简介 全称:JSON Web Token(https://iwt.io/) …

springboot与flowable(12):网关服务(包容网关)

一、绘制流程图 包容网关可以看作是排他网关和并行网关的结合体。和排他网关一样,可以在外出顺序流上定义条件,包容网关会解析它们。但是主要的区别是包容网关可以选择多余一条顺序流,这和并行网关一样。包容网关的功能是基于进入和外出顺序流…

axure使用中继器画柱状图

源文件在顶部。 在axure通过读取中继器中的数据来画柱状图,如下图: 1)创建一个中继器,在里面创建两列:1列是柱状图底部的名称、2列是柱的高度,如下图: 2)双击中继器,画一…

华为OD机试 - 多段线数据压缩(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(D卷C卷A卷B卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测…

ord版本升级(0.15升级到0.18.5)

1、升级rust ~# rustup update stable ~# rustc --versionrustc 1.79.0 (129f3b996 2024-06-10)2、拉取0.18.5代码 ~# wget https://github.com/ordinals/ord/archive/refs/tags/0.18.5.tar.gz ~# tar -xf 0.18.5.tar.gz ~# cd ord-0.18.5 ~# cargo build --release3、启动se…

PDFFactoryFinePrint软件安装包下载+详细安装教程

简介: pdfFactory Pro(虚拟打印机)是一个无须 Acrobat 创建 Adobe PDF 文件的打印机驱动程序。 pdffactory pro虚拟打印机提供了比其他程序提供得更简单、更有效率和更少的花费的创建 PDF 文件的解决方案。用于需要安全的 PDF(法律文档、公司信息等)和其他高级功能…

网络通信架构

BS架构/CS架构 使用协议分别对应: TCP / HTTP 在计算机网络和软件开发中,CS架构(Client-Server Architecture,客户端-服务器架构)和BS架构(Browser-Server Architecture,浏览器-服务器架构&am…

【云岚到家】-day04-2-索引同步-搜索接口

【云岚到家】-day04-2-索引同步-搜索接口 1 索引同步1.1 编写同步程序1.1.1 创建索引结构1.1.2 编写同步程序1.1.2.1 添加依赖1.1.2.2 配置连接ES1.1.2.3 编写同步程序 1.1.3 测试1.1.4 小结1.1.4.1 如何保证CanalMQ同步消息的顺序性?1.1.4.2 如何保证只有一个消费者…

【Linux】进程_6

文章目录 五、进程8. 进程地址空间 未完待续 五、进程 8. 进程地址空间 上图可能很多人都看过了,这里再来验证一下: 验证位置: 验证堆栈的生长方向: 在上面的空间布局图中,有一个疑问,画的空间是 内存…

el-pagination 切换分页条数,会出现两次请求

文章目录 前言一、问题展示二、源码展示 前言 继上一次发现el-pagination在删除的时候pageNum不更新的问题。这次又发现了,切换分页条数,会出现两次请求。网上有很多解决方案,我就不多说了,我就简单记一下为啥会出现两次请求的问…

决策树算法:揭示数据背后的决策逻辑

目录 一 决策树算法原理 特征选择 信息增益 信息增益比 基尼指数 树的构建 树的剪枝 预剪枝 后剪枝 二 决策树算法实现 一 使用决策树进行分类 数据预处理 构建决策树模型 二 使用决策树进行回归 数据预处理 构建决策树回归模型 三 决策树算法的优缺点 优点 …

【Java】已解决java.lang.NoClassDefFoundError异常

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.lang.NoClassDefFoundError异常 一、问题背景 java.lang.NoClassDefFoundError 是 Java 运行时环境(JRE)在尝试加载某个类时,但没有找到…

《web应用技术》第十一次作业

1、验证过滤器进行权限验证的原理。 代码展示: Slf4j WebFilter(urlPatterns "/*") public class LoginCheckFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) thro…

轻松实现H5页面下拉刷新:滑动触发、高度提示与数据刷新全攻略

前段时间在做小程序到H5的迁移,其中小程序中下拉刷新的功能引起了产品的注意。他说到,哎,我们迁移后的H5页面怎么没有下拉刷新,于是乎,我就急忙将这部分的内容给填上。 本来是计划使用成熟的组件库来实现,…

手把手教你如何在Windows11下安装Docker容器

文章的主要要点: 为什么使用Docker:Docker可以简化部署过程,特别适合新手或在学习新技能(如Redis、MySQL、消息队列、Nginx等)时使用。 安装前的准备:在安装Docker之前,需要在Windows中开启一些…

python13 元组类型

元组用 () 声明,注意如果只有一个元素时要在元素后面加个 逗号, 否则不是类型就不是元组了。 声明方式2内置函数声明 data tuple(helloworld); 元组是不可变列表, 元组可以使用序列的所有功能。具体可以看我以前序列的文章 元组里的元素可以是多种数据类…

zynq qemu模拟器环境搭建

qemu是硬件模拟器,方便有些同学没得开发板想验证一些driver是否在指定板卡上可以测试,qemu就实现了该功能,选择qemu模拟器最好是选择cpu厂商指定qemu源码,这样测试结果更加逼真。本文章主要介绍如何搭建zynq平台qemu模拟器环境。 …

​单级高频谐振小放

目录 高频交流等效电路 质量指标 增益 通频带 选择性 高频交流等效电路 质量指标 增益 YL撇是怎么来的。 通频带 选择性