2014-10-31 16:50:38 adong76 阅读数 3921


参考:

http://media.cs.tsinghua.edu.cn/~ahz/digitalimageprocess/chapter12/chapt12_ahz.htm


Matlab 小波变换

lean图像的行列应该满足2的幂次方

img  =  imread('lena.jpg');
img =rgb2gray(img);
img = double(img);

[ca1 ch1,cv1,cd1] = dwt2(img,'haar');
figure;
imshow([uint8(ca1),uint8(ch1);uint8(cv1),uint8(cd1)]);
title('first wavelet decomposition');

[ca2 ch2,cv2,cd2] = dwt2(ca1,'haar');
figure;
imshow([uint8(ca2),uint8(ch2);uint8(cv2),uint8(cd2)]);
title('second wavelet decomposition');

% restruct img
img_ca1 =  idwt2(ca2,ch2,cv2,cd2,'haar');
img_re = idwt2(img_ca1,ch1,cv1,cd1,'haar');
figure;
imshow( uint8(img_re));
title('wavelet restruct');

2015-11-13 12:35:00 u010364639 阅读数 4721

应用小波变换对图像处理

图像金字塔,每一层的像素数为(2^i,2^j):图像金字塔基本操作 对一张图像不断的模糊之后向下采样,得到不同分辨率的图像,同时每次得到的 新的图像宽与高是原来图像的1/2,http://baike.baidu.com/link?url=uxUdGHjdQPia38hy6sElpAwpjkiyX0tUx0DH-I6JC2LrEWIG9ov8WKibm29zz60fiAE3rAiP0Jzd-YDDuk_VzK,

Matlab版本

clear all;
close all;
clc;
tic;
img=double(imread('yyt.jpg'));
img=img(:,:,1);
img=img(1:512,1:512);
[m n]=size(img);
[LL LH HL HH]=haar_dwt2D(img);
img=[LL LH;HL HH];
imgn=zeros(m,n);
for i=0:m/2:m/2
    for j=0:n/2:n/2
        [LL LH HL HH]=haar_dwt2D(img(i+1:i+m/2,j+1:j+n/2)); %对一层分解后的四个图像分别再分解
        imgn(i+1:i+m/2,j+1:j+n/2)=[LL LH;HL HH];  
    end
end
toc;

imshow(imgn)



function [LL LH HL HH]=haar_dwt2D(img)
    [m n]=size(img);
    for i=1:m       %每一行进行分解
        [L H]=haar_dwt(img(i,:));
        img(i,:)=[L H];
    end
    for j=1:n       %每一列进行分解
       [L H]=haar_dwt(img(:,j));
       img(:,j)=[L H];
    end
    %本来分解不应该加mat2gray的,不过为了有好的显示效果就加上了
    LL=mat2gray(img(1:m/2,1:n/2));          %行列都是低频  
    LH=mat2gray(img(1:m/2,n/2+1:n));        %行低频列高频
    HL=mat2gray(img(m/2+1:m,1:n/2));        %行高频列低频  实现图像矩阵的归一化操作
    HH=mat2gray(img(m/2+1:m,n/2+1:n));      %行列都是高频
    
end



function [L H]=haar_dwt(f) %显然,我没有做边界处理,图片最好是2^n*2^n型的
    n=length(f);
    n=n/2;
    L=zeros(1,n);   %低频分量
    H=zeros(1,n);   %高频分量
    for i=1:n
        L(i)=(f(2*i-1)+f(2*i))/sqrt(2);
        H(i)=(f(2*i-1)-f(2*i))/sqrt(2);
    end
    
end






OPENCV版本

#include<stdio.h>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
// 二维离散小波变换(单通道浮点图像)
void DWT(IplImage *pImage, int nLayer)
{
// 执行条件
if (pImage)
{
if (pImage->nChannels == 1 && pImage->depth == IPL_DEPTH_32F && ((pImage->width >> nLayer) << nLayer) == pImage->width && ((pImage->height >> nLayer) << nLayer) == pImage->height)
//图片为通道,单精度浮点数
{
int i, x, y, n;
float fValue = 0;
 float fRadius  = sqrt(2.0f);
 int nWidth = pImage->width;
 int nHeight  = pImage->height;
 int nHalfW = nWidth / 2;
 int nHalfH = nHeight / 2;
 float **pData  = new float*[pImage->height];
 float  *pRow = new float[pImage->width];
 float  *pColumn  = new float[pImage->height];
 for (i = 0; i < pImage->height; i++)
 {
 pData[i] = (float*) (pImage->imageData + pImage->widthStep * i);
 }
 // 多层小波变换
 for (n = 0; n < nLayer; n++, nWidth /= 2, nHeight /= 2, nHalfW /= 2, nHalfH /= 2)
 {
 // 水平变换
 for (y = 0; y < nHeight; y++)
 {
 // 奇偶分离
 memcpy(pRow, pData[y], sizeof(float) * nWidth);
 for (i = 0; i < nHalfW; i++)
 {
 x = i * 2;
 pData[y][i] = pRow[x];
 pData[y][nHalfW + i] = pRow[x + 1];
 }
 // 提升小波变换
 for (i = 0; i < nHalfW - 1; i++)
 {
 fValue = (pData[y][i] + pData[y][i + 1]) / 2;
 pData[y][nHalfW + i] -= fValue;
 }
 fValue = (pData[y][nHalfW - 1] + pData[y][nHalfW - 2]) / 2;
 pData[y][nWidth - 1] -= fValue;
 fValue = (pData[y][nHalfW] + pData[y][nHalfW + 1]) / 4;
pData[y][0] += fValue;
for (i = 1; i < nHalfW; i++)
{
 fValue = (pData[y][nHalfW + i] + pData[y][nHalfW + i - 1]) / 4;
 pData[y][i] += fValue;
}
// 频带系数
for (i = 0; i < nHalfW; i++)
{
 pData[y][i] *= fRadius;
 pData[y][nHalfW + i] /= fRadius;
}
 }
 // 垂直变换
 for (x = 0; x < nWidth; x++)
 {
 // 奇偶分离
 for (i = 0; i < nHalfH; i++)
 {
 y = i * 2;
 pColumn[i] = pData[y][x];
 pColumn[nHalfH + i] = pData[y + 1][x];
 }
 for (i = 0; i < nHeight; i++)
 {
 pData[i][x] = pColumn[i];
 }
 // 提升小波变换
 for (i = 0; i < nHalfH - 1; i++)
{
 fValue = (pData[i][x] + pData[i + 1][x]) / 2;
 pData[nHalfH + i][x] -= fValue;
}
fValue = (pData[nHalfH - 1][x] + pData[nHalfH - 2][x]) / 2;
pData[nHeight - 1][x] -= fValue;
fValue = (pData[nHalfH][x] + pData[nHalfH + 1][x]) / 4;
pData[0][x] += fValue;
for (i = 1; i < nHalfH; i++)
{
 fValue = (pData[nHalfH + i][x] + pData[nHalfH + i - 1][x]) / 4;
 pData[i][x] += fValue;
}
// 频带系数
for (i = 0; i < nHalfH; i++)
{
 pData[i][x] *= fRadius;
 pData[nHalfH + i][x] /= fRadius;
}
 }
 }
 delete[] pData;
 delete[] pRow;
 delete[] pColumn;
}
}
}

// 二维离散小波恢复(单通道浮点图像)
void IDWT(IplImage *pImage, int nLayer)
{
 // 执行条件
 if (pImage)
 {
 if (pImage->nChannels == 1 && pImage->depth == IPL_DEPTH_32F &&((pImage->width >> nLayer) << nLayer) == pImage->width && ((pImage->height >> nLayer) << nLayer) == pImage->height)
{
 int i, x, y, n;
 float fValue = 0;
float fRadius  = sqrt(2.0f);
int nWidth = pImage->width >> (nLayer - 1);
int nHeight  = pImage->height >> (nLayer - 1);
int nHalfW = nWidth / 2;
int nHalfH = nHeight / 2;
float **pData  = new float*[pImage->height];
float *pRow = new float[pImage->width];
float *pColumn = new float[pImage->height];
for (i = 0; i < pImage->height; i++)
{
 pData[i] = (float*) (pImage->imageData + pImage->widthStep * i);
}
// 多层小波恢复
 for (n = 0; n < nLayer; n++, nWidth *= 2, nHeight *= 2, nHalfW *= 2, nHalfH *= 2)
 {
 // 垂直恢复
 for (x = 0; x < nWidth; x++)
 {
 // 频带系数
 for (i = 0; i < nHalfH; i++)
{
 pData[i][x] /= fRadius;
 pData[nHalfH + i][x] *= fRadius;
}
// 提升小波恢复
fValue = (pData[nHalfH][x] + pData[nHalfH + 1][x]) / 4;
pData[0][x] -= fValue;
for (i = 1; i < nHalfH; i++)
{
 fValue = (pData[nHalfH + i][x] + pData[nHalfH + i - 1][x]) / 4;
 pData[i][x] -= fValue;
}
for (i = 0; i < nHalfH - 1; i++)
{
 fValue = (pData[i][x] + pData[i + 1][x]) / 2;
 pData[nHalfH + i][x] += fValue;
}
fValue = (pData[nHalfH - 1][x] + pData[nHalfH - 2][x]) / 2;
pData[nHeight - 1][x] += fValue;
 // 奇偶合并
 for (i = 0; i < nHalfH; i++)
{
 y = i * 2;
 pColumn[y] = pData[i][x];
 pColumn[y + 1] = pData[nHalfH + i][x];
}
 for (i = 0; i < nHeight; i++)
{
 pData[i][x] = pColumn[i];
}
}
 // 水平恢复
for (y = 0; y < nHeight; y++)
{
// 频带系数
for (i = 0; i < nHalfW; i++)
{
pData[y][i] /= fRadius;
pData[y][nHalfW + i] *= fRadius;
}
// 提升小波恢复
fValue = (pData[y][nHalfW] + pData[y][nHalfW + 1]) / 4;
pData[y][0] -= fValue;
for (i = 1; i < nHalfW; i++)
{
fValue = (pData[y][nHalfW + i] + pData[y][nHalfW + i - 1]) / 4;
pData[y][i] -= fValue;
}
for (i = 0; i < nHalfW - 1; i++)
{
fValue = (pData[y][i] + pData[y][i + 1]) / 2;
pData[y][nHalfW + i] += fValue;
}
fValue = (pData[y][nHalfW - 1] + pData[y][nHalfW - 2]) / 2;
pData[y][nWidth - 1] += fValue;
// 奇偶合并
for (i = 0; i < nHalfW; i++)
{
x = i * 2;
pRow[x] = pData[y][i];
pRow[x + 1] = pData[y][nHalfW + i];
}
memcpy(pData[y], pRow, sizeof(float) * nWidth);
}
}
delete[] pData;
delete[] pRow;
delete[] pColumn;
}
}
}



int main( int argc, char** argv ) 
{
// 小波变换层数
int nLayer = 1;
// 输入彩色图像
IplImage *pSrc = cvLoadImage("G:\\me.jpg", CV_LOAD_IMAGE_COLOR);
// 计算小波图象大小
CvSize size = cvGetSize(pSrc);
if ((pSrc->width >> nLayer) << nLayer != pSrc->width)
{
size.width = ((pSrc->width >> nLayer) + 1) << nLayer;
}
if ((pSrc->height >> nLayer) << nLayer != pSrc->height)
{
size.height = ((pSrc->height >> nLayer) + 1) << nLayer;
}
// 创建小波图象
IplImage *pWavelet = cvCreateImage(size, IPL_DEPTH_32F, pSrc->nChannels);
if (pWavelet)
{
// 小波图象赋值
cvSetImageROI(pWavelet, cvRect(0, 0, pSrc->width, pSrc->height));
cvConvertScale(pSrc, pWavelet, 1, -128);
cvResetImageROI(pWavelet);
// 彩色图像小波变换
IplImage *pImage = cvCreateImage(cvGetSize(pWavelet), IPL_DEPTH_32F, 1);
if (pImage)
{
for (int i = 1; i <= pWavelet->nChannels; i++)
{
cvSetImageCOI(pWavelet, i);
cvCopy(pWavelet, pImage, NULL);
// 二维离散小波变换
DWT(pImage, nLayer);
// 二维离散小波恢复
// IDWT(pImage, nLayer);
cvCopy(pImage, pWavelet, NULL);
}
cvSetImageCOI(pWavelet, 0);
cvReleaseImage(&pImage);
}
// 小波变换图象
cvSetImageROI(pWavelet, cvRect(0, 0, pSrc->width, pSrc->height));
cvConvertScale(pWavelet, pSrc, 1, 128);
cvResetImageROI(pWavelet); // 本行代码有点多余,但有利用养成良好的编程习惯
cvReleaseImage(&pWavelet);
}
// 显示图像pSrc

cvNamedWindow("pSrc", 1);   
cvShowImage( "pSrc", pSrc);  
cvWaitKey(0); //等待按键   
cvDestroyWindow( "pSrc" );  
cvReleaseImage(&pSrc);
return 0;
}


2017-10-24 16:15:56 HelloZEX 阅读数 9199

内容完全转载:

小波理论的基本概念及概述(第二版)

欢迎阅读此份关于小波变换的入门教程。小波变换是一个相对较新的概念(其出现大约是在20世纪80年代),但是有关于它的文章和书籍却不少。这其中大部分都是由数学专业人士写给其他同行看的,不过,仍然有大量数学专家不知道其他同行们讨论的是什么(我的一个数学教授就承认过)。换言之,大多数介绍小波变换的文献对那些小波新手们来说用处不大(此为个人观点)。

我刚开始接触小波变换的时候,曾经为了搞清楚小波变换这个这个神奇的世界到底发生了什么而苦苦挣扎,因为在这个领域的入门教材非常少。因而,我决定为新手们写一份教程。我自认为也是一个新手,必须承认,我也有很多理论细节没有弄清楚。不过,就工程应用而言,我认为弄清楚所有的理论细节大可不必。

这份教程将试着介绍一些小波理论的基本原理,并且不会给出这些原理和相关公式的证明,因为这份教程的目标读者暂时还不需要知道这些。不过,感兴趣的读者可以参阅引用的文献以便了解更深入的内容。

此篇文档假定你没有任何相关知识背景。要是有的话,请跳过以下内容,这些对你而言可能都是显然的。

要是你发现教程里有任何前后不协调或不正确的内容,请联系我。我很乐于收到关于教程的任何评论。

变换…啥?

首先,为什么需要变换,或者说到底什么是变换?

为了获取在原始信号中不易获得的信息,往往要对信号进行数学变换。以下篇幅均假定时域内信号为原始信号,经过数学变换后的信号为处理信号。

可用的变换有很多种,其中,傅立叶变换大概是目前最流行的。

实际中,多数信号的原始形式都是时域信号,也即不论如何测得的,信号总是关于时间的函数。换言之,绘制信号的图形时,一个轴代表时间(自变量),另一轴代表信号幅值(因变量)。在时域内作图,便可得到信号的时-幅表示。在多数信号处理有关的应用场景中,这种表示并不是最好的表示。很多时候,最易分辨的信息往往隐藏在信号的频率成分中。信号的频谱是指信号中的频率分量(或谱分量),其表示的是信号中存在哪些频率成分。

直觉上,我们都知道频率是跟事物的变化率有关的量。如果一样东西(专业术语应该为数学量或物理量)变化得很快,则它的频率就高;变换得慢,或者说变化得很平滑,则它的频率就低。如果该量保持不变,则其频率为零,或者说没有频率。例如,日报的频率就比月刊高(因为日报出版快)。

频率用“循环次数/秒”,或者用更常用的“赫兹”来衡量。例如,在美国,日常生活中所用交流电的频率是60Hz(世界上其他一些地区是50Hz)。这意味着,如果我们想要绘制电流变化曲线,得到的将是1秒内往复50次的正弦波。看下面几张图,第一幅图中是频率是3Hz的正弦信号,第二幅是频率10Hz的,第三幅则是频率50Hz,对比下吧。

那么怎样测量频率,或者说怎样得到一个信号中所含的频率成分呢?答案是傅立叶变换(FT)。对时域信号做傅立叶变换,就会得到信号的频谱。也就是说,此时我们绘制信号图形的话,一个轴是频率,另一个轴是频率分量的幅值。所得图像将告诉我们信号中包含的各种频率成分分别有多少。

频率轴从零开始,直至正无穷。每个频率都对应一个幅值。例如,如果我们对房间所用的电流信号做傅立叶变换,频谱图中在50Hz处会出现尖峰,其它频率对应的幅值则为零,因为信号中只包含了50Hz的频率分量。然而,很少有信号的傅立叶变换是如此简单的。实际中的信号大都包含多个频率分量。50Hz信号的傅立叶变换如下图所示:

图 1.4 50 Hz 信号的傅里叶变换

注意,图1.4给出了上下两张图,下图显示的其实是上图的前半部分。这是因为实值信号的频谱图是左右对称的,这点暂时不理解也无妨。上图能够看出这一特性。不过,由于后一半对称部分只不过是前一半图形的镜像,并未提供额外信息,因此,这部分经常不画出来。下文中出现的多数频谱图,我将只绘出前半部分。

为什么需要频率信息?

通常,一些在时域中不易看出的信息很容易在频域中观察到。

看一个生物信号的例子。设想我们正在观察一个心电信号。心脏专家一般都熟知典型的健康人心电图的形状。与这些典型形状存在显著偏差往往是疾病的征兆。

一些病征在时域表示的心电信号中并不明显。过去,心脏专家一般用记录在磁带上的时域心电图来分析心电信号。最近,新型的数字心电记录仪/分析仪可以利用心电图的频域信息来判断病征是否存在。对心电信号的频率成分进行分析能使他们更容易的诊断病情。

上面只是一个说明频率成分作用的简单例子。当前,傅立叶变换已经被用于不同的领域,涵盖了工程领域的各个分支。

尽管傅立叶变换可能是使用最多的(特别在电气工程领域),但它并不是唯一的变换。许多其他的变换也常为工程师和数学家们所用,如希尔伯特变换、短时傅立叶变换(下文会有更多介绍)、魏格纳分布和雷登变换,当然还有教程的主角——小波变换,而这些也仅是工程师和数学家们所用变换中的一小部分。每种变换都有其应用领域,也有其优缺点,小波变换也不例外。

为了更好地理解为什么需要小波变换,我们需要更深刻地认识傅立叶变换。傅立叶变换是一种可逆变换,即它允许原始信号和处理信号之间互相变换。但是,在任意时刻只有一种信号形式是可用的。也就是说,在时域信号中不包含频率信息,而经过傅里叶变换后的信号则不包含任何时间信息。说到这,头脑里很自然地会提出一个问题,为什么需要同时知道时间和频率信息呢?

我们马上就会知道,答案是具体问题具体分析。回想一下,傅立叶变换给出了信号中的频率信息,即它可以告诉我们原始信号包含各个频率成分到底有多少,但是并未告诉我们某个频率信号何时出现。对于所谓的平稳信号,这些信息并不需要。

让我们进一步探讨一下平稳的概念,因为它在信号分析中具有重要意义。如果信号中的频率分量不随时间变化,则称这类信号为平稳信号。平稳信号中的频率分量一直保持不变,那么,自然无需知道频率分量是何时出现的,因为所有的频率分量出现在信号的每一刻!!!

以如下信号为例:

\( x(t)=cos(2picdot10t)+cos(2picdot25t)+cos(2picdot50t)+cos(2picdot100t) \)

这是个平稳信号,因为任何时刻都包含10,25,50和100Hz的频率。信号的图形如下:

图 1.5

下图为它的傅立叶变换:

图 1.6

图1.6中的上图是图1.5中信号的频谱图,下图为上图的放大,给出了我们关注部分的频率范围。注意四个频率10,25,50和100Hz的频谱分量。

与图1.5中的信号不同,下图所示的就是一个非平稳信号。图1.7中,信号的频率随着时间一直在变化,这种信号称为线性调频信号,是一种非平稳信号。

图 1.7

让我们再看一个例子,图1.8绘出的是一个包含四个频率分量的信号,它们分别在不同时刻出现,因此这是一个非平稳信号。0至300ms时是100Hz的正弦波,300-600ms时则是50Hz的正弦波,600-800ms时是25Hz的正弦波,最后的200ms内是10Hz正弦波。

图 1.8

下图是它的傅立叶变换:

图 1.9

不要介怀图中的那些小波纹,这是由信号中频率突变引起的,在这里并不重要。注意,高频分量的幅值比低频分量大,这是因为高频信号(300ms)比低频信号(200ms)持续时间更长。(频率分量幅值的精确值并不重要)。

除了那些波纹,图中的一切看起来都是正确的。频谱图有四个尖峰,对应原始信号中的四个频率分量,幅值也差不多是合理的…没错

错!

当然了,也不全错,但也不全对。对图1.5中的信号,考虑如下问题:各个频率分量都是在什么时刻出现的?

答案是

在所有时刻!还记得平稳信号吗,所有频率分量在信号的整个持续时间内一直存在。10Hz的频率分量一直存在,50Hz的分量也是,100Hz的分量依然是。

现在,让我们来考虑一下图1.7或1.8中的非平稳信号。

各个频率分量都是在什么时刻出现的?

对于图1.8中的信号,我们知道,第一个时间区间内出现的是频率最高的分量,最后一个时间区间内出现的是频率最低的分量。图1.7中,信号的频率成分随时间连续变化,因此,对这些信号来说,各个频率分量并未在所有时刻一直存在。

现在,对比图1.6和1.9,两幅频谱图的相似之处是显而易见的。两幅图中都包含了四个相同的频率分量,即10,25,50和100Hz。除了一些小波纹和两幅图中各频率分量的幅值(这些幅值可以做归一化处理)有所区别,两幅频谱图几乎是相同的,尽管两个信号在时域内差别很大。两个信号都包含了相同的频率分量,但是前者中,各频率分量存在于信号的整个周期内,而后者的频率分量则分别存在于不同的时间区间内出现。那么,为什么两个完全不同的信号,频谱图形这么相像呢?回想一下,傅立叶变换仅仅给出了信号的频谱分量,但却没有给出任何关于这些分量出现时间的信息。因此,傅立叶变换并不适用于分析非平稳信号,但有一个例外:

如果我们仅关心信号中包含哪些频率分量而不关心它们出现的时间,傅立叶变换仍可用于处理非平稳信号。但是,如果我们想知道频率分量出现的确切时间(区间),傅立叶变换就不再适用了。

实际应用中,由于平稳的和非平稳的信号都很多,很那将二者区分开来。例如,几乎所有的生物信号都是非平稳的,包括广为人知的心电图(ECG)、脑电图(EEG)和肌电图(EMG)。

再次注意,傅立叶变换仅能给出信号中包含哪些频率分量,仅此而已。

当需要对频谱分量进行时间定位时,我们就需要一个可以给出信号时-频表示的变换。

终极解决方案:小波变换

小波变换是这种类型的变换,它提供了信号的时频表示(还有一些变换也可给出这些信息,如短时傅立叶变化,魏格纳分布等等)。

特定的频谱分量在特定的时刻出现往往具有特殊的意义。这些情况下,了解这些特定的频谱分量出现的时间区间会非常有用。例如,在脑电图中,事件相关电位的延迟时间需要特别注意(事件相关电位是指大脑对某一特定刺激的反应,类似闪光灯,延迟时间是从接受刺激到作出反应之间耗费的时间)。

