Radon变换:是一种用于将图像从空间域转换到投影域的数学工具,其基本思想是将图像中每个点的灰度值投影到一组直线上,然后将这些投影合并在一起形成投影域。Radon变换可以用于多种图像处理任务,包括图像重建、特征提取、图像分割等
Radon变换原理:给定一个函数 f ( x , y ) f(x, y) f(x,y),Radon变换将其投影到一组线上,得到一组投影值 p ( θ , s ) p(\theta, s) p(θ,s)。其中 θ \theta θ表示投影线的角度, s s s表示投影线与原点的距离。具体而言,对于每个角度 θ \theta θ,Radon变换将在直线 l θ , s l_{\theta,s} lθ,s上对函数 f ( x , y ) f(x, y) f(x,y)进行积分,其中 l θ , s l_{\theta,s} lθ,s是距离原点为 s s s,与 x x x轴成 θ \theta θ角度的直线。投影值 p ( θ , s ) p(\theta, s) p(θ,s)即为积分结果
可以将Radon变换看作是从二维函数到一维函数的映射,其中每个投影值 p ( θ , s ) p(\theta, s) p(θ,s)表示了投影线 l θ , s l_{\theta,s} lθ,s上的一维信息。因此,Radon变换可以用于从一组投影值中重建原始函数 f ( x , y ) f(x, y) f(x,y)。这种逆变换被称为逆Radon变换或反投影
MATLAB实现:相关函数如下,具体解释可看MATLAB帮助手册
[R,xp]=radon(I,theta)
:Radon变换是一种用于图像处理中的特征提取的方法,可以用于检测图像中的直线特征
I
为输入的图像theta
为变换角度R
为变换后的结果xp
为变换后的坐标程序1:对图像进行指定方向上的Radon变换
clear,clc,close all;
Image=rgb2gray(imread('block.bmp'));
[R1,X1]=radon(Image,0);
[R2,X2]=radon(Image,45);
subplot(131),imshow(Image),title('原图');
subplot(132),plot(X1,R1),title('0度方向的radon变换曲线');
subplot(133),plot(X2,R2),title('45度方向的radon变换曲线');
程序2:对图像进行Radon变换和反变换
clear,clc,close all;
Image=rgb2gray(imread('block.bmp'));
theta=0:10:180;
[R,X]=radon(Image,theta);
C=max(R);
result=iradon(R,theta);
subplot(131),imshow(Image),title('原图');
subplot(132),imagesc(theta,X,R),title('0-180度方向的radon变换曲线集合');
subplot(133),image(result),title('重建图像');
Python实现:使用Python实现上述同样的功能
程序1:对图像进行指定方向上的Radon变换
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
# Load the image
Image = cv2.imread('block.bmp', cv2.IMREAD_GRAYSCALE)
# Perform Radon transform
theta = np.arange(0, 180, 1)
R = cv2.radon(Image, theta)
# Display the results
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(10, 5))
ax1.imshow(Image, cmap='gray')
ax1.set_title('Original Image')
ax2.plot(R[:, 0])
ax2.set_title('Radon Transform (0 degrees)')
ax3.plot(R[:, 45])
ax3.set_title('Radon Transform (45 degrees)')
plt.show()
程序2:对图像进行Radon变换和反变换
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
# Load the image
Image = cv2.imread('block.bmp', cv2.IMREAD_GRAYSCALE)
# Perform Radon transform
theta = np.arange(0, 181, 10)
R = cv2.radon(Image, theta)
# Get the maximum value of the Radon transform
C = np.max(R)
# Perform inverse Radon transform
result = cv2.remap(R, theta, None, cv2.INTER_LINEAR)
# Display the images using matplotlib
fig, axs = plt.subplots(1, 3, figsize=(10, 10))
axs[0].imshow(Image, cmap='gray')
axs[0].set_title('Original Image')
axs[1].imshow(R, cmap='gray', extent=(0, 180, 0, R.shape[0]), aspect='auto')
axs[1].set_title('Radon Transform')
axs[2].imshow(result, cmap='gray')
axs[2].set_title('Reconstructed Image')
plt.show()
线性:Radon变换是线性的。即,对于任意常数 a , b a,b a,b和函数 f , g f,g f,g,有以下等式成立
R { a f + b g } = a R { f } + b R { g } \mathcal{R}\{a f+b g\}=a \mathcal{R}\{f\}+b \mathcal{R}\{g\} R{af+bg}=aR{f}+bR{g}
其中 R ⋅ \mathcal{R}{\cdot} R⋅表示Radon变换。这个性质意味着可以通过对原始函数进行线性组合来计算其Radon变换
平移性:Radon变换是平移不变的。即,对于函数 f ( x , y ) f(x,y) f(x,y)和距离向量 d = ( d x , d y ) d=(d_x,d_y) d=(dx,dy),有以下等式成立
R { f ( x − d x , y − d y ) } ( θ , s ) = R { f ( x , y ) } ( θ , s − d x cos θ − d y sin θ ) \mathcal{R}\left\{f\left(x-d_{x}, y-d_{y}\right)\right\}(\theta, s)=\mathcal{R}\{f(x, y)\}\left(\theta, s-d_{x} \cos \theta-d_{y} \sin \theta\right) R{f(x−dx,y−dy)}(θ,s)=R{f(x,y)}(θ,s−dxcosθ−dysinθ)
这个性质意味着可以通过平移原始函数来计算其在不同位置上的Radon变换
相似性:Radon变换是相似变换不变的。即,对于函数 f ( x , y ) f(x,y) f(x,y)和比例因子 a a a,有以下等式成立
R { f ( a x , a y ) } ( θ , s ) = 1 ∣ a ∣ R { f ( x , y ) } ( θ , s ∣ a ∣ ) \mathcal{R}\{f(a x, a y)\}(\theta, s)=\frac{1}{|a|} \mathcal{R}\{f(x, y)\}\left(\theta, \frac{s}{|a|}\right) R{f(ax,ay)}(θ,s)=∣a∣1R{f(x,y)}(θ,∣a∣s)
微分:Radon变换具有微分性质。即,对于函数 f ( x , y ) f(x,y) f(x,y),有以下等式成立
∂ ∂ s R { f ( x , y ) } ( θ , s ) = − ∫ − ∞ ∞ ∂ ∂ y f ( x , y ) cos θ − ∂ ∂ x f ( x , y ) sin θ d x \frac{\partial}{\partial s} \mathcal{R}\{f(x, y)\}(\theta, s)=-\int_{-\infty}^{\infty} \frac{\partial}{\partial y} f(x, y) \cos \theta-\frac{\partial}{\partial x} f(x, y) \sin \theta d x ∂s∂R{f(x,y)}(θ,s)=−∫−∞∞∂y∂f(x,y)cosθ−∂x∂f(x,y)sinθdx
这个性质意味着可以通过对Radon变换进行微分来计算原始函数的导数
Radon变换应用:
小波变换:是一种数学工具,用于将信号分解成不同的频率组件。类似于频谱分析,但小波变换可以捕捉到瞬态信号中的时间和频率信息。简单来说,它可以将信号分成多个不同时间长度和频率范围的子信号,以便更好地理解和处理原始信号
小波:小波变换中的“小波”指的是一种基本的函数,可以用于将信号分解成不同的频率组件。这些小波函数具有紧凑的支撑和可变的频率和时间分辨率,使得它们可以在时域和频域之间转换,并能够更好地捕捉信号中的局部特征。数学上,小波是一种能够满足一定条件的局部有限能量函数,通常被定义为具有均值为零的波形函数和尺度函数的线性组合。通过将信号与不同尺度和位置的小波函数进行内积运算,可以得到信号在不同频率上的分解系数,进而实现小波变换。设函数 ψ ( t ) \psi(t) ψ(t)满足 ∫ R ψ ( t ) d t = 0 \int_{R} \psi(t) d t=0 ∫Rψ(t)dt=0,对其进行平移和伸缩产生函数族: ψ a , b ( t ) = 1 a ψ ( t − b a ) , a , b ∈ R , a ≠ 0 \psi_{a, b}(t)=\frac{1}{\sqrt{a}} \psi\left(\frac{t-b}{a}\right),a,b\in R,a\not=0 ψa,b(t)=a1ψ(at−b),a,b∈R,a=0, ψ ( t ) \psi(t) ψ(t)称为基小波或母小波, α \alpha α为伸缩因子, b b b为平移因子, ψ a , b ( t ) \psi_{a,b}(t) ψa,b(t)为 ψ ( t ) \psi(t) ψ(t)生成的连续小波。小波有如下特点
Haar小波:下图为Harr小波及其频谱
{ Ψ H ( t ) = { 1 0 ≤ t < 1 / 2 − 1 1 / 2 ≤ t < 1 0 其他 Ψ H ( ω ) = 1 − 2 e i ω 2 + e − i ω ω i \left\{\begin{array}{l}\Psi_{H}(t)=\left\{\begin{array}{cc}1 & 0 \leq t<1 / 2 \\-1 & 1 / 2 \leq t<1 \\0 & \text { 其他 }\end{array}\right. \\\Psi_{H}(\omega)=\frac{1-2 e^{\frac{i \omega}{2}}+e^{-i \omega}}{\omega i}\end{array}\right. ⎩ ⎨ ⎧ΨH(t)=⎩ ⎨ ⎧1−100≤t<1/21/2≤t<1 其他 ΨH(ω)=ωi1−2e2iω+e−iω
Morlet小波:下图为Morlet小波及其频谱
{ Ψ ( t ) = π − 1 / 4 ( e − i ω 0 t − e − ω 0 2 / 2 ) e − t 2 / 2 Ψ ( ω ) = π − 1 / 4 [ e − ( ω − ω 0 ) 2 / 2 − e − ω 0 2 / 2 e − ω 2 / 2 ] \left\{\begin{array}{l}\Psi(t)=\pi^{-1 / 4}\left(e^{-i \omega_{0} t}-e^{-\omega_{0}^{2} / 2}\right) e^{-t^{2} / 2} \\\Psi(\omega)=\pi^{-1 / 4}\left[e^{-\left(\omega-\omega_{0}\right)^{2} / 2}-e^{-\omega_{0}^{2} / 2} e^{-\omega^{2} / 2}\right]\end{array}\right. ⎩ ⎨ ⎧Ψ(t)=π−1/4(e−iω0t−e−ω02/2)e−t2/2Ψ(ω)=π−1/4[e−(ω−ω0)2/2−e−ω02/2e−ω2/2]
Mexico草帽小波:下图为Mexico草帽小波及其频谱
Ψ ( t ) = ( 2 3 π − 1 / 4 ) ( 1 − t 2 ) e − t 2 / 2 \Psi(t)=\left(\frac{2}{\sqrt{3}} \pi^{-1 / 4}\right)\left(1-t^{2}\right) e^{-t^{2} / 2} Ψ(t)=(32π−1/4)(1−t2)e−t2/2
连续小波变换(Continuous Wavelet Transform,CWT):给定一个原始信号 f ( t ) f(t) f(t),以及一个小波函数 ψ ( t ) \psi(t) ψ(t),CWT 将 f ( t ) f(t) f(t) 与 ψ ( t ) \psi(t) ψ(t) 进行一系列缩放和平移操作得到一组小波系数 C ψ ( a , b ) C_{\psi}(a,b) Cψ(a,b),其中 a a a 和 b b b 分别表示尺度(缩放因子)和位移(平移因子)。CWT可用如下公式表示
C ψ ( a , b ) = 1 a ∫ − ∞ + ∞ f ( t ) ψ ∗ ( t − b a ) d t C_{\psi}(a, b)=\frac{1}{\sqrt{a}} \int_{-\infty}^{+\infty} f(t) \psi^{*}\left(\frac{t-b}{a}\right) d t Cψ(a,b)=a1∫−∞+∞f(t)ψ∗(at−b)dt
CWT 的物理意义是将信号 f ( t ) f(t) f(t) 拆分成一系列不同尺度和不同频率的小波,从而可以更好地分析信号的局部特征
时频特性:是指小波变换能够提供的时间和频率信息。与傅里叶变换只提供频率信息不同,小波变换在时域和频域都提供了有用的信息
分析小波 ψ a , b ( t ) \psi_{a,b}(t) ψa,b(t)时、频窗中心和时,频窗半径,可得
t ψ ∗ , Δ t ψ , w ψ ∗ , Δ w ψ t^{*}_{\psi},\Delta t_{\psi},w^{*}_{\psi},\Delta w_{\psi} tψ∗,Δtψ,wψ∗,Δwψ是基小波 ψ ( t ) \psi(t) ψ(t)的时、频窗中心、半径
2 Δ t ⋅ 2 Δ ω = 4 a Δ t ψ ⋅ 1 a Δ ω ψ = 4 Δ t ψ ⋅ Δ ω ψ 2 \Delta t \cdot 2 \Delta \omega=4 a \Delta t_{\psi} \cdot \frac{1}{a} \Delta \omega_{\psi}=4 \Delta t_{\psi} \cdot \Delta \omega_{\psi} 2Δt⋅2Δω=4aΔtψ⋅a1Δωψ=4Δtψ⋅Δωψ
对于固定的 b b b,当 a > 1 a>1 a>1时,随着 a a a的增大,时窗增宽,频窗变窄,但窗口面积不变
小波变换分析信号具有自适应的时频窗口
离散小波变换(Discrete Wavelet Transform,DWT):给定一个长度为 N N N 的离散信号 x [ n ] x[n] x[n],以及一个小波函数 ψ [ n ] \psi[n] ψ[n],DWT 将 x [ n ] x[n] x[n] 与 ψ [ n ] \psi[n] ψ[n] 进行一系列缩放和平移操作得到一组小波系数 c j , k c_{j,k} cj,k 和一组近似系数 d j d_j dj。其中, j j j 表示尺度(缩放因子), k k k 表示位移(平移因子)。DWT可以用以下公式表示
c j , k = ⟨ x [ n ] , ψ j , k [ n ] ⟩ = ∑ n = 0 N − 1 x [ n ] ψ j , k [ n ] d j [ k ] = ⟨ x [ n ] , ϕ j , k [ n ] ⟩ = ∑ n = 0 N − 1 x [ n ] ϕ j , k [ n ] \begin{array}{l}c_{j, k}=\left\langle x[n], \psi_{j, k}[n]\right\rangle=\sum_{n=0}^{N-1} x[n] \psi_{j, k}[n] \\d_{j}[k]=\left\langle x[n], \phi_{j, k}[n]\right\rangle=\sum_{n=0}^{N-1} x[n] \phi_{j, k}[n]\end{array} cj,k=⟨x[n],ψj,k[n]⟩=∑n=0N−1x[n]ψj,k[n]dj[k]=⟨x[n],ϕj,k[n]⟩=∑n=0N−1x[n]ϕj,k[n]
DWT 的物理意义与 CWT 类似,是将信号 x [ n ] x[n] x[n] 拆分成一组不同尺度和不同位置(或频率)的小波系数和近似系数,从而可以更好地分析信号的局部特征。与 CWT 不同的是,DWT 使用离散信号和离散小波函数进行计算,因此可以在计算机上高效地实现
正交小波(Orthogonal Wavelet Transform,OWT):给定一个长度为 N N N 的离散信号 x [ n ] x[n] x[n],以及一组正交小波函数 ψ j , k [ n ] , ϕ j , k [ n ] {\psi_{j,k}[n],\phi_{j,k}[n]} ψj,k[n],ϕj,k[n],OWT 将 x [ n ] x[n] x[n] 与小波基进行内积计算,得到一组小波系数 c j , k c_{j,k} cj,k 和一组近似系数 d j d_j dj。其中, j j j 表示尺度(缩放因子), k k k 表示位移(平移因子)。OWT可用如下公式表示
c j , k = ⟨ x [ n ] , ψ j , k [ n ] ⟩ = ∑ n = 0 N − 1 x [ n ] ψ j , k [ n ] d j [ k ] = ⟨ x [ n ] , ϕ j , k [ n ] ⟩ = ∑ n = 0 N − 1 x [ n ] ϕ j , k [ n ] \begin{array}{l}c_{j, k}=\left\langle x[n], \psi_{j, k}[n]\right\rangle=\sum_{n=0}^{N-1} x[n] \psi_{j, k}[n] \\d_{j}[k]=\left\langle x[n], \phi_{j, k}[n]\right\rangle=\sum_{n=0}^{N-1} x[n] \phi_{j, k}[n]\end{array} cj,k=⟨x[n],ψj,k[n]⟩=∑n=0N−1x[n]ψj,k[n]dj[k]=⟨x[n],ϕj,k[n]⟩=∑n=0N−1x[n]ϕj,k[n]
其中, ψ j , k [ n ] \psi_{j,k}[n] ψj,k[n] 和 ϕ j , k [ n ] \phi_{j,k}[n] ϕj,k[n] 是正交小波函数,满足以下正交条件
⟨ ψ j , k [ n ] , ψ j ′ , k ′ [ n ] ⟩ = δ j , j ′ δ k , k ′ ⟨ ϕ j , k [ n ] , ϕ j ′ , k ′ [ n ] ⟩ = δ j , j ′ δ k , k ′ \begin{array}{l}\left\langle\psi_{j, k}[n], \psi_{j^{\prime}, k^{\prime}}[n]\right\rangle=\delta_{j, j^{\prime}} \delta_{k, k^{\prime}} \\\left\langle\phi_{j, k}[n], \phi_{j^{\prime}, k^{\prime}}[n]\right\rangle=\delta_{j, j^{\prime}} \delta_{k, k^{\prime}}\end{array} ⟨ψj,k[n],ψj′,k′[n]⟩=δj,j′δk,k′⟨ϕj,k[n],ϕj′,k′[n]⟩=δj,j′δk,k′
正交小波基具有多项式性质,可以通过递推算法(如 Daubechies 算法)构造。这种小波基通常比 CWT 和其他小波变换的小波基更容易实现和计算,并且在压缩和信号处理应用中被广泛使用
二维小波变换(Two-Dimensional Wavelet Transform,2DWT):是一种将二维图像或信号分解为不同尺度和方向上的频率成分的小波变换。它可以将一个 M × N M\times N M×N 的二维信号 f ( x , y ) f(x,y) f(x,y) 分解为多个尺度和方向上的小波系数 w j , k ( x , y ) w_{j,k}(x,y) wj,k(x,y) 和近似系数 a J ( x , y ) a_{J}(x,y) aJ(x,y),其中 j j j 表示尺度, k k k 表示位置, J J J 是最粗糙的尺度。小波系数和近似系数可以用以下公式计算
w j , k ( x , y ) = ⟨ f ( x , y ) , ψ j , k ( x , y ) ⟩ = ∬ − ∞ ∞ f ( x , y ) ψ j , k ∗ ( x , y ) d x d y a J ( x , y ) = ⟨ f ( x , y ) , ϕ J ( x , y ) ⟩ = ∬ − ∞ ∞ f ( x , y ) ϕ J ∗ ( x , y ) d x d y \begin{array}{l}w_{j, k}(x, y)=\left\langle f(x, y), \psi_{j, k}(x, y)\right\rangle=\iint_{-\infty}^{\infty} f(x, y) \psi_{j, k}^{*}(x, y) d x d y \\a_{J}(x, y)=\left\langle f(x, y), \phi_{J}(x, y)\right\rangle=\iint_{-\infty}^{\infty} f(x, y) \phi_{J}^{*}(x, y) d x d y\end{array} wj,k(x,y)=⟨f(x,y),ψj,k(x,y)⟩=∬−∞∞f(x,y)ψj,k∗(x,y)dxdyaJ(x,y)=⟨f(x,y),ϕJ(x,y)⟩=∬−∞∞f(x,y)ϕJ∗(x,y)dxdy
其中, ψ j , k ( x , y ) \psi_{j,k}(x,y) ψj,k(x,y) 和 ϕ J ( x , y ) \phi_{J}(x,y) ϕJ(x,y) 是二维小波基函数,满足正交性和归一化条件:
⟨ ψ j , k ( x , y ) , ψ j ′ , k ′ ( x , y ) ⟩ = δ j , j ′ δ k , k ′ ⟨ ϕ J ( x , y ) , ϕ J ( x , y ) ⟩ = 1 \begin{array}{l}\left\langle\psi_{j, k}(x, y), \psi_{j^{\prime}, k^{\prime}}(x, y)\right\rangle=\delta_{j, j^{\prime}} \delta_{k, k^{\prime}} \\\left\langle\phi_{J}(x, y), \phi_{J}(x, y)\right\rangle=1\end{array} ⟨ψj,k(x,y),ψj′,k′(x,y)⟩=δj,j′δk,k′⟨ϕJ(x,y),ϕJ(x,y)⟩=1
二维小波基函数可以通过将一维小波基函数在两个方向上的张量积得到。可以使用快速小波变换(Fast Wavelet Transform,FWT)等算法对二维小波变换进行计算
二维小逆反变换将小波系数和近似系数重新组合成原始信号 f ( x , y ) f(x,y) f(x,y),其公式为:
f ( x , y ) = ∑ j = 0 J ∑ k w j , k ( x , y ) + a J ( x , y ) f(x, y)=\sum_{j=0}^{J} \sum_{k} w_{j, k}(x, y)+a_{J}(x, y) f(x,y)=j=0∑Jk∑wj,k(x,y)+aJ(x,y)
图像小波分解:是将二维图像进行小波变换以得到其不同尺度和方向上的小波系数和近似系数的过程。这种分解提供了一种多分辨率分析图像和识别局部变化的方法。图像小波分解可以使用二维小波变换(如二维离散小波变换或二维冗余小波变换)来实现。通常情况下,二维离散小波变换速度较快且存储需求较小,而二维冗余小波变换则提供了更灵活的表示形式并可以实现更好的压缩性能。图像小波分解包括以下步骤
MATLAB实现:相关函数如下,具体解释可看MATLAB帮助手册
p[CA,CH,CV,CD]=dwt2(X,’wname’)
或 [CA,CH,CV,CD]=dwt2(X, Lo_D, Hi_D)
:一级二维离散小波变换X=idwt2(CA,CH,CV,CD,’wname’)
或X=idwt2(CA,CH,CV,CD, Lo_D, Hi_D)
:一级二维离散小波逆变换[C,S] = wavedec2(X,N,'wname')
或[C,S] = wavedec2(X,N,Lo_D,Hi_D)
:多级二维小波分解X = waverec2(C,S,'wname')
或X = waverec2(C,S,Lo_R,Hi_R)
:多级二维小波重构A = appcoef2(C,S,'wname',N)
或A = appcoef2(C,S,Lo_R,Hi_R,N)
:提取二维小波分解的低频系数D = detcoef2(O,C,S,N)
或[H,V,D] = detcoef2('all',C,S,N)
:提取二维小波分解的高频系数MATLAB:
Image=imread('cameraman.jpg');
subplot(1,3,1),imshow(Image),title('原图');
grayI=rgb2gray(Image);
[ca1,ch1,cv1,cd1]=dwt2(grayI,'db4');
DWTI1=[wcodemat(ca1,256),wcodemat(ch1,256);wcodemat(cv1,256),wcodemat(cd1,256)];
subplot(1,3,2),imshow(DWTI1/256),title('一级分解');
% imwrite(DWTI2/256,'dwt1.jpg');
result=idwt2(ca1,ch1,cv1,cd1,'db4');
subplot(1,3,3),imshow(result,[]),title('一级重构');
% imwrite(result/256,'redwt1.jpg');
Python:
import cv2
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
# 读入图像
Image = cv2.imread('cameraman.jpg')
# 显示原图
plt.subplot(1, 3, 1)
plt.imshow(cv2.cvtColor(Image, cv2.COLOR_BGR2RGB))
plt.title('原图')
# 灰度化
grayI = cv2.cvtColor(Image, cv2.COLOR_BGR2GRAY)
# 一级小波分解
coeffs = pywt.dwt2(grayI, 'db4')
ca1, (ch1, cv1, cd1) = coeffs
# 拼接小波系数矩阵
DWTI1 = np.vstack((np.hstack((ca1, ch1)), np.hstack((cv1, cd1))))
# 显示一级分解结果
plt.subplot(1, 3, 2)
plt.imshow(DWTI1 / 256)
plt.title('一级分解')
# 一级小波重构
result = pywt.idwt2(coeffs, 'db4')
# 显示一级重构结果
plt.subplot(1, 3, 3)
plt.imshow(result, cmap='gray')
plt.title('一级重构')
# 显示图像
plt.show()
MATLAB:
close all,clear,clc;
Image=imread('cameraman.jpg');
subplot(1,3,1),imshow(Image);
grayI=rgb2gray(Image);
[ca1,ch1,cv1,cd1]=dwt2(grayI,'db4');
DWTI2=[wcodemat(ca1,256),wcodemat(ch1,256);wcodemat(cv1,256),wcodemat(cd1,256)];
subplot(1,3,2),imshow(DWTI2/256);
imwrite(DWTI2/256,'dwt1.jpg');
result=idwt2(ca1,ch1,cv1,cd1,'db4');
subplot(1,3,3),imshow(result,[]);
Image=imread('cameraman.jpg');
grayI=rgb2gray(Image);
[c,s]=wavedec2(grayI,2,'db4');
ca2=appcoef2(c,s,'db4',2);
[ch2,cv2,cd2] = detcoef2('all',c,s,2);
[ch1,cv1,cd1] = detcoef2('all',c,s,1);
ca1=[wcodemat(ca2,256),wcodemat(ch2,256);wcodemat(cv2,256),wcodemat(cd2,256)];
k=s(2,1)*2-s(3,1);
ch1=padarray(ch1,[k k],1,'pre');
cv1=padarray(cv1,[k k],1,'pre');
cd1=padarray(cd1,[k k],1,'pre');
DWTI2=[ca1,wcodemat(ch1,256);wcodemat(cv1,256),wcodemat(cd1,256)];
subplot(1,2,1),imshow(DWTI2/256),title('二级分解');
% imwrite(DWTI2/256,'dwt2.jpg');
result= waverec2(c,s,'db4');
subplot(1,2,2),imshow(result,[]),title('二级重构');
% imwrite(result/256,'redwt2.jpg');
import cv2
import matplotlib.pyplot as plt
import numpy as np
import pywt
# 读入图像
Image = cv2.imread('cameraman.jpg')
# 显示原图
plt.subplot(1, 3, 1)
plt.imshow(cv2.cvtColor(Image, cv2.COLOR_BGR2RGB))
plt.title('原图')
# 灰度化
grayI = cv2.cvtColor(Image, cv2.COLOR_BGR2GRAY)
# 一级小波分解
coeffs1 = pywt.dwt2(grayI, 'db4')
ca1, (ch1, cv1, cd1) = coeffs1
# 拼接小波系数矩阵
DWTI1 = np.vstack((np.hstack((ca1, ch1)), np.hstack((cv1, cd1))))
# 显示一级分解结果
plt.subplot(1, 3, 2)
plt.imshow(DWTI1 / 256)
plt.title('一级分解')
# 保存一级分解结果
cv2.imwrite('dwt1.jpg', DWTI1 / 256)
# 一级小波重构
result1 = pywt.idwt2(coeffs1, 'db4')
# 显示一级重构结果
plt.subplot(1, 3, 3)
plt.imshow(result1, cmap='gray')
plt.title('一级重构')
# 显示图像
plt.show()
# 读入图像
Image = cv2.imread('cameraman.jpg')
# 灰度化
grayI = cv2.cvtColor(Image, cv2.COLOR_BGR2GRAY)
# 二级小波分解
coeffs2 = pywt.wavedec2(grayI, 'db4', level=2)
ca2 = coeffs2[0]
ch2, cv2, cd2 = coeffs2[1:]
# 一级小波分解
coeffs1 = pywt.wavedec2(grayI, 'db4', level=1)
ch1, cv1, cd1 = coeffs1[1:]
# 根据系数大小调整子带尺寸
k = coeffs2[2][0] * 2 - coeffs2[3][0]
ch1 = np.pad(ch1, ((k, 0), (k, 0)), mode='constant', constant_values=1)
cv1 = np.pad(cv1, ((k, 0), (k, 0)), mode='constant', constant_values=1)
cd1 = np.pad(cd1, ((k, 0), (k, 0)), mode='constant', constant_values=1)
# 拼接小波系数矩阵
ca1 = np.vstack((np.hstack((ca2, ch2)), np.hstack((cv2, cd2))))
DWTI2 = np.vstack((np.hstack((ca1, ch1)), np.hstack((cv1, cd1))))
# 显示二级分解结果
plt.subplot(1, 2, 1)
plt.imshow(DWTI2 / 256)
plt.title('二级分解')
# 二级小波重构
result2 = pywt.waverec2(coeffs2, 'db4')
# 显示二级重构结果
plt.subplot(1, 2, 2)
plt.imshow(result2, cmap='gray')
plt.title
小波变换在图像处理中的应用: