(数字图像处理MATLAB+Python)第四章图像正交变换-第四、五节:Radon变换和小波变换

news2024/11/15 6:53:03

文章目录

  • 一:Radon变换
    • (1)Radon变换原理
    • (2)Radon变换实现
    • (3)Radon变换性质
    • (4)Radon变换应用
  • 二:小波变换
    • (1)小波
      • A:定义
      • B:实例
    • (2)一维小波变换
      • A:连续小波变换
      • B:时频特性
      • C:离散小波变换
      • D:正交小波
    • (3)二维小波变换
      • A:定义
      • B:图像小波分解
      • C:程序
        • ①:一级分解及重构
        • ②:二级分解及重构
    • (4)小波变换在图像处理中的应用

一:Radon变换

Radon变换:是一种用于将图像从空间域转换到投影域的数学工具,其基本思想是将图像中每个点的灰度值投影到一组直线上,然后将这些投影合并在一起形成投影域。Radon变换可以用于多种图像处理任务,包括图像重建、特征提取、图像分割等

(1)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变换或反投影

(2)Radon变换实现

MATLAB实现:相关函数如下,具体解释可看MATLAB帮助手册

  • [R,xp]=radon(I,theta):Radon变换是一种用于图像处理中的特征提取的方法,可以用于检测图像中的直线特征
    • I为输入的图像
    • theta为变换角度
    • R为变换后的结果
    • xp为变换后的坐标

程序1:对图像进行指定方向上的Radon变换

  • 首先,代码读取名为’block.bmp’的灰度图像,并将其分别进行0度和45度方向的Radon变换
  • 然后,使用subplot函数将原图像和两个变换后的图像显示在同一张图中,方便比较
  • 最后,代码展示了两个变换后的图像的Radon变换曲线,分别对应0度和45度方向。这些曲线可以用于检测图像中的直线特征
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变换和反变换

  • 首先,它读取了名为 “block.bmp” 的图像,并将其转换为灰度图像
  • 然后,它使用 “radon” 函数计算了图像在 0 到 180 度方向上的 Radon 变换曲线集合,并找到了这些曲线集合中的最大值
  • 接着,它使用 “iradon” 函数对这些曲线进行反变换,从而重建出原始图像
  • 最后,它使用 “subplot” 函数将原始图像、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()

(3)Radon变换性质

线性: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(xdx,ydy)}(θ,s)=R{f(x,y)}(θ,sdxcosθ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)=a1R{f(x,y)}(θ,as)

微分: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 sR{f(x,y)}(θ,s)=yf(x,y)cosθxf(x,y)sinθdx

这个性质意味着可以通过对Radon变换进行微分来计算原始函数的导数

(4)Radon变换应用

Radon变换应用

  • CT图像重建:计算机断层成像(CT)是一种医学成像技术,通过对人体进行X射线扫描来获取其内部结构的三维图像。CT图像可以通过Radon变换进行重建,将CT扫描的投影数据转换为图像数据。这是由于CT扫描是在不同方向上获取的一系列投影图像,而Radon变换可以将这些投影数据转换为图像数据
  • 边缘检测:边缘是图像中最重要的特征之一,因为它们可以提供关于图像中物体的轮廓和形状的信息。Radon变换可以用于检测边缘,因为边缘在投影域中表现出明显的特征。通过检测Radon变换后的图像中的峰值,可以确定原始图像中的边缘位置
  • 特征提取:Radon变换还可以用于提取图像中的其他特征,例如纹理和形状。通过计算Radon变换的角度分布函数,可以获得图像中纹理和形状的信息
  • 图像分割:图像分割是将图像分成若干个互不重叠的区域的过程。Radon变换可以用于图像分割,因为不同区域的投影数据在投影域中表现出不同的特征。通过分析Radon变换后的图像,可以确定原始图像中不同区域的位置

二:小波变换

小波变换:是一种数学工具,用于将信号分解成不同的频率组件。类似于频谱分析,但小波变换可以捕捉到瞬态信号中的时间和频率信息。简单来说,它可以将信号分成多个不同时间长度和频率范围的子信号,以便更好地理解和处理原始信号

(1)小波

A:定义

小波:小波变换中的“小波”指的是一种基本的函数,可以用于将信号分解成不同的频率组件。这些小波函数具有紧凑的支撑和可变的频率和时间分辨率,使得它们可以在时域和频域之间转换,并能够更好地捕捉信号中的局部特征。数学上,小波是一种能够满足一定条件的局部有限能量函数,通常被定义为具有均值为零的波形函数和尺度函数的线性组合。通过将信号与不同尺度和位置的小波函数进行内积运算,可以得到信号在不同频率上的分解系数,进而实现小波变换。设函数 ψ ( 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)=a 1ψ(atb),a,bR,a=0 ψ ( t ) \psi(t) ψ(t)称为基小波或母小波, α \alpha α为伸缩因子, b b b为平移因子, ψ a , b ( t ) \psi_{a,b}(t) ψa,b(t) ψ ( t ) \psi(t) ψ(t)生成的连续小波。小波有如下特点

  • 紧支撑性 小波函数在小范围内波动,能量有限,超出一定范围时,波动幅度迅速衰减,具有速降性
  • 变化性 小波函数随尺度因子的变化而变化
  • K K K阶消失矩 ∫ R t k Ψ ( t ) d t = 0 , k = 0 , 1 , ⋯   , K − 1 \begin{array}{l}\int_{R} t^{k} \Psi(t) d t=0 ,\quad k=0,1, \cdots, K-1\end{array} RtkΨ(t)dt=0,k=0,1,,K1

B:实例

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)= 1100t<1/21/2t<1 其他 ΨH(ω)=ωi12e2+e

在这里插入图片描述

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(eiω0teω02/2)et2/2Ψ(ω)=π1/4[e(ωω0)2/2eω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)=(3 2π1/4)(1t2)et2/2

在这里插入图片描述

(2)一维小波变换

A:连续小波变换

连续小波变换(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可用如下公式表示

  • ψ ( t ) \psi_(t) ψ(t) 表示小波函数的复共轭
  • ψ ∗ ( t ) \psi^*(t) ψ(t) 表示复共轭操作,即将小波函数 ψ ( t ) \psi(t) ψ(t) 中的实部变为负数

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)=a 1+f(t)ψ(atb)dt

CWT 的物理意义是将信号 f ( t ) f(t) f(t) 拆分成一系列不同尺度和不同频率的小波,从而可以更好地分析信号的局部特征

B:时频特性

时频特性:是指小波变换能够提供的时间和频率信息。与傅里叶变换只提供频率信息不同,小波变换在时域和频域都提供了有用的信息

  • 在时域上小波变换提供了信号的局部时间信息:不同尺度的小波函数可以捕获信号的不同频率成分,而不同位置的小波函数可以捕获信号在不同时间段的局部特征。因此,小波系数可以显示信号的短时特征,并且可以用于分析信号的时域局部特性
  • 在频域上小波变换提供了信号的局部频率信息:不同尺度的小波函数可以捕获不同频率范围内的信号成分。在小波系数中,较高频率的小波系数通常与信号的高频成分相关联,而较低频率的小波系数通常与信号的低频成分相关联。因此,小波系数可以用于分析信号的频域局部特性

分析小波 ψ a , b ( t ) \psi_{a,b}(t) ψa,b(t)时、频窗中心和时,频窗半径,可得

  • 时窗中心 t ∗ = a t ψ ∗ + b t^{*}=at^{*}_{\psi}+b t=atψ+b
  • 时窗半径 Δ t = a Δ t ψ \Delta t=a \Delta t_{\psi} Δt=aΔtψ
  • 频窗中心 w ∗ = 1 a w ψ ∗ w^{*}=\frac{1}{a}w^{*}_{\psi} w=a1wψ
  • 频窗半径 Δ w = 1 a Δ w ψ \Delta w=\frac{1}{a}\Delta w_{\psi} Δw=a1Δwψ

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} tω=4aΔtψa1Δωψ=tψΔωψ

对于固定的 b b b,当 a > 1 a>1 a>1时,随着 a a a的增大,时窗增宽,频窗变窄,但窗口面积不变

