使用拉普拉斯算子的图像锐化的python代码实现——数字图像处理

原理

拉普拉斯算子是一个二阶导数算子,用于图像处理中的边缘检测。它通过计算图像亮度的二阶空间导数来工作,能够突出显示图像中的快速变化区域,如边缘。
图像锐化的原理:
图像锐化是指增强图像中的边缘和细节,使图像看起来更清晰。
拉普拉斯算子在图像锐化中的作用是通过强调图像中的高频部分(如边缘和纹理)来实现。
锐化过程:
应用拉普拉斯算子到图像上,得到一个包含边缘和高频细节的图像。
然后,这个得到的图像会与原始图像结合。通常,这是通过将拉普拉斯算子处理后的图像加到原始图像上来实现的。这种加法操作强化了原始图像中的边缘和纹理,从而提高了图像的清晰度和对比度。

注意事项:
拉普拉斯算子对噪声非常敏感,因此在进行锐化之前,可能需要对图像进行平滑处理以降低噪声。
锐化的程度需要适中,过度锐化可能会导致图像中出现不自然的边缘和噪声。

锐化步骤

使用拉普拉斯算子进行图像锐化的原理基于图像的二阶导数,主要用于突出图像中的边缘和细节。这个过程分为几个步骤:

边缘检测:拉普拉斯算子能够检测到图像中的边缘区域,即像素强度变化明显的区域。这是因为边缘通常对应于像素值的快速变化。

计算二阶导数:拉普拉斯算子实质上是计算图像的二阶导数。二阶导数是指函数(在此处指像素强度)变化率的变化率。当二阶导数的值大时,意味着该处的像素值变化剧烈,通常对应于边缘或细节。

强调边缘:通过将拉普拉斯算子的输出(边缘信息)与原始图像结合,可以增强图像的边缘和细节。这通常通过将拉普拉斯算子的结果加到原始图像上来实现,从而提高边缘区域的对比度,使图像看起来更加锐利。

处理结果:经过拉普拉斯算子处理后的图像,其边缘和细节部分会更加明显,从而使整个图像看起来更清晰。

噪声考虑:值得注意的是,由于拉普拉斯算子对噪声较为敏感,因此在应用之前可能需要对图像进行去噪处理,以避免噪声被过度放大。
拉普拉斯算子在图像锐化中的应用强调了图像中的高频细节,如边缘和纹理,使图像看起来更加清晰和定义明确。

输出结果

使用拉普拉斯算子的图像锐化的python代码实现——数字图像处理_第1张图片

提示

使用拉普拉斯算子的图像锐化的python代码实现——数字图像处理_第2张图片

python代码实现

import cv2
import numpy as np
from matplotlib import pyplot as plt


def correl2d(img, window):
    m = window.shape[0]
    n = window.shape[1]

    # 图像边界填0扩展
    img_border = np.zeros((img.shape[0] + m - 1, img.shape[1] + n - 1))
    img_border[(m - 1) // 2:img.shape[0] + (m - 1) // 2, (n - 1) // 2:img.shape[1] + (n - 1) // 2] = img
    img_result = np.zeros(img.shape)
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            temp = img_border[i:i + m, j:j + n]
            img_result[i, j] = np.sum(np.multiply(temp, window))
    return img_result


img = cv2.imread('Fig0338.tif', 0)

img_list = [img]
# 拉普拉斯滤波器模板
window1 = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])
# 带有对角项的拉普拉斯滤波器模板
window2 = np.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]])

img_result = correl2d(img, window1)

# # 对拉普拉斯的结果做标定
img_lap = 255*(img_result-img_result.min())/(img_result.max()-img_result.min())
img_list.append(img_lap)

# 将原图加上拉普拉斯滤波的结果图得到最终的锐化结果
img_sharpened = img - img_result
img_list.append(img_sharpened)

# 对window2再执行一遍锐化操作
img_result = correl2d(img, window2)
img_sharpened = img - img_result
img_list.append(img_sharpened)

_, axs = plt.subplots(2, 2)

for i in range(2):
    for j in range(2):
        axs[i, j].imshow(img_list[i * 2 + j], vmin=0, vmax=255, cmap='gray')
        axs[i, j].axis('off')

plt.savefig('sharpen.jpg')
plt.show()

结果展示

使用拉普拉斯算子的图像锐化的python代码实现——数字图像处理_第3张图片

总结

在图像增强中,平滑是为了消除图像中噪声的干扰,或者降低对比度,与之相反,有时为了强调图像的边缘和细节,需要对图像进行锐化,提高对比度,所以图像锐化还是非常重要的,拉普拉斯锐化图像是根据图像某个像素的周围像素到此像素的突变程度有关,也就是说它的依据是图像像素的变化程度。一个函数的一阶微分描述了函数图像是朝哪里变化的,即增长或者降低;而二阶微分描述的则是图像变化的速度,急剧增长下降还是平缓的增长下降。那么据此可以猜测出依据二阶微分能够找到图像的色素的过渡程度,例如白色到黑色的过渡就是比较急剧的。或者用官方点的话说:当邻域中心像素灰度低于它所在的领域内其它像素的平均灰度时,此中心像素的灰度应被进一步降低,当邻域中心像素灰度高于它所在的邻域内其它像素的平均灰度时,此中心像素的灰度应被进一步提高,以此实现图像的锐化处理。
应用:运用拉普拉斯可以增强图像的细节,找到图像的边缘。但是有时候会把噪音也给增强了,那么可以在锐化前对图像进行平滑处理。

你可能感兴趣的:(图像处理,python,计算机视觉,人工智能,opencv,图像处理)