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

基于非锐化掩码锐化图像

    • 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 pltdef 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 cv2def 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.mzph.cn/news/125930.shtml

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

相关文章

Android数据对象序列化原理与应用

序列化与反序列化 序列化是将对象转换为可以存储或传输的格式的过程。在计算机科学中,对象通常是指内存中的数据结构,如数组、列表、字典等。通过序列化,可以将这些对象转换为字节流或文本格式,以便在不同的系统之间进行传输或存…

docker中安装rabbitMq并配置启动

目录 1. 拉取镜像并安装(此处实例安装的是最新版)2.查看docker中已安装的镜像和版本3.启动RabbitMq4.配置管理端5.安装完成 1. 拉取镜像并安装(此处实例安装的是最新版) docker pull rabbitmq2.查看docker中已安装的镜像和版本 …

uni-app微信小程序打开第三方地图

需求 小程序中有个按钮点击以后会调用手机中第三方地图进行导航。参数 位置信息 经度 与纬度。 实现方法 uni.openLocation({latitude: Number(地址纬度),longitude: Number(地址经度),name: 地址名称,address: 地址详情,success: function (res) {console.log(打开系统位置地…

FPGA与ASIC有什么差异?二者该如何选用?

前言 对于一个数字电路的新手来说,这可能是会经常遇到的一个问题:FPGA和ASIC之间的区别是什么? 接下来本文将尝试讲解 “什么是FPGA?” 和 “什么是ASIC?”,然后讲述一些关于FPGA和ASIC的问题,例如它们之间…

【嵌入式】【GIT】如何迁移老的GIF到新的仓库时使用LFS功能并保持LOG不变

一、正常迁移流程 假设有仓库 ssh://old/buildroot-201902 需要迁移到新的仓库 ssh://old/buildroot-201902时,我们可以使用以下命令来完成: # 下载老的仓库 git clone ssh://old/buildroot-201902 # 向新的仓库上传所有的tags git push ssh://new/buildroot-201902 --tag…

Centos7下生成https自签名证书

1、安装openssl yum install openssl2、生成带密码的私有秘钥文件 openssl genrsa -des3 -out server.key 2048使用带密码的私有秘钥文件时需要输入密码,这里直接输入:123456 3、生成不带密码的私有秘钥文件 openssl rsa -in server.key -out serve…

vscode debug skills

1) VSCode 调试 C/C 代码时,如何显示动态分配的指针数组。 创建一个动态分配的一维数组: int n 10; int *array (int *)malloc(n*sizeof(int)); memset(array, 1, n*sizeof(int)); 如果直接 Debug 时查看 array 指针,并不能看到数组所有的值。 查看…

约会杭州云栖2023:为了无法计算的价值一起努力

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…

阿里云CTO周靖人:打造一朵AI时代最开放的云

10月31日,在2023云栖大会上,阿里云CTO周靖人表示,面向智能时代,阿里云将通过从底层算力到AI平台再到模型服务的全栈技术创新,升级云计算体系,打造一朵AI时代最开放的云。在现场,周靖人公布了云计…

1. PPT高效初始化设置

1. PPT高效初始化设置 软件安装:Office 2019 主题和颜色 颜色可以在白天与黑夜切换,护眼 切换成了黑色 撤回次数 撤回次数太少,只有20次怎么办 自动保存 有时忘记保存就突然关闭,很需要一个自动保存功能 图片压缩 图…

信息系统项目管理师教程 第四版【第10章-项目进度管理-思维导图】

信息系统项目管理师教程 第四版【第10章-项目进度管理-思维导图】 课本里章节里所有蓝色字体的思维导图

CentOS、linux安装squid搭建正向代理,window11配置正向代理

1.CentOS安装配置squid 1.1.安装 yum install -y squid1.2.修改配置文件 在配置文件添加以下2行代码 acl localnet src 0.0.0.0/0.0.0.0 # add by lishuoboy http_access allow all # add by lishuoboy1.3.启动squid systemctl restart squid2.win11…

golang的类型断言

前言:原因很简单,写的代码panic了。报错如下。为此专门看下golang的类型断言。 “[PANIC]interface conversion: interface {} is string, not float64”。 1、类型断言(assertion) 所谓“类型断言”即判断一个变量是不是某个类型的实例(简单来讲就是判…

【教程】R语言生物群落(生态)数据统计分析与绘图

查看原文>>>R语言生物群落(生态)数据统计分析与绘图实践 暨融合《R语言基础》、《tidyverse数据清洗》、《多元统计分析》、《随机森林模型》、《回归及混合效应模型》、《结构方程模型》、《统计结果作图》七合一版本方案 R 语言作的开源、自…

Oracle Exadata X7-2掉电宕机导致集群无法启动处理过程

文章目录 前言一、当前的状态是什么?二、集群启动异常怀疑对象1.排查心跳网络异常ping自己私有IP延迟高ping其它主机私有IP不通 2.是否发生过重启 三、日志信息收集ocssd.trc集群crs日志cell的griddisk状态及报错 四、IB交换机的问题排查处理五、紧急恢复业务在IB完…

算法模板之栈图文详解

🌈个人主页:聆风吟 🔥系列专栏:数据结构、算法模板、汇编语言 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. ⛳️模拟栈1.1 🔔用数组模拟实现栈1.1.1 👻栈…

数据分析和互联网医院小程序:提高医疗决策的准确性和效率

互联网医院小程序已经在医疗领域取得了显著的进展,为患者和医疗从业者提供了更便捷和高效的医疗服务。随着数据分析技术的快速发展,互联网医院小程序能够利用大数据来提高医疗决策的准确性和效率。本文将探讨数据分析在互联网医院小程序中的应用&#xf…

钡铼技术ARM工控机在机器人控制领域的应用

ARM工控机是一种基于ARM架构的工业控制计算机,用于在工业自动化领域中进行数据采集、监控、控制和通信等应用。ARM(Advanced RISC Machine)架构是一种低功耗、高性能的处理器架构,广泛应用于移动设备、嵌入式系统和物联网等领域。…

Redis的特性和应用场景

目录 Redis的特性 内存存储数据 可编程性 可扩展性 持久化 水平扩展性 高可用性 为什么redis是快的 Redis的应用场景 数据库 缓存和会话存储 消息队列 redis是一个客户端服务器结构的程序 Redis是一个在内存中存储数据的中间件,能够用于作为数据库,数据缓存等,能在…

Centos7环境下cmake3.25的编译与安装

文章目录 0 视频传送门1 卸载当前版本2 下载cmake3.25.0并且解压缩3 使用root用户进入解压缩的目录4 开始执行命令5 创建软连接6 检查版本 0 视频传送门 https://www.bilibili.com/video/BV1Gu4y1J7Ev/?vd_source3353f83539e46042d8cf76efb177a8e4 07-Centos7编译安装cmake3.…