用Python和NumPy动手画一画:8种离散正弦变换(DST)的‘基图像’长啥样?

张开发
2026/4/21 8:18:30 15 分钟阅读

分享文章

用Python和NumPy动手画一画:8种离散正弦变换(DST)的‘基图像’长啥样?
用Python和NumPy动手画一画8种离散正弦变换DST的‘基图像’长啥样当你在处理图像压缩或信号处理时可能听说过离散余弦变换DCT但它的近亲——离散正弦变换DST同样值得关注。今天我们就用Python和NumPy来亲手绘制DST-I到DST-VIII这8种变换的基图像看看这些数学公式背后的视觉模式究竟长什么样。1. 准备工作理解DST的基本概念离散正弦变换是信号处理中常用的一类正交变换与离散余弦变换类似但使用正弦函数而非余弦函数作为基函数。DST有8种主要变体I-VIII每种对应不同的边界条件和对称性。为什么需要8种不同的DST这源于信号延拓方式的不同奇对称延拓产生正弦函数的基不同的延拓点导致不同的频率采样方式归一化系数确保变换的正交性在开始编码前我们需要安装必要的Python库pip install numpy matplotlib2. 构建DST核函数每种DST类型都有其独特的变换核。让我们用NumPy实现所有8种类型的核函数import numpy as np def dst1_kern(N): DST-I核函数 x np.zeros([N, N]) for k in range(N): x[k, :] np.sin(np.pi * (k 1) * (np.arange(N) 1) / (N 1)) x * np.sqrt(2. / (N 1)) return x def dst2_kern(N): DST-II核函数 x np.zeros([N, N]) for k in range(N): x[k, :] np.sin(np.pi * (k 1) * (2 * np.arange(N) 1) / (2 * N)) x[-1, :] / np.sqrt(2) x * np.sqrt(2. / N) return x # 类似地实现DST-III到DST-VIII的核函数 [...其余6种核函数实现...]每种核函数的实现都遵循其数学定义主要区别在于正弦函数的参数不同归一化系数不同某些特定行/列需要额外处理3. 可视化基图像有了核函数我们可以生成并可视化基图像。基图像展示了变换如何分解信号import matplotlib.pyplot as plt def plot_basis_images(kern, title): N kern.shape[0] img kern.T kern # 生成所有基图像的组合 plt.figure(figsize(10, 10)) plt.imshow(img, cmapgray) plt.title(fDST-{title} Basis Images (Combined)) plt.colorbar() plt.show() # 单独显示每个基图像 plt.figure(figsize(15, 15)) for i in range(N): for j in range(N): plt.subplot(N, N, i*N j 1) basis_img kern[[i], :].T kern[[j], :] plt.imshow(basis_img, cmapgray) plt.axis(off) plt.suptitle(fDST-{title} Individual Basis Images) plt.tight_layout() plt.show()4. 8种DST基图像对比让我们生成8×8的变换矩阵并比较不同类型的DST基图像特征DST类型基图像特征主要应用场景DST-I边缘值非零对称性较弱信号边界处理DST-II类似DCT但使用正弦函数图像压缩DST-IIIDST-II的逆变换版本逆变换运算DST-IV双重奇对称性重叠变换DST-V周期边界条件周期性信号DST-VI混合边界条件特殊变换需求DST-VIIH.266编解码标准采用视频压缩DST-VIII复杂对称模式高级信号处理注意DST-VII是现代视频编码标准H.266/VVC中采用的变换方式因其在特定信号类型上的优异能量集中特性。5. 不同尺寸下的基图像变化变换尺寸(N)对基图像的影响很大。让我们看看N4和N8时的差异sizes [4, 8] dst_types [I, II, III, IV, V, VI, VII, VIII] for n in sizes: plt.figure(figsize(20, 10)) for i, dst in enumerate(dst_types): kern globals()[fdst{dst.lower()}_kern](n) combined_img kern.T kern plt.subplot(2, 4, i1) plt.imshow(combined_img, cmapgray) plt.title(fDST-{dst} (N{n})) plt.axis(off) plt.tight_layout() plt.show()随着N增大基图像表现出更高频的波动模式更精细的细节表示能力更复杂的交叉模式6. 在图像压缩中的应用原理DST基图像代表了信号可以被分解的不同频率分量。在压缩时将图像分块(如8×8)对每块应用DST保留大幅值系数(通常为低频)丢弃小幅值系数(通常为高频)def dst_compress(image, dst_typeVII, block_size8, keep_ratio0.2): 模拟DST压缩过程 kern globals()[fdst{dst_type.lower()}_kern](block_size) # 分块处理 compressed np.zeros_like(image, dtypefloat) for i in range(0, image.shape[0], block_size): for j in range(0, image.shape[1], block_size): block image[i:iblock_size, j:jblock_size] coeffs kern block kern.T # 保留前keep_ratio比例的系数 threshold np.sort(np.abs(coeffs).ravel())[-int(keep_ratio*block_size**2)] coeffs[np.abs(coeffs) threshold] 0 # 重构块 compressed[i:iblock_size, j:jblock_size] kern.T coeffs kern return compressed7. 实际效果对比让我们用不同DST类型压缩同一幅图像比较效果from skimage import data image data.camera().astype(float)/255 dst_types [I, II, IV, VII] plt.figure(figsize(15, 10)) for i, dst in enumerate(dst_types): compressed dst_compress(image, dst_typedst) plt.subplot(2, 2, i1) plt.imshow(compressed, cmapgray) plt.title(fDST-{dst} Compression (PSNR: {peak_signal_noise_ratio(image, compressed):.2f}dB)) plt.axis(off) plt.tight_layout() plt.show()从实验结果可以看到DST-VII通常提供最佳压缩效果DST-I因边界处理方式不同可能产生更多块效应DST-IV在某些纹理区域表现优异8. 进阶自定义DST可视化工具为了更深入理解我们可以创建一个交互式可视化工具from ipywidgets import interact, Dropdown, IntSlider interact def explore_dst( dst_typeDropdown(options[(fDST-{i}, i) for i in [I,II,III,IV,V,VI,VII,VIII]]), sizeIntSlider(min4, max16, step2, value8), component_xIntSlider(min0, max7, value0), component_yIntSlider(min0, max7, value0) ): kern globals()[fdst{dst_type.lower()}_kern](size) basis_img kern[[component_x], :].T kern[[component_y], :] plt.figure(figsize(8, 4)) plt.subplot(1, 2, 1) plt.imshow(kern.T kern, cmapgray) plt.title(fAll {dst_type} Basis (N{size})) plt.subplot(1, 2, 2) plt.imshow(basis_img, cmapgray) plt.title(fComponent ({component_x},{component_y})) plt.colorbar() plt.show()这个工具允许你选择DST类型调整变换尺寸查看特定频率分量对应的基图像直观理解不同基图像对信号的影响

更多文章