三、空域滤波
3.4 图像平滑
在图像数据处理13中已经对图像平滑进行了简单的介绍,图像平滑可以近似理解成图像模糊操作,通过图像平滑操作可以保留图像的低频成分,抑制高频成分,从而减少噪声的干扰。
滤波器尺寸对平滑效果的影响
尺寸增大,平滑效果增强:因为滤波器的尺寸越大,其覆盖的图像区域就越广,从而在平滑处理时能够更有效地消除图像中的高频成分,使得图像的平滑效果更加明显。
尺寸减小,平滑效果减弱:尺寸较小的滤波器在平滑处理时对图像的影响范围较小,因此平滑效果相对较弱,能够保留更多的图像细节。
3.4.1算术均值滤波器
均值滤波器的主要原理是将图像中窗口中心的像素值用该点邻域内各点值和的平均数来替换。
3.4.2高斯低通滤波器
原理:
首先,高斯滤波器将原图像通过傅里叶变换转换到频率域,在频率域中,图像的低频部分对应图像的平滑区域,高频部分则对应图像的边缘和细节。高斯低通滤波器通过设计一个传递函数,该函数在低频区域接近1,在高频区域迅速衰减至0,从而实现平滑滤波的效果。最后再将滤波后的图像通过傅里叶反变换转换回空间域。
特点:
高斯低通滤波器具有权重随距离衰减的特点,距离滤波器中心越近的像素,所拥有的权重越大,越远则权重越小。
3.4.3常见的图像平滑滤波函数
①OpenCV提供的图像平滑滤波函数
均值滤波:
cv2.blur、
高斯滤波:cv2.GaussianBlur、
中值滤波:cv2.medianBlur、
双边滤波:cv2.bilateralFilter
②SciPy提供的图像平滑滤波函数
通过
scipy.ndimage
模块提供了一些基本的图像处理功能
Scikit-image提供的图像平滑滤波函数
高斯滤波:
skimage.filters.gaussian、
中值滤波:skimage.filters.median
3.4.4对图像兴趣区域(ROI)进行平滑模糊
该操作的主要应用是马赛克处理,可以对指定区域进行模糊处理。
3.5 图像锐化
在图像数据处理13中也对图像锐化进行了简单的介绍,即保留图像的高频成分,抑制低频成分,从而使图像的边缘细节更加清晰可加。
图像锐化的本质是可以理解成通过计算图像梯度并增强梯度值较大的区域来实现图像边缘和细节的增强。
拉普拉斯算子是一种二阶微分算子,常用于图像处理中进行边缘检测和图像锐化。在图像锐化的上下文中,拉普拉斯算子可以突出图像中的高频部分,即边缘或细节信息,从而使图像看起来更加清晰。
3.5.1拉普拉斯算子进行图像锐化
拉普拉斯算子是一种二阶微分算子,它通过计算图像中每个像素点的二阶导数来有效地检测边缘。在数字图像处理中,这一操作通常是通过应用拉普拉斯滤波器来实现的。该滤波器会综合考虑当前像素及其邻域像素的值,随后计算出一个新的像素值,这个新的像素值能够反映当前像素处的灰度变化程度。最后,将计算出的二阶导数值与原始图像进行相加,从而增强图像的边缘和细节,实现图像锐化。
import cv2
import numpy as np
# 读取图像
image = cv2.imread('slpn.jpg', cv2.IMREAD_GRAYSCALE)
# 定义拉普拉斯滤波器
laplacian_kernel = np.array([[0, 1, 0],
[1, -4, 1],
[0, 1, 0]])
# 应用拉普拉斯滤波器进行锐化
laplacian_image = cv2.filter2D(image, -1, laplacian_kernel)
sharpened_image = cv2.add(image, laplacian_image)
# 对单个图像进行缩放
scale_percent = 50 # 百分比缩放
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)
resized_image = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
resized_laplacian_image = cv2.resize(laplacian_image, dim, interpolation=cv2.INTER_AREA)
resized_sharpened_image = cv2.resize(sharpened_image, dim, interpolation=cv2.INTER_AREA)
# 水平拼接图像
concatenated_image = np.hstack((resized_image, resized_laplacian_image, resized_sharpened_image))
# 设置窗口大小
cv2.namedWindow('Resized Combined Image', cv2.WINDOW_NORMAL)
# 展示缩小后的图像
cv2.imshow('Resized Combined Image', concatenated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 应用拉普拉斯滤波器进行锐化
laplacian_image = cv2.filter2D(image, -1, laplacian_kernel)这行代码使用
cv2.filter2D
函数对原始图像image
应用了一个拉普拉斯滤波器。
①image
:输入的原始图像②-1
表示输出图像与输入图像具有相同的深度。③laplacian_kernel
:拉普拉斯滤波器核,用于定义滤波器如何应用于图像。
sharpened_image = cv2.add(image, laplacian_image)
这行代码将原始图像
image
与经过拉普拉斯滤波后的图像laplacian_image
相加,从而得到锐化后的图像sharpened_image
。因为拉普拉斯滤波器增强了图像的高频部分,所以将其与原始图像相加后就能够突出图像的边缘和细节,实现图像锐利。
原图 拉普拉斯变换图像 锐化图像
3.5.2钝化掩膜图像锐化
原理
图像锐化本质上是通过微分运算来实现的(本质上应该还是一种梯度算法),它旨在增强图像的灰度跳变部分,即边缘区域。钝化掩膜图像锐化则是通过从原始图像中减去一幅经过平滑处理的图像(钝化图像)来创建一个掩膜模板,然后将该模板与原始图像加权相加,从而实现锐化效果。
步骤
①平滑处理:对原始图像进行平滑处理,使用平滑滤波器来去除图像中的噪声和细节,得到一幅平滑图像。
②创建掩膜模板:从原始图像中减去平滑处理后的图像,得到一幅差异图像,即掩膜模板。这个模板包含了原始图像与平滑图像之间的差异,主要反映了边缘和高频分量的信息。
③加权相加:将原始图像与掩膜模板加权相加,得到锐化后的图像。加权的系数(k值)决定了锐化的强度。当k=1时,实现的是标准的钝化掩膜锐化;当k>1时,实现的是高提升滤波,锐化效果更强;而当k<1时,锐化效果会减弱。
公式如下:
g(x,y) = f(x,y) + k * g_{mask}(x,y)
其中f(x,y)
表示原始图像,g_{mask}(x,y)
表示掩膜模板,g(x,y)
表示锐化后的图像,k为加权系数。
import cv2
import numpy as np
# 读取图像
image_path = 'slpn.jpg'
original_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) # 以灰度模式读取图像
# 检查图像是否成功读取
if original_image is None:
print("Error: Image could not be read.")
exit()
# 处理图像(缩小一半,如果原图很大可以这么做)
resized_original_image = cv2.resize(original_image, (0, 0), fx=0.5, fy=0.5)
# 钝化掩膜图像锐化
# ①平滑处理
blurred_image = cv2.GaussianBlur(resized_original_image, (5, 5), 0)
# ②创建掩膜模板
mask = resized_original_image - blurred_image
# ③加权相加
k = 1 # 加权系数,可以调整锐化的强度
sharpened_image = resized_original_image + k * mask
# 展示原图和处理后的图像
cv2.imshow('Original Image', resized_original_image)
cv2.imshow('Sharpened Image', sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
注,本人为在校学生,博客是边学边写的,主要是为了巩固知识,如有错误请积极指正。
“本文章中所使用的圣灵谱尼图片来源于网络,版权归属原作者所有。若您认为本文章/作品的使用侵犯了您的权益,请及时与我联系,我将尽快核实并删除相关内容。