【小波变换】小波变换python实现--PyWavelets

【小波变换】小波变换python实现--PyWavelets_第1张图片

1、二维图像单级变换:dwt2()

haar小波单级变换之后:
低频信息的取值范围为:[0,510]
高频信息的取值范围为:[-255,255]

(原因可参考:https://blog.csdn.net/baidu_27643275/article/details/84826773

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

img = cv2.imread("cat.jpg")
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

# 将各个子图进行拼接,最后得到一张图
AH = np.concatenate([cA, cH], axis=1)
VD = np.concatenate([cV, cD], axis=1)
img = np.concatenate([AH, VD], axis=0)

# 显示为灰度图
plt.imshow(img,'gray')
plt.title('result')
plt.show()

在拼接子图之前,应该先对各个子图进行处理。未处理的情况下,因为高频部分的像素值极小甚至小于0,所以高频区域呈黑色。
【小波变换】小波变换python实现--PyWavelets_第2张图片
最简单的处理方式为:将高频信息均加255,得到如下结果:
【小波变换】小波变换python实现--PyWavelets_第3张图片

另一种显示方式:
import numpy as np
import pywt
import cv2
import matplotlib.pyplot as plt

img = cv2.imread("cat.jpg")
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()

【小波变换】小波变换python实现--PyWavelets_第4张图片

2、二维图像多级分解:wavedec2()

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

img = cv2.imread("cat.jpg")
img = cv2.resize(img, (448, 448))
# img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.float32)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY).astype(np.float32)

plt.figure('二维图像多级分解')
coeffs = pywt.wavedec2(img, 'haar', level=2)
cA2, (cH2, cV2, cD2), (cH1, cV1, cD1) = coeffs

# 将每个子图的像素范围都归一化到与CA2一致  CA2 [0,255* 2**level]
AH2 = np.concatenate([cA2, cH2+510], axis=1)
VD2 = np.concatenate([cV2+510, cD2+510], axis=1)
cA1 = np.concatenate([AH2, VD2], axis=0)

AH = np.concatenate([cA1, (cH1+255)*2], axis=1)
VD = np.concatenate([(cV1+255)*2, (cD1+255)*2], axis=1)
img = np.concatenate([AH, VD], axis=0)

plt.imshow(img,'gray')
plt.title('2D WT')
plt.show()

【小波变换】小波变换python实现--PyWavelets_第5张图片

参考:
https://blog.csdn.net/nanbei2463776506/article/details/64124841

你可能感兴趣的:(【小波变换】小波变换python实现--PyWavelets)