小波变换分析信号具有自适应的时频窗口

  • 检测高频分量,尺度参数 a > 0 a>0 a>0变小,时窗变窄,频窗增高, 主频 ω ∗ ω^{*} ω变大
  • 检测低频特性,尺度参数 a > 0 a>0 a>0增大,时窗变宽,频窗降低, 主频 ω ∗ ω^{*} ω变小

在这里插入图片描述

C:离散小波变换

离散小波变换(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可以用以下公式表示

  • ψ j , k [ n ] \psi_{j,k}[n] ψj,k[n] ϕ j , k [ n ] \phi_{j,k}[n] ϕj,k[n] 分别表示小波函数和尺度函数的离散缩放和平移版本,可以通过在连续版本中选取适当的尺度和位移进行离散化得到

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=0N1x[n]ψj,k[n]dj[k]=x[n],ϕj,k[n]=n=0N1x[n]ϕj,k[n]

DWT 的物理意义与 CWT 类似,是将信号 x [ n ] x[n] x[n] 拆分成一组不同尺度和不同位置(或频率)的小波系数和近似系数,从而可以更好地分析信号的局部特征。与 CWT 不同的是,DWT 使用离散信号和离散小波函数进行计算,因此可以在计算机上高效地实现

D:正交小波

正交小波(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=0N1x[n]ψj,k[n]dj[k]=x[n],ϕj,k[n]=n=0N1x[n]ϕj,k[n]

其中, ψ j , k [ n ] \psi_{j,k}[n] ψj,k[n] ϕ j , k [ n ] \phi_{j,k}[n] ϕj,k[n] 是正交小波函数,满足以下正交条件

  • δ i , j \delta_{i,j} δi,j i = j i=j i=j 时为 1,否则为 0。这些正交条件保证了正交小波基的正交性和归一性

⟨ ψ 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 和其他小波变换的小波基更容易实现和计算,并且在压缩和信号处理应用中被广泛使用

(3)二维小波变换

A:定义

二维小波变换(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=0Jkwj,k(x,y)+aJ(x,y)

B:图像小波分解

图像小波分解:是将二维图像进行小波变换以得到其不同尺度和方向上的小波系数和近似系数的过程。这种分解提供了一种多分辨率分析图像和识别局部变化的方法。图像小波分解可以使用二维小波变换(如二维离散小波变换或二维冗余小波变换)来实现。通常情况下,二维离散小波变换速度较快且存储需求较小,而二维冗余小波变换则提供了更灵活的表示形式并可以实现更好的压缩性能。图像小波分解包括以下步骤

  • 对图像进行二维小波变换,得到每个尺度和方向上的小波系数和近似系数
  • 对小波系数进行阈值处理,去除噪声或其他不需要的高频部分。可以使用各种阈值方法,如硬阈值、软阈值或自适应阈值
  • 使用小波系数和近似系数重构图像

C:程序

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

(4)小波变换在图像处理中的应用

小波变换在图像处理中的应用

  • 滤波和噪声去除:小波变换可以将信号分解为不同尺度的频率成分,因此可以通过选择不同的小波基函数来对图像进行频域滤波。此外,小波变换还可以将噪声与信号分离,因此可以使用小波域的软或硬阈值来去除噪声
  • 边缘检测:由于小波变换可以提供不同尺度和方向的频率信息,因此可以通过检测小波系数的变化来实现边缘检测。例如,可以通过选择具有高方向选择性的小波基函数来增强边缘信息
  • 压缩编码:小波变换可以将信号分解为多个子带,其中一些子带可能具有较低的能量。因此,在压缩编码中,可以选择丢弃这些低能量子带,从而实现压缩编码。此外,小波变换还可以将图像分解为不同分辨率的子带,从而可以根据需要选择不同的分辨率子带来进行编码
  • 图像增强:小波变换可以通过增加或减少小波系数来实现图像增强。例如,可以通过增加高频小波系数的值来增强图像的细节,或者通过减少低频小波系数的值来降低图像的模糊度
  • 图像融合:小波变换可以将多个图像分解为不同的频率子带,因此可以将来自不同图像的不同子带进行融合。例如,可以将两个具有不同频率特征的图像的高频子带进行融合,以实现更好的细节保留

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/440716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PyQt】PyQt5进阶——串口上位机及实时数据显示

文章目录 0 前期教程1 前言2 串口部分——QtSerialPort3 绘图部分3.1 QCustomPlot3.2 QtChart3.3 QWT3.4 Qt Designer中如何使用 参考链接 0 前期教程 【Python】PyQt5入门 1 前言 最近在用PyQt做一个串口上位机&#xff0c;需要串口通信和实时显示曲线。这里简单记录一些关键…

【已解决】最简单便捷的方法将多html合并为pdf

一、单页面转pdf 可以使用pdf24&#xff0c;https://tools.pdf24.org/zh/webpage-to-pdf。 也可以直接打印 二、多页面转pdf&#xff08;wkhtmltopdf方案&#xff09; 1、安装配置pdfkit&#xff1a;[https://blog.csdn.net/xc_zhou/article/details/80952168(https://blog.…

Charles安装及使用教程

一. 简介及安装 一、charles的使用 1.1 charles的说明 Charles其实是一款代理服务器&#xff0c;通过过将自己设置成系统&#xff08;电脑或者浏览器&#xff09;的网络访问代理服务器&#xff0c;然后截取请求和请求结果达到分析抓包的目的。该软件是用Java写的&#xff0…

Nestjs全网最佳翻译-概况-管道-Pipes

管道 带上装饰器 Injectable() 并实现了 PipeTransform 接口的类&#xff0c;就是管道。 管道有 2 个典型的应用场景&#xff1a; 数值转换&#xff1a;将输入的参数转换成目标类型&#xff0c;例如&#xff0c;string to number。 数值校验&#xff1a;对输入的参数进行校验…

cocos creator v3.6版本使用Intersection2D模块的circleCircle方法

在cocos creator v3版本中Intersection2D模块的circleCircle方法可以用来检测两个圆形是否相交 该方法可以实现的功能有&#xff1a; cocos creator吸铁石实现、cocos creator物体在固定位置吸附、cocos creator物体吸附效果、cocos creator吸铁石实现、cocos creator两个物体时…

统计软件与数据分析Lesson9----爬虫解析库Beautiful Soup

统计软件与数据分析Lesson9----爬虫解析库Beautiful Soup知识点总结 1.requests 模块1.1 查看requests功能函数1.2 发送请求1.3 传递URL参数1.4 获取响应内容 2.Beautiful Soup模块2.1 解析器2.2 对象类型2.2.1 Beautiful Soup2.2.2 标签Tag2.2.3 可遍历的字符串NavigableStrin…

Java——包含min函数的栈

题目链接 牛客在线oj题——包含min函数的栈 题目描述 定义栈的数据结构&#xff0c;请在该类型中实现一个能够得到栈中所含最小元素的 min 函数&#xff0c;输入操作时保证 pop、top 和 min 函数操作时&#xff0c;栈中一定有元素。 此栈包含的方法有&#xff1a; push(va…

SRv6实践项目(六):控制面完成链路和主机的发现

在本次实验中&#xff0c;我们需要利用ONOS完成对数据面的控制 1.使能packet的IO功能&#xff0c;验证链路发现 main.p4提供了和P4Runtime的通信的消息的定义格式&#xff0c;分别是PacketIn和PacketOut&#xff0c;他们都被加上了一个注解&#xff0c;表示这是一个控制器交互…

c++篇---缺省参数

文章目录 一、缺省参数概念二、缺省参数实例三、缺省参数声明和定义四、全缺省和半缺省 一、缺省参数概念 缺省参数 在调用该函数时&#xff0c;如果实参没有指定传内容&#xff0c;那么在函数中用形参时&#xff0c;就采用为函数参数指定的这个缺省值 但是如果在调用该函数时…

【Qt 实现一个画板,基于QWidget,可以绘制直线和矩形】

【Qt 实现一个画板&#xff0c;基于QWidget,可以绘制直线和矩形】 简介效果展示源码mainwindow.hmainwindow.cpppainterwidget.hpainterwidget.cppshape.h &#xff08;管理&#xff09;line.hline.cpprect.hrect.cpp 结 &#x1f649;&#x1f649;更多内容 点击&#xff1a;Q…

力扣sql中等篇练习(七)

力扣sql中等篇练习(七) 1 查询活跃业务 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below # 先求出所有业务的平均发生次数 SELECT t2.business_id FROM (SELECT e.*,IF(e.occurences>t1.A_NUM,1,0) tota…

【C++】vector的简化模拟实现

文章目录 1. 主要结构2. 默认成员函数3. 迭代器4. 容量相关1. size和capacity2. reserve3. resize 5. 数据访问6. 数据修改1. push_back2.pop_back3. insert4.erase5.swap6.clear 1. 主要结构 参照SGI版本的vector实现&#xff0c;使用三个指针来维护这样一段内存空间 templa…

ACL访问控制列表简介和配置演示

一.ACL功能和特点 1.功能 2.特点 二.ACL种类 1.基础ACL&#xff1a; 2.增强ACL&#xff1a; 三.配置演示 1.基础ACL&#xff1a; 2.增强ACL&#xff1a; 一.ACL功能和特点 1.功能 对感兴趣的路由 (控制层面)进行设置策略 对感兴趣的流量 (数据层面)进行设置策略 2.…

Activity启动模式的生命周期

四种启动模式 1.standard android:launchMode"standard" 默认的标准启动模式&#xff0c;每次启动当前Activity&#xff0c;任务栈中都添加一个当前Activity的实例。按返回键时&#xff0c;表现出退出多个当前Activity的现象。 MainActivityOne和MainActivityTwo都…

DPText-DETR原理及源码解读

一、原理 发展脉络&#xff1a;DETR是FACEBOOK基于transformer做检测开山之作&#xff0c;Deformable DETR加速收敛并对小目标改进&#xff0c;TESTR实现了端到端的文本检测识别&#xff0c;DPText-DETR做了精度更高的文字检测。 DETR 2020 FACEBOOK&#xff1a; 原理 https://…

c/c++:函数的作用,分类,随机数,函数定义,调用,申明,exit()函数,多文件编程,防止头文件重复

c/c&#xff1a;函数的作用&#xff0c;分类&#xff0c;随机数&#xff0c;函数定义&#xff0c;调用&#xff0c;申明&#xff0c;exit()函数&#xff0c;多文件编程&#xff0c;防止头文件重复 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大…

Spring启动及Bean实例化过程来看经典扩展接口

目录 一、Spring启动及Bean实例化过程 二、分析其对应经典扩展接口 三、对开发的指导意义 备注&#xff1a;以下总结只是一些基本的总结思路&#xff0c;具体每个扩展接口的应用后续进行分析总结。 一、Spring启动及Bean实例化过程 Spring启动及Bean实例化的过程&#xff0…

6 款顶级 Android 数据恢复软件列表

数据丢失可能会扰乱您的个人/企业生活&#xff0c;如果手动完成&#xff0c;可能很难恢复丢失的数据。Android 数据恢复软件是解决此问题的完美解决方案。这些工具可帮助您快速轻松地从 Android 设备恢复丢失的数据。它可以帮助您恢复照片、视频、笔记、联系人等。 我研究了市…

1. C++使用Thread类创建多线程的三种方式

1. 说明 使用Thread类创建线程对象的同时就会立刻启动线程&#xff0c;线程启动之后就要明确是等待线程结束&#xff08;join&#xff09;还是让其自主运行&#xff08;detach&#xff09;&#xff0c;如果在线程销毁前还未明确上面的问题&#xff0c;程序就会报错。一般都会选…

webserve简介

目录 I/O分类I/O模型阻塞blocking非阻塞 non-blocking&#xff08;NIO&#xff09;IO复用信号驱动异步 webServerHTTP简介概述工作原理HTTP请求头格式HTTP请求方法HTTP状态码 服务器编程基本框架两种高效的事件处理模式Reactor模式Proactor模拟 Proactor 模式 线程池 I/O分类 …