图像锐化、图像降噪与边缘检测代码实战:Sobel算子、Prewitt算子、Laplace算子、高斯滤波、中值滤波、高斯噪声、椒盐噪声

本文聚焦数字图像处理,探讨图像锐化、降噪与边缘检测三大关键技术。介绍了使用Python及numpy、imgaug、matplotlib等库进行实战,包括用高斯和中值滤波器降噪,基于Laplace、Sobel、Prewitt算子进行图像锐化和边缘检测,助读者提升图像处理能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🌳引言🌳

在数字图像的世界中,我们时常面临一些挑战,如图像的模糊、噪声以及细节的丢失。这些问题不仅影响了图像的美观性,还限制了其在各种实际应用中的价值。为了解决这些问题,我们深入探讨了三大关键技术:图像锐化、图像降噪与边缘检测。掌握这三大技术,就如同获得了一把开启高质量图像处理之门的神奇钥匙🔑🗝️。无论是专业摄影师📷📸、设计师📏📐,还是对图像质量有所追求的普通人👦👧,了解并掌握这些技术都将为你的工作或兴趣带来极大的提升。

在这篇文章中,我们将用简洁明了的语言,结合具体的实战代码,为你解析这三大技术的魅力所在。无论你是初学者还是资深专家,都能从中获得有价值的信息和启示。

现在,让我们踏上👣👣这次高质量图像处理的奇妙旅程。在这段旅程中,你将学习到如何锐化图像细节、掌握降噪的技巧以及精确地定位图像边缘。相信通过阅读这篇文章,你的图像处理能力将得到显著提升,让你的作品更具专业级的光彩和品质。


🌳前期回顾🌳

🍀数据增强专栏🍀

👨‍🎓👩‍🎓数据增强专栏(频繁更新🔄,收藏⭐加关注❤️,从此熟练运用各种数据增强方法~)

🍀相关博客链接🍀

链接主要内容
imgaug库图像增强指南(23):从基础到进阶——全面掌握iaa.SaltAndPepper的使用方法保姆级介绍如何使用 SaltAndPepper方法 为图像添加椒盐噪声
imgaug库图像增强指南(24):iaa.CoarseSaltAndPepper——粗粒度椒盐噪声的魔力(万字长文)保姆级介绍如何使用 CoarseSaltAndPepper方法 为图像添加粗粒度的椒盐噪声图像块
imgaug库图像增强指南(25):从基础到进阶——全面掌握iaa.Salt的使用方法保姆级介绍如何使用 Salt方法 为图像添加盐噪声
imgaug库图像增强指南(26):从基础到进阶——全面掌握iaa.CoarseSalt的使用方法保姆级介绍如何使用 CoarseSalt方法 为图像添加粗粒度的盐噪声图像块
imgaug库图像增强指南(27):从基础到进阶——全面掌握iaa.Pepper的使用方法保姆级介绍如何使用 Pepper方法 为图像添加胡椒噪声
imgaug库图像增强指南(28):从基础到进阶——全面掌握iaa.CoarsePepper的使用方法保姆级介绍如何使用CoarsePepper方法为图像添加粗粒度的胡椒噪声图像块
imgaug库图像增强指南(29):iaa.Invert——RGB图像的颜色反转与细节探索保姆级介绍如何使用Invert方法实现图像的颜色反转
imgaug库图像增强指南(31):iaa.JpegCompression——探索压缩与质量的微妙平衡保姆级介绍如何使用JpegCompression方法压缩图像

💪💪在本博客中,我们将向您详细介绍如何实现图像锐化、图像降噪、边缘检测。


🌳图像降噪、图像锐化和边缘检测的区别🌳

技术功能实际应用场景预期结果与副作用
图像降噪减少或消除图像中的噪声,使图像更清晰医学影像、卫星图像、高分辨率遥感图像等预期结果通常是清晰的图像,但可能牺牲了一些细节,如颜色保真度。不同的降噪算法对细节的保留程度不同。
图像锐化增强图像中的边缘和细节,使图像看起来更加鲜明和细致广告、摄影、增强现实等预期结果增强了细节和边缘,但可能导致过度增强,甚至出现失真,如颜色失真或细节伪影。不同锐化算法的效果有所不同。
边缘检测识别和定位图像中的边缘或轮廓计算机视觉、自动驾驶、机器人视觉等如果权重矩阵选择得当,可以准确地检测到边缘或轮廓,但可能牺牲了一些细节或引入新的伪边缘。不同边缘检测算法的性能有所差异。

🌳代码实战🌳

🍀安装依赖库:numpy、imgaug、matplotlib🍀

pip install numpy==1.25.0
pip install matplotlib==3.7.1
pip install imgaug==0.4.0

🍀图像降噪实战1:利用高斯滤波器处理高斯噪声图像🍀

import cv2
import imgaug.augmenters as iaa
import matplotlib.pyplot as plt
import numpy as np

# 读取图像
img_path = r"D:\python_project\lena.png"
img = cv2.imread(img_path)
image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)


# 创建高斯滤波器
gaussian_filter = iaa.GaussianBlur(sigma=(3, 3))

# 创建高斯噪声生成器
noise_generator = iaa.AdditiveGaussianNoise(loc=0, scale=12, per_channel=False)


# 对原始图像添加高斯噪声
noisy_image = noise_generator(image=image)

# 对噪声图像进行图像降噪
denoised_image = gaussian_filter(image=noisy_image)



# 图像可视化
fig, axes = plt.subplots(1, 3, figsize=(10, 4))
axes[0].imshow(image)
axes[0].set_title("Original Image")
axes[1].imshow(noisy_image)
axes[1].set_title("Noisy image")
axes[2].imshow(denoised_image)
axes[2].set_title("Denoised image")
plt.show()

运行结果如下:

图1 原图、噪声图像、去噪图像可视化


🍀图像降噪实战2:利用中值滤波器处理椒盐噪声图像🍀

import cv2
import imgaug.augmenters as iaa
import matplotlib.pyplot as plt
import numpy as np

# 读取图像
img_path = r"D:\python_project\lena.png"
img = cv2.imread(img_path)
image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)


# 创建中值滤波器
median_filter = iaa.MedianBlur(k=3)

# 创建椒盐噪声生成器
noise_generator = iaa.SaltAndPepper(p=0.2, per_channel=False, seed=0)


# 对原始图像添加椒盐噪声
noisy_image = noise_generator(image=image)

# 对噪声图像进行图像降噪
denoised_image = median_filter(image=noisy_image)



# 图像可视化
fig, axes = plt.subplots(1, 3, figsize=(10, 4))
axes[0].imshow(image)
axes[0].set_title("Original Image")
axes[1].imshow(noisy_image)
axes[1].set_title("Noisy image")
axes[2].imshow(denoised_image)
axes[2].set_title("Denoised image")
plt.show()

运行结果如下:

图2 原图、噪声图像、去噪图像可视化

  • 在实战中,我们采用iaa.MedianBlur方法创建中值滤波器(iaa.MedianBlur方法的详细介绍),采用iaa.SaltAndPepper方法创建椒盐噪声生成器(iaa.SaltAndPepper方法的详细介绍)。

  • 在图2中,我们对原图、噪声图像和去噪图像进行可视化。可以看出,中值滤波器非常适合处理含有椒盐噪声的图像,去噪效果非常明显。


🍀图像锐化实战1:基于Laplace算子进行图像锐化🍀

import cv2
import imgaug.augmenters as iaa
import matplotlib.pyplot as plt
import numpy as np

# 读取图像
img_path = r"D:\python_project\lena.png"
img = cv2.imread(img_path)
image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)



# 定义锐化卷积核
kernel1 = np.array([[0, -1, 0],
                    [-1, 5, -1],
                    [0, -1, 0]])

kernel2 = np.array([[-1, -1, -1],
                    [-1, 9, -1],
                    [-1, -1, -1]])

# 创建图像锐化器
image_sharpening1 = iaa.Convolve(matrix=kernel1)
image_sharpening2 = iaa.Convolve(matrix=kernel2)


# 对原始图像进行图像锐化
sharpened_image1 = image_sharpening1(image=image)
sharpened_image2 = image_sharpening2(image=image)



# 图像可视化
fig, axes = plt.subplots(1, 3, figsize=(10, 4))
axes[0].imshow(image)
axes[0].set_title("Original Image")
axes[1].imshow(sharpened_image1)
axes[1].set_title("Sharpened image1")
axes[2].imshow(sharpened_image2)
axes[2].set_title("Sharpened image2")
plt.show()

运行结果如下:

图3 原图、锐化图像1、锐化图像2

  • 在实战中,我们基于iaa.Convolve方法创建图像锐化工具(iaa.Convolve方法的详细介绍)。
  • 在代码中,我们采用了两种不同的拉普拉斯算子实现图像锐化操作。从图3的运行结果来看,当算子为np.array([[-1, -1, -1], [-1, 9, -1], [-1, -1, -1]])时,锐化图像2的细节及边缘更突出。

🍀图像锐化实战2:基于Sobel算子进行图像锐化🍀

import cv2
import imgaug.augmenters as iaa
import matplotlib.pyplot as plt
import numpy as np

# 读取图像
img_path = r"D:\python_project\lena.png"
img = cv2.imread(img_path)
image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)



