图像的基础知识
1、将lenna彩色图像转化为灰度图,利用傅里叶变换,将其变换到频域(考虑如何将图像的频谱图中心从四个拐角移动到中心),理解变换之后的输出的实部和虚部分别代表什么含义,如何获得图像的相位谱图,和相位角,对图像进行傅里叶逆变换,取其实部得到复原图,对比复原图和原图。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img_lenna = cv2.imread('Lenna_RGB.tif', 0) #自动读取为灰度图
#傅里叶变换
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT) # 傅里叶变换库函数调用
dftshift = np.fft.fftshift(dft) # 将傅里叶频域从左上角移动到中间
res1 = 20 * np.log(cv2.magnitude(dftshift[:, :, 0], dftshift[:, :, 1])) # 双通道结果转换为0到255的范围用于图像显示
#傅里叶变换
f = np.fft.fft2(img_lenna)
fshift = np.fft.fftshift(f) #将傅里叶频域从左上角移动到中间
c1=np.log(np.abs(f)) #频域后图像的振幅信息(相位谱图)
c2 = np.log(np.abs(fshift)) #中心化操作
s1 = np.abs(fshift) # 取振幅
s1_angle = np.angle(fshift) # 取相位(相位角)
s1_real = s1*np.cos(s1_angle) # 取实部
s1_imag = s1*np.sin(s1_angle) # 取虚部
#傅里叶逆变换
ishift = np.fft.ifftshift(fshift) # 将频域从中间移动到左上角
iimg = cv2.idft(ishift) # 傅里叶逆变换库函数调用
res2 = cv2.magnitude(iimg[:, :, 0], iimg[:, :, 1]) # 双通道结果转换为0到255的范围
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
#显示图像
plt.subplot(131), plt.imshow(img_lenna, 'gray'), plt.title('img_lenna')
plt.subplot(132), plt.imshow(c1, 'gray'), plt.title('c1') # 相位谱图
plt.subplot(133), plt.imshow(c2, 'gray'), plt.title('c2') # 中心化操作
plt.show()
2.将lenna彩色图像转化为灰度图,进行余弦变换,由于余弦变换的能量主要集中与频率在0的位置,即频谱图的左上角,在左上角取不同频率范围的幅度值进行余弦逆变换,观察不同取值下,逆变换之后的复原图有什么不同。取值分别为(60,80,120),将原图及取不同取值范围时的三幅图利用matplotlib画在一个figure中
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
img_lenna = cv2.imread('Lenna_RGB.tif', 0) #自动读取为灰度图
img1 = img_lenna.astype(np.float32)
img_dct = cv2.dct(img1)
def imag_dct(img_dct , dig):
img_dct1 = cv2.copyTo(img_dct, None)
(rows, cols) = img_dct1.shape
for i in range(0, rows):
for j in range(0, cols):
if i > dig or j > dig:
img_dct1[i, j] = 0
img_dct_log = np.log(abs(img_dct1))
img_idct = cv2.idct(img_dct1)
return img_dct_log, img_idct
img1_dct , img1_idct = imag_dct(img_dct , 60)
img2_dct , img2_idct = imag_dct(img_dct , 80)
img3_dct , img3_idct = imag_dct(img_dct , 120)
plt.subplot(421)
plt.imshow(img1_dct, cmap='gray')
plt.title('dct-60')
plt.axis('off')
plt.subplot(422)
plt.imshow(img1_idct, cmap='gray')
plt.title('idct-60')
plt.axis('off')
plt.subplot(423)
plt.imshow(img2_dct, cmap='gray')
plt.title('dct-80')
plt.axis('off')
plt.subplot(424)
plt.imshow(img2_idct, cmap='gray')
plt.title('idct-80')
plt.axis('off')
plt.subplot(425)
plt.imshow(img3_dct, cmap='gray')
plt.title('dct-120')
plt.axis('off')
plt.subplot(426)
plt.imshow(img3_idct, cmap='gray')
plt.title('idct-120')
plt.axis('off')
plt.subplot(427)
plt.imshow(img_lenna, cmap='gray')
plt.title('原图')
plt.axis('off')
plt.show()
3.将lenna彩色图像转化为灰度图,进行一层小波变换,首先理解小波的尺度a和平移量b对小波的幅值及位置的影响,理解小波基的正交性,将图像进行一层小波分解后得到4个量,分别为近似量(低频部分,比较模糊),水平细节(高频),垂直细节(高频),和对角线细节,这四个量利用matplotlib画在一个figure中。
import numpy as np
import pywt
import cv2
import matplotlib.pyplot as plt
img_lenna = cv2.imread('Lenna_RGB.tif', 0) #自动读取为灰度图
img=cv2.resize(img, (448,448))
img=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY).astype(np.float32)
plt.figure('二维小波一级变换')
coeffs=pywt.dwt2(img, 'haar')
cA,(cH,cV,cD)=coeffs
plt.subplot(221), plt.imshow(cA, 'gray'), plt.title("A")
plt.subplot(222), plt.imshow(cH, 'gray'), plt.title("H")
plt.subplot(223), plt.imshow(cV, 'gray'), plt.title("V")
plt.subplot(224), plt.imshow(cD, 'gray'), plt.title("D")
plt.show()