Python图像处理【15】基于非锐化掩码锐化图像

news2025/7/26 8:18:36

基于非锐化掩码锐化图像

    • 0. 前言
    • 1. 使用 scikit-image filters 模块执行非锐化掩码
    • 2. 使用 PIL ImageFilter 模块执行非锐化掩码
    • 3. 使用 SimpleITK 执行拉普拉斯锐化
    • 4. 使用 OpenCV 实现非锐化掩码
    • 小结
    • 系列链接

0. 前言

非锐化滤波器是一个简单的锐化算子,通过从原始图像中减去图像的平滑(非锐化)版本来增强边缘(以及图像中的其他高频分量),锐化的目的是突出图像中的细节或增强模糊的细节。在本节中,我们将学习如何利用 SimpleITKOpenCV 库函数使用非锐化掩码锐化图像。可以使用以下公式表示非锐化掩码的基本概念:

g ( x , y ) = f ( x , y ) − f s m o o t h ( x , y ) f s h a r p ( x , y ) = f ( x , y ) + k ∗ g ( x , y ) g(x,y)=f(x,y)-f_{smooth}(x,y) \\ f_{sharp}(x,y)=f(x,y)+k*g(x,y) g(x,y)=f(x,y)fsmooth(x,y)fsharp(x,y)=f(x,y)+kg(x,y)

1. 使用 scikit-image filters 模块执行非锐化掩码

scikit-image 库的 filters 模块提供了 unsharp_mask() 函数用于执行非锐化掩码,该函数接受参数半径 radius 和数量 amount,边缘边界变暗和变亮的程度由参数 amount 控制,参数 radius 是指平滑核的半径。

(1) 首先导入所需的模块和函数:

import numpy as np
import matplotlib.pylab as plt
from skimage.io import imread
from skimage.filters import unsharp_mask

(2) 使用 unsharp_mask() 函数,并使用不同的参数值调用该函数,以查看当滤波器应用于输入图像时,对输出锐化图像的影响:

im = imread('1.png')
im1 = unsharp_mask(im, radius=1, amount=1)
im2 = unsharp_mask(im, radius=5, amount=2)
im3 = unsharp_mask(im, radius=20, amount=3)

(3) 下图显示了执行以上代码带到输出图像,可以看出,参数半径 radius 和数量 amount 值增加得越大,图像变得越清晰:

fig, axes = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True, figsize=(20, 12))
axes = axes.ravel()
axes[0].set_title('Original image', size=10), axes[0].imshow(im)
axes[1].set_title('Enhanced image, radius=1, amount=1.0', size=10), axes[1].imshow(im1)
axes[2].set_title('Enhanced image, radius=5, amount=2.0', size=10), axes[2].imshow(im2)
axes[3].set_title('Enhanced image, radius=20, amount=3.0', size=10), axes[3].imshow(im3)
for ax in axes:
    ax.axis('off')
fig.tight_layout()
plt.show()

锐化效果

2. 使用 PIL ImageFilter 模块执行非锐化掩码

PIL.ImageFilter 模块的 unsharpmask() 函数可用于在图像上应用非锐化掩码。在函数中,要增强的边缘的大小受到函数半径 radius 参数的影响,较小的半径可增强小尺度(细)细节,较大的半径值可能会在边缘产生光晕(物体周围可检测到的微弱光线边缘);百分比 percent 参数表示非锐化强度。

(1) 导入所需的模块,并读取输入图像:

import numpy as np
import matplotlib.pylab as plt
from PIL import Image, ImageFilter
def plot_image(image, title=None, sz=10):
    plt.imshow(image)
    plt.title(title, size=sz)
    plt.axis('off')

im = Image.open('1.png')

(2) 使用函数 unsharpmask() 锐化输入图像,并观察使用不同参数值对图像锐化的影响:

plt.figure(figsize=(15,16))
plt.subplot(221), plot_image(im, 'original')
im1 = im.filter(ImageFilter.UnsharpMask(radius=2, percent=150))
plt.subplot(222), plot_image(im1, 'unsharp masking, radius=2, percent=150')
im1 = im.filter(ImageFilter.UnsharpMask(radius=5, percent=200))
plt.subplot(223), plot_image(im1, 'unsharp masking, radius=5, percent=200')
im1 = im.filter(ImageFilter.UnsharpMask(radius=10, percent=250))
plt.subplot(224), plot_image(im1, 'unsharp masking, radius=10, percent=250')
plt.tight_layout()
plt.show()

执行以上代码,可以得到如下锐化输出图像:

图像锐化

3. 使用 SimpleITK 执行拉普拉斯锐化

SimpleITK 库的 UnsharpMaskimageFilter() 也可以用来锐化图像,该函数是一个边缘增强滤波器。该滤波器从图像中减去图像的平滑版本,获得边缘增强效果。可以通过参数来控制锐化效果,主要包括数量 amount、半径 sigma、阈值 threshold 以及是否将结果值限制在输出类型范围内。

(1) 导入所需的库和模块,并读取输入图像,将读取的图像的类型应指定为浮点型,因为非锐化掩码滤波器不接受 UINT8 类型的图像。

import SimpleITK as sitk
import numpy as np
import matplotlib.pylab as plt

def plot_image(image, title=None, sz=10):
    plt.imshow(image)
    plt.title(title, size=sz)
    plt.axis('off')
image = sitk.ReadImage('1.png', sitk.sitkFloat32)

(2) 通过调用构造函数来创建一个 UnsharpMaskImageFilter 类的对象,设置数量 amountsigma (平滑)参数,然后,在输入图像上执行非锐化滤波,获得输出图像如下:

filt = sitk.UnsharpMaskImageFilter() 
filt.SetAmount(1.5) # typically set between 1 and 2
filt.SetSigmas(0.15)
sharpened = filt.Execute(image)

(3) 使用 GetArrayFromImage() 函数将输入和输出图像转换为 numpy 数组:

np_image = sitk.GetArrayFromImage(image)
np_image = np_image / np_image.max()
np_sharpened = sitk.GetArrayFromImage(sharpened)
np_sharpened = np_sharpened / np_sharpened.max()

(4) 绘制输入和输出图像:

plt.figure(figsize=(20,10))
plt.gray()
plt.subplots_adjust(0,0,1,1,0.05,0.05)
plt.subplot(121), plot_image(np_image, 'Original Image')
plt.subplot(122), plot_image(np_sharpened, 'Sharpened Image (with UnsharpMask)')
plt.show()

拉普拉斯锐化

4. 使用 OpenCV 实现非锐化掩码

接下来,我们直接利用在本节一开始给出的定义来实现非锐化掩码。我们在本节中使用函数 Gaussianblur() 获得平滑的输入图像和函数 AddWeighted() 混合两张图像。

(1) 读取输入图像,并使用 11 x 11 高斯核平滑输入图像,在 cv2.GaussianBlur() 函数中设定参数 σ x = σ y = 10 σx=σy= 10 σx=σy=10

import SimpleITK as sitk
import numpy as np
import matplotlib.pylab as plt
import cv2

def plot_image(image, title=None, sz=10):
    plt.imshow(image)
    plt.title(title, size=sz)
    plt.axis('off')

im = cv2.imread("1.png")
im_smoothed = cv2.GaussianBlur(im, (11,11), 10, 10)

(2) 根据非锐化掩码的定义可知:

sharpened = original + k.(original − smoothed) = (1 + k).original-ksmoothed

其中,k 为常数,该方程意味着锐化等效于将原始输入和平滑输入图像分别具有权重 1+k-k 进行混合。

(3) 使用 cv2.addWeighted() 函数来获得输出图像,其中 k=3.0

im1 = cv2.addWeighted(im, 1.0 + 3.0, im_smoothed, -3.0, 0) # im1 = im + 3.0*(im - im_smoothed)

(4) 绘制输入和输出图像:

plt.figure(figsize=(20,25))
plt.subplots_adjust(0,0,1,0.95,0.05,0.05)
plt.subplot(121), plot_image(cv2.cvtColor(im, cv2.COLOR_BGR2RGB), 'Original Image')
plt.subplot(122), plot_image(cv2.cvtColor(im1, cv2.COLOR_BGR2RGB), 'Sharpened Image')
plt.show()

图像锐化

小结

图像平滑与图像锐化是两种效果相反的图像处理技术,图像平滑往往使图像中的边界、轮廓变得模糊,而图像锐化就是为了减少模糊图像中不利于图像分析的效果,使图像的边缘变的清晰。本节中,我们学习了使用多种不同图像处理库(包括 scikit-imagePIL 以及 OpenCV 等)来解决图像锐化问题。

系列链接

Python图像处理【1】图像与视频处理基础
Python图像处理【2】探索Python图像处理库
Python图像处理【3】Python图像处理库应用
Python图像处理【4】图像线性变换
Python图像处理【5】图像扭曲/逆扭曲
Python图像处理【6】通过哈希查找重复和类似的图像
Python图像处理【7】采样、卷积与离散傅里叶变换
Python图像处理【8】使用低通滤波器模糊图像
Python图像处理【9】使用高通滤波器执行边缘检测
Python图像处理【10】基于离散余弦变换的图像压缩
Python图像处理【11】利用反卷积执行图像去模糊
Python图像处理【12】基于小波变换执行图像去噪
Python图像处理【13】使用PIL执行图像降噪
Python图像处理【14】基于非线性滤波器的图像去噪

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

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

相关文章

ArcGIS制作土地利用现状图

一、现状图成果 土地利用现状图是规划制图中一种基本的图件,基于ArcGIS制作的现状图如下所示: 二、现状图制作 1. 数据准备 (1)土地利用数据 (2)地形图 (3)影像地图 (4)其他数据 2. 符号化 加载现状地块数据。 双击地块图层,切换到符号系统,选择类别下的唯…

kubernetes-控制器

目录 一、replicaset 二、deployment 1、版本迭代 2、回滚 3、滚动更新策略 4、暂停与恢复 三、daemonset 四、statefulset 五、job 六、cronjob 一、replicaset ReplicaSet用于保证指定数量的 Pod 副本一直运行 vim rs-example.ymlapiVersion: apps/v1 kind: Replic…

Chat2DB Web版 服务器端安装部署启动流程

目录 前言安装部署过程下载安装包下载JDK17启动登录 可能出现的报错启动报错Java版本低flyway的bean创建失败登录失败无法执行二进制文件 前言 Chat2DB是款数据库连接工具,主要就是使用JDBC做数据库连接,外加多对接了几个聊天AI网站,把数据库…

敏捷开发框架Scrum-概述

如果你是一个程序员,可能会觉得这是个程序开发框架。我开始也是这样认为的。后来学习了PMP、敏捷后,才知道Scrum是一个用于管理团队工作的敏捷框架。Scrum可以理解成一个团队在一段时间里完成工作的方式。这里的一段时间通常很短,一到两周&am…

【好书推荐】ChatGPT 驱动软件开发:AI 在软件研发全流程中的革新与实践

前言 计算机技术的发展和互联网的普及,使信息处理和传输变得更加高效,极大地改变了金融、商业、教育、娱乐等领域的运作方式。数据分析、人工智能和云计算等新兴技术,也在不断地影响和改变着各个行业。 如今,我们正在见证人工智能…

vue 中methods方法为啥不能用箭头函数

vue用了很久了,但是又返回来看这个神秘的问题 这里理解不了:问题一:为啥他的上层就是script了呀,箭头函数没有作用域? 问题二:箭头函数没有作用域,但是外层的methods,{} 花括号不是…

518抽奖软件,可从Excel~Word~Pdf~网页导入名单

518抽奖软件简介 518抽奖软件,518我要发,超好用的年会抽奖软件,简约设计风格。 包含文字号码抽奖、照片抽奖两种模式,支持姓名抽奖、号码抽奖、数字抽奖、照片抽奖。(www.518cj.net) 从Excel、WPS表格导入 整列: 用鼠…

Linux C语言进阶-D1二维数组

数据类型 数组名[常量表达式][常量表达式] 定义方式:声明时列数不能省略,行数可以 由于内存是一维的,所以数组时顺序存放的:按行顺序排放 行名a[0]、a[1]、a[2]可以称为一维数组名 验证行名就是一维数组名: 1、数组名…

0基础学习PyFlink——时间滑动窗口(Sliding Time Windows)