小波变换能够同时提供时间和频率信息,因此给出了信号的一种时频表示。

小波变换到底是如何奏效的完全是另外一个故事,需要在理解了短时傅立叶变换(STFT)之后再做解释。小波变换的出现是为了改进短时傅立叶变换(STFT)。STFT将在教程的第II部分详细阐述。现在暂时可以认为小波变换是为了解决STFT中遇到的有关分辨率的问题而发展起来的。

为了长话短说,我们略过时域信号处理中有关于各种高通和低通滤波器的相关内容。这些滤波器用来过滤信号中的低频和高频部分分量。这类方法被重复实施,每次都会从信号中滤除一些频率分量。

这里解释一下滤波是如何奏效的:设想我们有一个信号,其中频率最高的分量为1000Hz。第一步,我们通过高通和低通滤波器把信号分成两个信号(滤波器必须满足某些特定的条件,即容许条件),结果得到了同一信号的两个部分,0-500Hz的部分(低通部分)和500-1000Hz的部分(高通部分)。

然后,我们可以拿其中一部分(通常是低通部分)或者二部分,然后对每一部分继续进行相同的操作。这个过程叫做分解。

假设我们拿低频部分做了处理,现在我们就有了3组数据,分别为信号在0-250Hz,250-500Hz和500-1000Hz的部分。

然后再对低通部分的信号继续做高通和低通滤波处理;现在我们就有了4组数据,分别为0-125Hz,125-250Hz,250-500Hz和500-1000Hz。我们持续进行这个过程,直到将信号分解到一个预先定义的水平。这样我们就有了一系列信号,这些信号实际上都来自相同的信号,但是每一个都对应不同的频带。我们知道每个信号对应的频段,如果我们将这些信号放在一起画出三维图,一个轴表示时间,频率在另外一个轴上,幅度在第三个轴上。这幅图会告诉我们各个频率出现哪些时刻(这里有一个问题,叫做“不确定性原理”,即我们不能精确地知道哪个频率出现在哪些时间点,我们仅能知道某一频段出现在哪一时间区间内,后文中将有更多介绍)。

不过,我仍想简单地解释一下:

不确定性原理最早由海森堡发现并阐述,其表述为:移动粒子的动量和位置不可同时确定。在我们这个课题里则是这样:

时-频平面内的一个确定的点上,信号的频率和时间信息不能同时知道。换句话说:在任一时刻,我们无法确定存在哪个频谱分量。我们最多只能做到,在一个给定的时间区间内存在哪些频谱分量。这是一个分辨率的问题,也是研究者们从快速傅立叶变换(STFT)切换到小波变换(WT)的主要原因。快速傅立叶变换的分辨率随时间是固定不变的,而小波变换则能给出可变的分辨率:

高频信号在时域内很好分辨,低频信号则在频域内容易分辨。这意味着,相对于低频分量,高频分量更容易在时域内定位(有更小的相对误差)。反而言之,低频分量更容易在频域内定位。看下面的网格图:

对上图的解释是:最上面一行表明,高频信号有更多的采样点和较短的采样间隔。就是说,高频信号更容易在时域内分辨。最下面一行是对低频信号的采样,描述信号的特征点较少,因此,低频信号在时域内并不容易分辨。

在离散时间的情形中,信号的时间分辨率与先前相同,但是现在,频率信息的分辨率在每一个阶段都不同。注意到,低频信号更容易在频域内分辨,高频则不然。注意,相邻频率分量的间隔是如何随频率增高而增大的。

下面是连续小波变换的例子:

我们构造一个正弦信号,具有两个频率成分,分别处在两个不同的时间区间:

注意低频分量先出现,然后是高频分量。

图 1.10

图 1.11

注意,上图中代表频率的轴被标记为了“尺度”。“尺度”的概念将会在后续章节进行阐述,但这里需要注意的是,尺度是频率的倒数,即尺度越大频率越低,尺度越小频率越高。因此,图中的小的峰值对应的是信号中的高频分量,大的峰值对应的是信号中的低频分量(在时域内,低频分量先于高频分量出现)。