# 定义锐化卷积核
kernel1 = np.array([[-1, -2, -1],
                    [0, 1, 0],
                    [1, 2, 1]])

kernel2 = np.array([[-1, 0, 1],
                    [-2, 1, 2],
                    [-1, 0, 1]])

# 创建图像锐化器
image_sharpening1 = iaa.Convolve(matrix=kernel1)
image_sharpening2 = iaa.Convolve(matrix=kernel2)


# 对原始图像进行图像锐化
sharpened_image1 = image_sharpening1(image=image)
sharpened_image2 = image_sharpening2(image=image)



# 图像可视化
fig, axes = plt.subplots(1, 3, figsize=(10, 4))
axes[0].imshow(image)
axes[0].set_title("Original Image")
axes[1].imshow(sharpened_image1)
axes[1].set_title("Sharpened image1")
axes[2].imshow(sharpened_image2)
axes[2].set_title("Sharpened image2")
plt.show()

运行结果如下:

图4 原图、锐化图像1、锐化图像2

  • 在实战中,我们基于iaa.Convolve方法创建图像锐化工具(iaa.Convolve方法的详细介绍)。
  • 在代码中,我们采用了两种不同的Sobel算子实现图像锐化操作。从图4的运行结果来看:
    • 当算子为np.array([[-1, -2, -1], [0, 1, 0], [1, 2, 1]])时,锐化图像1在水平方向上的边缘及细节更突出。
    • 当算子为np.array([[-1, 0, 1], [-2, 1, 2], [-1, 0, 1]])时,锐化图像2在垂直方向上的边缘及细节更突出。

🍀图像锐化实战3:基于Prewitt算子进行图像锐化🍀

import cv2
import imgaug.augmenters as iaa
import matplotlib.pyplot as plt
import numpy as np

# 读取图像
img_path = r"D:\python_project\lena.png"
img = cv2.imread(img_path)
image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)



# 定义锐化卷积核
kernel1 = np.array([[-1, -1, -1],
                    [0, 1, 0],
                    [1, 1, 1]])

kernel2 = np.array([[-1, 0, 1],
                    [-1, 1, 1],
                    [-1, 0, 1]])

# 创建图像锐化器
image_sharpening1 = iaa.Convolve(matrix=kernel1)
image_sharpening2 = iaa.Convolve(matrix=kernel2)


# 对原始图像进行图像锐化
sharpened_image1 = image_sharpening1(image=image)
sharpened_image2 = image_sharpening2(image=image)



# 图像可视化
fig, axes = plt.subplots(1, 3, figsize=(10, 4))
axes[0].imshow(image)
axes[0].set_title("Original Image")
axes[1].imshow(sharpened_image1)
axes[1].set_title("Sharpened image1")
axes[2].imshow(sharpened_image2)
axes[2].set_title("Sharpened image2")
plt.show()

运行结果如下:

图5 原图、锐化图像1、锐化图像2

  • 在实战中,我们基于iaa.Convolve方法创建图像锐化工具(iaa.Convolve方法的详细介绍)。
  • 在代码中,我们采用了两种不同的Prewitt算子实现图像锐化操作。从图5的运行结果来看:
    • 当算子为np.array([[-1, -1, -1], [0, 1, 0], [1, 1, 1]])时,锐化图像1在水平方向上的边缘及细节更突出。
    • 当算子为np.array([[-1, 0, 1], [-1, 1, 1], [-1, 0, 1]])时,锐化图像2在垂直方向上的边缘及细节更突出。

🍀边缘检测实战1:基于Laplace算子进行边缘检测🍀

import cv2
import imgaug.augmenters as iaa
import matplotlib.pyplot as plt
import numpy as np

# 读取图像
img_path = r"D:\python_project\lena.png"
img = cv2.imread(img_path)
image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)



# 定义边缘检测卷积核
kernel1 = np.array([[0, -1, 0],
                    [-1, 4, -1],
                    [0, -1, 0]])

kernel2 = np.array([[-1, -1, -1],
                    [-1, 8, -1],
                    [-1, -1, -1]])


# 创建边缘检测工具
edge_detection1 = iaa.Convolve(matrix=kernel1)
edge_detection2 = iaa.Convolve(matrix=kernel2)


# 对原始图像进行边缘检测
edge_detection_image1 = edge_detection1(image=image)
edge_detection_image2 = edge_detection2(image=image)


# 图像可视化
fig, axes = plt.subplots(1, 3, figsize=(10, 4))
axes[0].imshow(image)
axes[0].set_title("Original Image")
axes[1].imshow(edge_detection_image1)
axes[1].set_title("Edge detection image1")
axes[2].imshow(edge_detection_image2)
axes[2].set_title("Edge detection image2")
plt.show()

运行结果如下:

图6 原图、边缘检测图像1、边缘检测图像2

  • 在实战中,我们基于iaa.Convolve方法创建边缘检测工具(iaa.Convolve方法的详细介绍)。
  • 在代码中,我们采用了两种不同的Laplace算子实现边缘检测操作。从图6的运行结果来看:
    • 当算子为np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]])时,边缘检测图像2边缘细节更突出。

🍀边缘检测实战2:基于Sobel算子进行边缘检测🍀

import cv2
import imgaug.augmenters as iaa
import matplotlib.pyplot as plt
import numpy as np

# 读取图像
img_path = r"D:\python_project\lena.png"
img = cv2.imread(img_path)
image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)



# 定义边缘检测卷积核
kernel1 = np.array([[-1, -2, -1],
                    [0, 0, 0],
                    [1, 2, 1]])

kernel2 = np.array([[-1, 0, 1],
                    [-2, 0, 2],
                    [-1, 0, 1]])


# 创建边缘检测工具
edge_detection1 = iaa.Convolve(matrix=kernel1)
edge_detection2 = iaa.Convolve(matrix=kernel2)


# 对原始图像进行边缘检测
edge_detection_image1 = edge_detection1(image=image)
edge_detection_image2 = edge_detection2(image=image)


# 图像可视化
fig, axes = plt.subplots(1, 3, figsize=(10, 4))
axes[0].imshow(image)
axes[0].set_title("Original Image")
axes[1].imshow(edge_detection_image1)
axes[1].set_title("Edge detection image1")
axes[2].imshow(edge_detection_image2)
axes[2].set_title("Edge detection image2")
plt.show()

运行结果如下:

图6 原图、边缘检测图像1、边缘检测图像2

  • 在实战中,我们基于iaa.Convolve方法创建边缘检测工具(iaa.Convolve方法的详细介绍)。
  • 在代码中,我们采用了两种不同的Laplace算子实现边缘检测操作。从图6的运行结果来看:
    • 当算子为np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])时,边缘检测图像1在水平方向上的边缘及细节更突出。
    • 当算子为np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])时,边缘检测图像2在垂直方向上的边缘及细节更突出。

🍀边缘检测实战3:基于Prewitt算子进行边缘检测🍀

import cv2
import imgaug.augmenters as iaa
import matplotlib.pyplot as plt
import numpy as np

# 读取图像
img_path = r"D:\python_project\lena.png"
img = cv2.imread(img_path)
image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)



# 定义边缘检测卷积核
kernel1 = np.array([[-1, -1, -1],
                    [0, 0, 0],
                    [1, 1, 1]])

kernel2 = np.array([[-1, 0, 1],
                    [-1, 0, 1],
                    [-1, 0, 1]])

# 创建边缘检测工具
edge_detection1 = iaa.Convolve(matrix=kernel1)
edge_detection2 = iaa.Convolve(matrix=kernel2)


# 对原始图像进行边缘检测
edge_detection_image1 = edge_detection1(image=image)
edge_detection_image2 = edge_detection2(image=image)


# 图像可视化
fig, axes = plt.subplots(1, 3, figsize=(10, 4))
axes[0].imshow(image)
axes[0].set_title("Original Image")
axes[1].imshow(edge_detection_image1)
axes[1].set_title("Edge detection image1")
axes[2].imshow(edge_detection_image2)
axes[2].set_title("Edge detection image2")
plt.show()

运行结果如下:

图8 原图、边缘检测图像1、边缘检测图像2

  • 在实战中,我们基于iaa.Convolve方法创建边缘检测工具(iaa.Convolve方法的详细介绍)。
  • 在代码中,我们采用了两种不同的Prewitt算子实现边缘检测操作。从图8的运行结果来看:
    • 当算子为np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]])时,边缘检测图像1在水平方向上的边缘及细节更突出。
    • 当算子为np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]])时,边缘检测图像2在垂直方向上的边缘及细节更突出。

🌳结尾🌳

亲爱的读者,首先感谢抽出宝贵的时间来阅读我们的博客。我们真诚地欢迎您留下评论和意见💬
俗话说,当局者迷,旁观者清。的客观视角对于我们发现博文的不足、提升内容质量起着不可替代的作用。
如果博文给您带来了些许帮助,那么,希望能为我们点个免费的赞👍👍/收藏👇👇您的支持和鼓励👏👏是我们持续创作✍️✍️的动力
请放心,我们会持续努力创作✍️✍️,并不断优化博文质量👨‍💻👨‍💻,只为给带来更佳的阅读体验。
愿我们共同成长🌱🌳,共享智慧的果实🍎🍏!


万分感谢🙏🙏点赞👍👍、收藏⭐🌟、评论💬🗯️、关注❤️💚~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高斯小哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值