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

Python实现多种图像锐化方法:拉普拉斯算子和Sobel算子

Python实现多种图像锐化方法:拉普拉斯算子和Sobel算子

图像和视频逐渐成为人们生活中信息获取的重要来源,而图像和视频在传输过程中有很多因素可能造成图像模糊,比如不正确的聚焦会产生离焦模糊,景物和照相机的相对运动会造成运动模糊,图像压缩造成的高频成分丢失模糊。

模糊降低了图像的清晰度,严重影响了图像质量,导致图像分析、处理变得困难,因此必须使用有效的图像锐化方法来提高图像清晰度。

本文首先介绍了两种图像锐化方法:拉普拉斯算法和Sobel算法。

然后针对灰度图像进行了高斯模糊处理,并采用了上述算法来进行图像锐化。

图像锐化

图像模糊降低了图像的清晰度,严重影响图像质量,导致图像分析、处理变得异常困难,因此必须要使用有效的去除图像模糊方法来提高图像清晰度,从而提高系统的整体性能。

去除图像模糊算法又称为图像锐化,是指补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰。目前有很多的图像锐化方法,如梯度法、Sobel算子、拉普拉斯算子、高通滤波等。本文主要介绍拉普拉斯算子和Sobel算子

拉普拉斯算子

拉普拉斯是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。

因此可以选择拉普拉斯算子对原图像进行锐化处理:先产生描述灰度突变的图像,再将拉普拉斯图像与原始图像叠加从而产生锐化图像!

在这里插入图片描述

Sobel算子

Sobel算子是一阶微分的边缘检测算子,它是将原图像中某个像素的值,作为它本身灰度值和其相邻像素灰度值进行运算的函数。它实际上是一种模板匹配算法,模板中有一个锚点,通常是矩阵中心点,和原图像中待计算点对应;整个模板对应的区域,就是原图像中像素点的相邻区域,模板运算目的是让图像变好。

在这里插入图片描述

Python代码实现拉普拉斯算子和Sobel算子

# @description:
# @author:Jianping Zhou
# @email:jianpingzhou0927@gmail.com
# @Time:2022/11/29 9:30
import cv2
import numpy as np
from skimage import io# 导入图片
raw_img = cv2.imread("../BMP_images/lena512.BMP")
cv2.imshow('raw_image', raw_img)# 转换灰度
# gimg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gimg = raw_img# 高斯模糊化
# dst = cv2.GaussianBlur(img,ksize=(5,5),sigmaX=0,sigmaY=0)
# 创建毛玻璃特效
# 参数2:高斯核的宽和高(建议是奇数)
# 参数3:x和y轴的标准差
img = cv2.GaussianBlur(gimg, (11, 11), 0)
cv2.imshow('GaussianBlur_image', img)
io.imsave('./results/GaussianBlur_image.png', img)# 拉普拉斯算子锐化
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)  # 定义拉普拉斯算子
dst = cv2.filter2D(img, -1, kernel=kernel)  # 调用opencv图像锐化函数# sobel算子锐化
# 对x方向梯度进行sobel边缘提取
x = cv2.Sobel(gimg, cv2.CV_64F, 1, 0)
# 对y方向梯度进行sobel边缘提取
y = cv2.Sobel(gimg, cv2.CV_64F, 0, 1)
# 对x方向转回uint8
absX = cv2.convertScaleAbs(x)
# 对y方向转会uint8
absY = cv2.convertScaleAbs(y)
# x,y方向合成边缘检测结果
dst1 = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
# 与原图像堆叠
res = dst1 + gimg# 测试
# print("dstshape:",dst1)
# print("resshape:",res)# 按要求左右显示原图与拉普拉斯处理结果
# result1 = np.hstack([raw_img, img, dst])
result1 = dst
cv2.imshow('lapres', result1)
io.imsave('./results/lapres.png', result1)# 按要求左右显示原图与sobel处理结果
# result2 = np.hstack([raw_img, img, res])
result2 = res
cv2.imshow('sobelres', result2)
io.imsave('./results/sobelres.png', result2)# 去缓存
cv2.waitKey(0)
cv2.destroyAllWindows()

更多详细代码发布在https://github.com/JeremyChou28/digital_image_processing/tree/main/project3

相关文章:

  • WPF-一个简单登录界面
  • 跨境电商如何利用跨境客服软件提升销售额
  • 使用FiscoBcos的Go-SDK【1:配置go环境】
  • hive数据仓库工具
  • 华为数通---配置基本QinQ示例
  • 物联网在能源管理中的应用——青创智通工业物联网解决方案
  • js 原型 和 原型链
  • 【ProcessOn】流程图咏道图Axure自定义元件使用----含流程图案例
  • 【delphi11】delphi基础探索【二、 Delphi 的基本语法:变量声明、数据类型、控制语句】
  • 深入解析Freemarker模板引擎及其在Spring Boot中的高级整合
  • 鸿蒙开发之页面与组件生命周期
  • Unity_ET框架项目-斗地主_启动运行流程
  • 大数据技术8:StarRocks极速全场景MPP数据库
  • Bootstrap Blazor中的富文本编辑器(Editor)如何禁用?
  • 【Java系列】详解多线程(二)——Thread类及常见方法(上篇)
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • AHK 中 = 和 == 等比较运算符的用法
  • Consul Config 使用Git做版本控制的实现
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • exif信息对照
  • JavaScript创建对象的四种方式
  • nodejs调试方法
  • PHP 小技巧
  • Quartz初级教程
  • React 快速上手 - 07 前端路由 react-router
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 从setTimeout-setInterval看JS线程
  • 精彩代码 vue.js
  • 前端面试总结(at, md)
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #if #elif #endif
  • #传输# #传输数据判断#
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (SpringBoot)第二章:Spring创建和使用
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (算法)求1到1亿间的质数或素数
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET 材料检测系统崩溃分析
  • .net 调用php,php 调用.net com组件 --
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .so文件(linux系统)
  • @Mapper作用
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [C#] 如何调用Python脚本程序
  • [C++进阶篇]STL中vector的使用
  • [codevs 1515]跳 【解题报告】