在《0基础学习PyFlink——时间滚动窗口(Tumbling Time Windows)》我们介绍了不会有重复数据的时间滚动窗口。本节我们将介绍存在重复计算数据的时间滑动窗口。 关于滑动窗口,可以先看下《0基础学习PyFlink——个数滑动窗口(Sliding Count Windows&#x…

【热带气旋】基本介绍:定义、标准、结构等

热带气旋基本介绍 热带气旋(Tropical Cyclone, TC)1 热带气旋定义2 热带气旋标准2.1 热带低压(Tropical Depression)2.2 热带风暴(Tropical storm)2.3 强热带风暴(Severe tropical storm&#x…

2023 DevFest 开发者大会 | 精彩进行时!

DevFest 是由全球各地的谷歌开发者社区 (Google Developer Groups,GDG) 主导的,为期数月的系列 Google 技术交流活动。DevFest 为参与者提供一个与 Google 员工、GDE 谷歌开发者专家、社区 KOL、行业开发者和问题解决者面对面交流的机会。 今年&#xff…

[SUCTF 2019]EasySQL 1

题目环境: 把你的旗子给我,我会告诉你旗子是不是对的。 判断注入类型1回显结果 不是字符型SQL注入 1回显结果 数字型SQL注入 查所有数据库,采用堆叠注入1;show databases;查看所有数据表1;show tables;尝试爆Flag数据表的字段1;show columns from Flag; …

机器人仿真-gazebo学习笔记(3)URDF和机器人模型

1.URDF简介 URDF(统一机器人麦哦书格式)是ROS中的重要机器人模型描述格式,ROS提供了URDF文件的c解析器,可以解析URDF文件中使用XML格式的机器人模型。 urdf - ROS Wiki 自己查阅ros官方对URDF的介绍其实会强于大部分网上流传的文章。 1.URDF文件常用的…

电脑硬件坏了,如何维修?

在电子设备日益普及的今天,电脑已成为很多人生活和工作中不可或缺的工具,然而在使用过程中很容易遇见电脑故障之类的问题,这些问题十有八九来自硬件,那么针对电脑硬件问题,该如何维修? 一般来说&#xff0c…

深入探究Vue.js生命周期及其应用场景

当谈到Vue.js的生命周期时,我们指的是组件在创建、更新和销毁过程中发生的一系列事件。了解Vue的生命周期对于开发人员来说是至关重要的,因为它们提供了一个机会来执行特定任务,并在不同的阶段处理组件。 Vue的生命周期可以分为八个不同的阶…

项目管理-挣值管理例题-使用SV进度偏差和CV成本偏差来判断进度和成本是否合适

基础概念介绍 CV和SV的计算公式 在财务分析中,常常会用到CV和SV这两个指标。CV是成本偏差,SV是进度偏差。它们的计算公式如下: CV EV - AC SV EV - PV 其中,EV是挣值,AC是实际成本,PV是计划价值。 …

Android Studio中配置Git

安装Git 在安装Android Studio之前,需要先安装Git。可以从Git官网下载并安装Git:https://git-scm.com/downloads 在Android Studio中配置Git 在Android Studio中,依次点击“File” -> “Settings”,在弹出的窗口中选择“Ver…

软件产品如何进行跨浏览器测试?

跨浏览器测试是确保Web应用程序的功能在不同浏览器、浏览器版本和操作系统之间保持一致的过程,从而为其用户提供轻松的用户体验。跨浏览器测试涉及浏览器和操作系统的组合,以测试应用程序的响应能力和兼容性。 一、跨浏览器测试的作用   1、发现兼容性…

Postman测试金蝶云星空Webapi【协同开发云】

文章目录 Postman测试金蝶云星空Webapi【协同开发云】环境说明业务背景大致流程具体操作请求登录接口请求标准接口查看保存提交审核反审核撤销 请求自定义接口参数是字符串参数是实体类单个实体类实体类是集合 其他 Postman测试金蝶云星空Webapi【协同开发云】 环境说明 金蝶…

面向对象【this关键字】

文章目录 this关键字基本作用调用变量调用方法调用构造器this 关键字的限制 this关键字 它在方法(实例方法或非 static 的方法)内部使用,表示调用该方法的对象它在构造器内部使用,表示该构造器正在初始化的对象。 基本作用 引用…