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

最近更新

  1. TCP协议是安全的吗?

    2023-12-14 07:16:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-14 07:16:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-14 07:16:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-14 07:16:03       18 阅读

热门阅读

  1. 【Python爬虫】Python爬虫入门教程&注意事项

    2023-12-14 07:16:03       41 阅读
  2. Ceph入门到精通-ceph二次开发开源协议考虑

    2023-12-14 07:16:03       36 阅读
  3. Android 12.0 默认相机视频画质1080p

    2023-12-14 07:16:03       35 阅读
  4. Mysql - 引擎介绍

    2023-12-14 07:16:03       32 阅读
  5. html.parser --- 简单的 HTML 和 XHTML 解析器

    2023-12-14 07:16:03       39 阅读
  6. C#面试题

    2023-12-14 07:16:03       36 阅读
  7. 0x71 C++ STL

    2023-12-14 07:16:03       28 阅读