你可能被图中的频率分辨率搞晕了,因为高频信号似乎也有很好的频率分辨率。但请注意,高频(低尺度)信号处分辨率较好的是尺度分辨率,而非频率分辨率。尺度分辨率高意味着频率分辨率低,反之亦然。更多相关内容将在后续部分介绍。

未完,待续…

以上是此份教程的第一部分,我试着给出信号处理的简要概述——傅里叶变换和小波变换


转载自:http://blog.jobbole.com/101976/


其他参考资料:

http://blog.csdn.net/alihouzi/article/category/3132373

2019-10-13 21:00:10 weixin_44225182 阅读数 197

小波变换实现图像压缩

代码

X=imread('a5.jpg');
X=rgb2gray(X);
subplot(221); imshow(X);
title('原始图像');
%对图像用小波进行层小波分解
[c,s]=wavedec2(X,2,'haar');
%提取小波分解结构中的一层的低频系数和高频系数
cal=appcoef2(c,s,'haar',1);
ch1=detcoef2('h',c,s,1);      %水平方向
cv1=detcoef2('v',c,s,1);      %垂直方向
cd1=detcoef2('d',c,s,1);      %斜线方向
%各频率成份重构
a1=wrcoef2('a',c,s,'haar',1);
h1=wrcoef2('h',c,s,'haar',1);
v1=wrcoef2('v',c,s,'haar',1);
d1=wrcoef2('d',c,s,'haar',1);
c1=[a1,h1;v1,d1];
subplot(222),imshow(c1,[]);
title ('分解后低频和高频信息');
%进行图像压缩
%保留小波分解第一层低频信息
%首先对第一层信息进行量化编码
ca1=appcoef2(c,s,'haar',1);
ca1=wcodemat(ca1,440,'mat',0);
%改变图像高度并显示
ca1=0.5*ca1;
subplot(223);imshow(cal,[]);
title('第一次压缩图像');
%保留小波分解第二层低频信息进行压缩
ca2=appcoef2(c,s,'haar',2);
%首先对第二层信息进行量化编码
ca2=wcodemat(ca2,440,'mat',0);
%改变图像高度并显示
ca2=0.25*ca2;
subplot(224);imshow(ca2,[]);
title('第二次压缩图像');  

结果
在这里插入图片描述
在这里插入图片描述

2018-06-26 08:19:47 qq_39936376 阅读数 3986
        小波指的是一种能量在时域非常集中的波,它的能量有限,都集中在某一点附近,而且积分的值为零,这说明它与傅里叶波一样是正交波。
        图像的傅里叶变换是将图像信号分解为各种不同频率的正弦波。同样,小波变换是将图像信号分解为由原始小波位移和缩放之后的一组小波。
        小波在图像处理里被称为图像显微镜,原因在于它的多分辨率分解能力可以将图片信息一层一层分解剥离开来。剥离的手段就是通过低通和高通滤波器。

图像二维离散小波变换 :

        图像的二维离散小波分解和重构过程如下图所示,分解过程可描述为:首先对图像的每一行进行 1D-DWT,获得原始图像在水平方向上的低频分量 L 和高频分量 H,然后对变换所得数据的每一列进行 1D-DWT,获得原始图像在水平和垂直方向上的低频分量 LL、水平方向上的低频和垂直方向上的高频 LH、水平方向上的高频和垂直方向上的低频 HL 以及水平和垂直方向上的的高频分量 HH。重构过程可描述为:首先对变换结果的每一列进行以为离散小波逆变换,再对变换所得数据的每一行进行一维离散小波逆变换,即可获得重构图像。由上述过程可以看出,图像的小波分解是一个将信号按照低频和有向高频进行分离的过程,分解过程中还可以根据需要对得到的 LL 分量进行进一步的小波分解,直至达到要求。

                                                                            图1. 图像二维离散小波变换

图像的小波变换

阅读数 11509

小波变换

阅读数 160

小波变换wavelet

阅读数 432

没有更多推荐了,返回首页