利用python实现DCT变换,并且过滤掉高频信息

最近学习DCT变换是,在网上找代码,不得不说,真是垃圾堆里翻吃的,全都是复制粘贴。不过还在却是找到了几个不错的文章,在此结合自己的学习,在这重新写一下。
代码如下

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 利用cv2读取图像,0代表单颜色通道,其他参数自行了解。
img = cv2.imread('11.jpg',0)
#转换成浮点类型
img_f32 = img.astype(np.float)
#这里是为了打印看下图像尺寸,非必要步骤
height, width = img.shape
print(height,width)#结果是1500,1500
# 利用cv2中的函数进行离散余弦变换
dct = cv2.dct(img_f32)
#这段代码是为了筛出高频信息,同时也可以筛掉低频信息。后面在做解释
lower_triangular =np.rot90(np.triu(np.ones((1500, 1500)),k=1300))
dct=dct*lower_triangular

#将变换后的值进行log化
dct_log = np.log(abs(dct))
# 进行离散余弦逆变换
idct = cv2.idct(dct)
#打印结果,尽管cv2中的imshow也可以展示图片,但只能显示单通道,所以我借鉴了csdn某位作者大佬的代码
#这段代码只是进行展示,并不影响DCT变换结果
plt.figure(6, figsize=(12, 8))
plt.subplot(231)
plt.imshow(img, 'gray')
plt.title('original image'), plt.xticks([]), plt.yticks([])
plt.subplot(232)
plt.imshow(dct_log)
plt.title('DCT'), plt.xticks([]), plt.yticks([])
plt.subplot(233)
plt.imshow(idct, 'gray')
plt.title('IDCT'), plt.xticks([]), plt.yticks([])
plt.show()

利用python实现DCT变换,并且过滤掉高频信息_第1张图片
这个结果是我利用上面注释提到的代码过滤掉了高频信息(高频信息位于图像的右下角,全部置为0即可过滤):

lower_triangular =np.rot90(np.triu(np.ones((1500, 1500)),k=1300))
dct=dct*lower_triangular

图像的大部分信息都在低频信息中,可以看出我过滤掉这么大的区域后,恢复的图像仍然看起来很完整。

如果去掉这行代码的话效果是这样的
利用python实现DCT变换,并且过滤掉高频信息_第2张图片
如果想设置成其他形状的过滤区域,读者也可自行尝试。

我采用的思想是:利用矩阵相乘,将左下角矩阵全设置为0,其他区域设置为1.这样就形成了一个滤网。这也是为什么我在代码中要构建一个和图像一样大小的矩阵了

你可能感兴趣的:(python,opencv,开发语言,神经网络,计算机视觉)