在这段代码中,我们同样先对图像进行傅里叶变换和频谱中心化。然后构建了一个半径为 30 的圆形高通滤波器,将滤波器与频域图像相乘,实现高通滤波。最后通过逆傅里叶变换得到高通滤波后的图像。
在这里插入图片描述
从结果可以看到,高通滤波后的图像边缘和细节更加突出,图像变得更加锐利,但同时图像的平滑区域也受到了一定影响,出现了一些噪声增强的现象,这是因为低频成分被去除,而低频成分在一定程度上起到了平滑图像的作用 。

五、应用拓展与实践

5.1 图像去噪

在图像采集和传输过程中,噪声的干扰是一个常见的问题,它会降低图像的质量,影响后续的分析和处理。频域分析为图像去噪提供了一种有效的解决方案。

噪声在图像中通常表现为高频成分,这是因为噪声的变化较为剧烈,反映在频域上就是高频信号。而图像中的有用信息,如物体的轮廓、大面积的平滑区域等,主要由低频成分组成。基于这个特性,我们可以利用低通滤波器在频域中去除高频噪声,保留低频的有用信息。

高斯噪声为例,它是一种常见的噪声类型,其概率密度函数服从高斯分布。在实际的图像中,高斯噪声可能是由于传感器的电子干扰、图像传输过程中的干扰等原因产生的。通过傅里叶变换将含有高斯噪声的图像转换到频域后,我们可以观察到高频部分的能量明显增强,这些增强的高频部分就对应着噪声。

下面是使用 Python 和 OpenCV 进行图像去噪的代码示例:

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

# 读取图像并转换为灰度图
img = cv2.imread('./resource/learn.jpg', 0)

# 进行二维离散傅里叶变换
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)

# 将低频部分移到图像中心
dft_shift = np.fft.fftshift(dft)

# 计算幅度谱
magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))

# 构建低通滤波器,这里以半径为30的圆形滤波器为例
rows, cols = img.shape
crow, ccol = int(rows / 2), int(cols / 2)
mask = np.zeros((rows, cols, 2), np.float32)
mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 1

# 应用低通滤波器
fshift = dft_shift * mask

# 进行逆傅里叶变换
ishift = np.fft.ifftshift(fshift)
iimg = cv2.idft(ishift)
iimg = cv2.magnitude(iimg[:, :, 0], iimg[:, :, 1])

# 显示原始噪声图像、幅度谱和去噪后的图像
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Sorce Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(iimg, cmap='gray')
plt.title('Denoised Image'), plt.xticks([]), plt.yticks([])
plt.show()
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

在上述代码中,我们首先读取了一张含有噪声的图像并将其转换为灰度图。接着进行傅里叶变换和频谱中心化,然后构建了一个半径为 30 的圆形低通滤波器。通过将低通滤波器与频域图像相乘,实现了对高频噪声的抑制。最后,经过逆傅里叶变换,将滤波后的频域图像转换回空间域,得到了去噪后的图像。在这里插入图片描述
从结果可以明显看出,去噪后的图像噪声得到了有效去除,图像变得更加平滑,同时保留了大部分的低频有用信息,如物体的轮廓等 。

5.2 特征提取

频域分析在图像特征提取方面具有独特的优势,能够帮助我们提取图像中的边缘、纹理等重要特征,为后续的图像识别、目标检测等任务提供有力支持。

图像的边缘和纹理是图像中非常重要的特征,它们反映了图像中物体的形状、结构和细节信息。在频域中,边缘和纹理通常对应着高频成分。因为边缘是图像中像素值变化剧烈的地方,而纹理则是由一系列具有一定规律的高频变化组成。通过高通滤波器可以增强这些高频成分,从而突出图像的边缘和纹理特征。

以 Sobel 算子为例,它是一种常用的边缘检测算子,在空域中通过卷积操作来计算图像的梯度,从而检测出边缘。而在频域中,我们可以通过设计合适的高通滤波器来实现类似的效果。高通滤波器可以抑制低频成分,保留高频成分,使得图像的边缘和纹理更加明显。

下面是使用频域分析进行边缘特征提取的代码示例:

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

# 读取图像并转换为灰度图
img = cv2.imread('./resource/learn.jpg', 0)

# 进行二维离散傅里叶变换
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)

# 将低频部分移到图像中心
dft_shift = np.fft.fftshift(dft)

# 计算幅度谱
magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))

# 构建高通滤波器,这里以半径为20的圆形滤波器为例
rows, cols = img.shape
crow, ccol = int(rows / 2), int(cols / 2)
mask = np.ones((rows, cols, 2), np.float32)
mask[crow - 20:crow + 20, ccol - 20:ccol + 20] = 0

# 应用高通滤波器
fshift = dft_shift * mask

# 进行逆傅里叶变换
ishift = np.fft.ifftshift(fshift)
iimg = cv2.idft(ishift)
iimg = cv2.magnitude(iimg[:, :, 0], iimg[:, :, 1])


# 显示原始噪声图像、幅度谱和去噪后的图像
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Sorce Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(iimg, cmap='gray')
plt.title('Denoised Image'), plt.xticks([]), plt.yticks([])
plt.show()
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

在这段代码中,我们同样先对图像进行傅里叶变换和频谱中心化。然后构建了一个半径为 20 的圆形高通滤波器,将其与频域图像相乘,实现了对高频成分的增强。最后通过逆傅里叶变换得到了边缘提取后的图像。在这里插入图片描述
从结果可以看到,边缘提取后的图像中,物体的边缘变得更加清晰和突出,图像的纹理细节也得到了增强 。

5.3 图像压缩

在当今数字化信息飞速发展的时代,图像数据的存储和传输面临着巨大的挑战。随着图像分辨率的不断提高和数据量的日益增大,如何在保证图像质量的前提下,有效地减少图像数据的存储空间和传输带宽,成为了图像处理领域的一个关键问题。频域分析在图像压缩中发挥着重要的作用,为解决这一问题提供了有效的途径。

图像压缩的基本原理是去除图像中的冗余信息,从而减少数据量。在频域中,图像的信息主要由低频分量和高频分量组成。低频分量代表了图像的大致轮廓和主要结构,对图像的视觉感知起着关键作用;而高频分量主要包含图像的细节、纹理和噪声等信息。由于人眼对低频信息更为敏感,对高频信息的敏感度相对较低,因此在图像压缩中,可以适当丢弃一部分高频分量,而不会对图像的主要视觉效果产生明显影响。

以 JPEG 图像压缩标准为例,它就是基于离散余弦变换(DCT)这一频域分析技术来实现的。DCT 是一种类似于傅里叶变换的正交变换,它能够将图像从空间域转换到频域,将图像信号分解为不同频率的余弦函数的加权和。在 JPEG 压缩过程中,首先将图像分成 8x8 的小块,然后对每个小块进行 DCT 变换,将其转换到频域。接着,根据人类视觉系统的特性,对变换后的频域系数进行量化处理,通过设置不同的量化步长,对高频系数进行较大程度的量化,从而丢弃部分高频信息。最后,对量化后的系数进行熵编码,进一步减少数据量。

下面通过一个简单的示例来展示频域分析在图像压缩中的应用效果

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

# 读取图像并转换为YCrCb颜色空间,因为JPEG压缩主要对亮度分量(Y)进行处理
img = cv2.imread('./resource/learn.jpg')
img_ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)

# 分离亮度分量(Y)和色度分量(Cr, Cb)
y, cr, cb = cv2.split(img_ycrcb)

# 设置每个块的大小为8x8
block_size = 8
h, w = y.shape

# 确保图像的尺寸是8的倍数
h = h // block_size * block_size
w = w // block_size * block_size
y = y[:h, :w]

# 量化表 - 调整量化表以增加压缩效果
compression_factor = 30  # 增加压缩因子,使量化更加激进
quantization_table = np.array([
   [16, 11, 10, 16, 24, 40, 51, 61],
   [12, 12, 14, 19, 26, 58, 60, 55],
   [14, 13, 16, 24, 40, 57, 69, 56],
   [14, 17, 22, 29, 51, 87, 80, 62],
   [18, 22, 37, 56, 68, 109, 103, 77],
   [24, 35, 55, 64, 81, 104, 113, 92],
   [49, 64, 78, 87, 103, 121, 120, 101],
   [72, 92, 95, 98, 112, 100, 103, 99]
]) * compression_factor  # 使量化更加激进

# 对每个8x8块进行DCT变换和量化
quantized_dct_y = np.zeros_like(y, dtype=np.float32)
for i in range(0, h, block_size):
    for j in range(0, w, block_size):
        block = y[i:i+block_size, j:j+block_size]
        dct_block = cv2.dct(np.float32(block))
        quantized_dct_block = np.round(dct_block / quantization_table)
        quantized_dct_y[i:i+block_size, j:j+block_size] = quantized_dct_block

# 对量化后的系数进行逆量化和逆DCT变换
dequantized_dct_y = np.zeros_like(quantized_dct_y, dtype=np.float32)
idct_y = np.zeros_like(y, dtype=np.float32)

for i in range(0, h, block_size):
    for j in range(0, w, block_size):
        quantized_block = quantized_dct_y[i:i+block_size, j:j+block_size]
        dequantized_block = quantized_block * quantization_table  # 逆量化
        dequantized_dct_y[i:i+block_size, j:j+block_size] = dequantized_block
        idct_block = cv2.idct(dequantized_block)  # 逆DCT变换
        idct_y[i:i+block_size, j:j+block_size] = idct_block

# 将处理后的亮度分量与原色度分量合并
idct_y = np.clip(idct_y, 0, 255).astype(np.uint8)
img_ycrcb = cv2.merge((idct_y, cr, cb))

# 转换回BGR颜色空间
compressed_img = cv2.cvtColor(img_ycrcb, cv2.COLOR_YCrCb2BGR)

# 显示原始图像和压缩后的图像
plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('Original Image'), plt.xticks([]), plt.yticks([])

plt.subplot(122), plt.imshow(cv2.cvtColor(compressed_img, cv2.COLOR_BGR2RGB))
plt.title(f'Compressed Image (Factor {compression_factor})'), plt.xticks([]), plt.yticks([])

plt.show()
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

在上述代码中,我们首先读取了一张图像,并将其转换为 YCrCb 颜色空间,分离出亮度分量(Y)。然后对亮度分量进行 DCT 变换,将其转换到频域。接着,使用预先定义的量化表对 DCT 系数进行量化,丢弃部分高频信息。之后,对量化后的系数进行逆量化和逆 DCT 变换,将其转换回空间域。最后,将处理后的亮度分量与原色度分量合并,并转换回 BGR 颜色空间,得到压缩后的图像。
在这里插入图片描述
从结果可以看出,压缩后的图像在保持了主要轮廓和结构的同时,数据量得到了显著减少,虽然图像的细节部分有所损失,但在大多数情况下,这种损失对图像的视觉效果影响较小,能够满足实际应用中的存储和传输需求 。

六、总结与展望

6.1 技术总结

本文我们学习了 OpenCV 和频域分析在图像处理领域的强大实力。OpenCV 作为图像处理的基石,凭借其丰富的功能和简洁易用的接口,为我们提供了从图像读取、显示、保存,到色彩空间转换、几何变换、滤波、边缘检测等一系列基础而关键的操作。这些功能如同搭建图像处理大厦的基石,是实现各种复杂图像处理任务的基础。通过 OpenCV,我们能够轻松地对图像进行各种常规处理,快速搭建起图像处理的基本框架 。

频域分析则为我们打开了图像处理的新视角,让我们能够从频率的维度深入理解图像的本质。傅里叶变换作为频域分析的核心工具,将图像从空间域转换到频率域,揭示了图像中低频和高频成分所代表的不同特征。低频成分承载着图像的大致轮廓和缓慢变化的区域,是图像的基本骨架;高频成分则对应着图像的细节、边缘和纹理,赋予了图像丰富的细节和生动性 。

当 OpenCV 与频域分析巧妙融合,为图像处理带来了更强大的能力。在 OpenCV 中,我们可以利用其提供的傅里叶变换相关函数,如 cv2.dftcv2.idftcv2.magnitudecv2.phase 等,方便地实现图像的频域转换和分析。通过案例实操,我们看到了如何利用频域分析进行低通滤波和高通滤波,有效地调整图像的高频和低频成分,实现图像的平滑、去噪、边缘增强等效果。这种融合不仅拓宽了图像处理的方法和手段,也为解决各种实际问题提供了更多的思路和途径 。

6.2 未来展望

展望未来,图像处理技术在人工智能、物联网等领域展现出了广阔的发展前景和无限的潜力。

在人工智能领域,随着深度学习技术的飞速发展,图像处理与人工智能的融合将更加紧密。深度学习模型,如卷积神经网络(CNN),在图像识别、目标检测、图像生成等任务中取得了巨大的成功。未来,结合 OpenCV 和频域分析的图像处理技术,将为深度学习提供更优质的数据预处理和特征提取方法,进一步提升深度学习模型的性能和准确性。同时,基于深度学习的图像生成技术,如生成对抗网络(GAN),也将与传统图像处理技术相互借鉴,创造出更加逼真、多样化的图像内容 。

在物联网领域,图像处理技术将发挥越来越重要的作用。随着物联网设备的广泛普及,如智能摄像头、传感器等,大量的图像数据被实时采集和传输。如何高效地处理这些图像数据,从中提取有价值的信息,成为了物联网发展的关键问题之一。OpenCV 和频域分析技术可以在物联网设备端或边缘端实现实时的图像处理和分析,为智能家居、智能安防、智能交通等应用提供强大的支持。例如,在智能家居中,通过图像处理技术可以实现智能门锁的人脸识别、智能摄像头的行为分析等功能;在智能安防中,利用图像识别和目标检测技术可以实现实时的监控和预警;在智能交通中,图像处理技术可以用于自动驾驶汽车的环境感知、交通流量监测等 。


延伸阅读

注:本文转载自blog.csdn.net的菠萝蚊鸭的文章"https://blog.csdn.net/baidu_25117757/article/details/128302530"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!