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

图像二维离散小波变换 :

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

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

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

应用小波变换对图像处理

图像金字塔,每一层的像素数为(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;
}


2019-11-11 20:17:50 BOTAK_ 阅读数 149

最近在学习图像处理,md,从傅立叶变换,拉普拉斯变换,z变换到小波变换,真的是恶心的我头疼,重点是网上关于小波变换的内容少之又少,根本无从下手学习,这里我看了中国科学技术大学的小波变换与图像处理这一本书,希望自己能够明白小波变换的含义以及这篇博客的内容能够很好的帮助你们理解小波变换,

从傅立叶变换到小波变换

简而言之,傅立叶变换首创的为人们提供了一个观察时(空)域信号的新视角,也就是所说的频域分析法,有些时候,在时(空)域中无法观察或者说是难以处理的问题在频域中就会变得简单易行。信号f(t)f(t)的Fourier变换与你变换分别为:
F(w)=tRf(t)eiwtdtF(w) = \int_{t \in R}f(t)e^{-iwt}dt
f(t)=1/2tRF(w)eiwtdwf(t) = 1/2\int_{t \in R}F(w)e^{iwt}dw
在离散的情况下,傅立叶变换可以理解为将时域信号分解为不同频率的等幅振荡的波形,原始信号可以看作是不同相位和振幅的波形的叠加。
但是,Fourier变换只适用于处理平稳的信号,而且无法知道知道信号在时间域的时间特征,这时候就需要小波变换来帮忙。

小波变换

小波变换究竟是什么呢?从物理的角度而言,小波变换就是将信号分解成为不同的空间和尺度分量,从数学的角度而言,小波变换就和Fourier变换一样,就是一种数学变换,之所以难以理解,是因为他特殊的变换核,这中变换核就是小波函数。本质上,小波函数是由一个小波“母函数”经过平移或者伸缩而得到的一簇函数。
墨西哥草帽函数为例:其中φ(t)\varphi(t)为小波母函数
其衍生出来的小波函数为
φa,b(t)=a1/2φ((tb)/a)\varphi_{a,b}(t) = |a|^{-1/2} \varphi((t-b)/a)
并非所有的函数都可以作为小波母函数,可以作为小波母函数的条件:
Cφ=φ(w)^2w1dwC_{\varphi} = \int |\hat{\varphi(w)}|^2|w|^{-1}dw
其中,φ(w)^\hat{\varphi(w)}为函数φ(t)\varphi(t)的傅立叶变换,则φ(t)\varphi(t)为小波母函数的必要条件为Cφ<+C_{\varphi} <+\infty,这个条件又叫做可容许条件,说明函数φ(t)\varphi(t)必须要有一定的波动性。

连续小波变换

函数f(t)f(t)的 连续小波变换可以表示为:
Wf(a,b)=<f,φa,b>=1/a1/2f(t)W_f(a,b) = <f,\varphi_{a,b}> = 1/|a|^{1/2} \int f(t)
和傅立叶变换相比,采用实函数变换核,因此变换结果中没有虚部。
连续小波变换的结果中有两个参数a和b,其中a被称之为尺度因子,b被称之为平移因子,a的大小决定了小波函数的支撑长度,在实际应用中,往往用短支撑的析取信号的短时高频成分,而用长支撑小波析取信号中的长时低频成分,实际上,小波函数中的尺度类似于Fourier变换中的频率参数,在变换结果中,尺度越大说明频率越低,尺度越小,说明频率越高。参数b是小波窗的时间定位参数,他确定了在小波变换中,小波窗在时间轴上的位置,它使得变换结果中有一定的时间信息。
和Fourier变换类似,小波变换也可以看作是由一些列的小波函数的线形组合而得到的对原始函数的逼近,因此,要求某一个函数的小波变换,实际上就是求该线性组合表达式中,各个小波函数项的系数,每一个系数的大小,反映出对应的小波函数在原始信号中能量的大小。

离散小波变换(DWT)

连续小波变换中的尺度参数和位移参数都是连续变化的,给连续小波变换带来了缺陷,运算量急剧增加,冗余度增大,因而,出现了离散小波变换。
φm,n(t)=a0m/2φ(a0mtnb0)\varphi_{m,n}(t) = a_0^{-m/2}\varphi(a_0^{-m}t-nb_0)
子带编码subband coding:
塔式编码 pyramidal coding:
多分辨率分析 MRA:
离散小波变换由Mallat算法快速实现,Mallat算法就是采用小波滤波器对离散信号反复的进行低通和高通滤波过程,每一次的滤波得到一个低频分量与高频分量,再对低频分量分别进行高通以及低通滤波,从而得到更大尺度上的高频以及低频分量。
因此,对一离散信号的离散小波变换,其结果应该包含各个尺度上的高频分量最大尺度上的低频分量
1

二维小波变换

Wf(a,bx,by)=f(x,y)ψa,bx,by(x,y)dxdyW_f(a,b_x,b_y) = \int\int f(x,y)\overline{\psi_{a,b_x,b_y}(x,y)}dxdy
二维小波逆变换
f(x,y)=1cψWf(a,bx,by)ψa,bx,by(x,y)dbxdbydaa3f(x,y) = \frac{1}{c_{\psi}}\int\int\int W_f(a,b_x,b_y) \overline{\psi_{a,b_x,b_y}(x,y)}db_xdb_y\frac{da}{a^3}
其中,ψa,bx,by(x,y)=1aψ(xbxa,ybya)\overline{\psi_{a,b_x,b_y}(x,y)} = \frac{1}{|a|}\psi(\frac{x-b_x}{a},\frac{y-b_y}{a})
二维小波变换实质上就是对图像进行离散二维小波变换,其二维小波变换相当于对二维图像数据在水平方向和垂直方向各自独立的进行一次一维小波变换。
二维小波变换的快速算法:
2

多分辨率分析MRA

直接构造L2(R)L^2(R)的正交小波基,需要满足完备,正交的要求,似乎是不太容易,但是我们可以对L2(R)L^2(R)进行适当的分解,使得分解的各个子空间满足一定的关系,再构造其中的一个子空间里的正交基,然后将该子空间里的正交基扩展到其他的子空间中,从而得到L2(R)L^2(R)空间里的正交基。
可见,L2(R)L^2(R)的分解方式是构造正交基的关键,多分辨率分析就是为这种小波基的构造提供了适当的L2(R)L^2(R)分解方式。
嵌套的L2(R)L^2(R)的子空间Vj{V_j}满足一定的要求
尺度空间: VjV_j
小波空间: WjW_j
记住一个结论,一个多分辨率分析中一系列嵌套子空间是由函数ϕL2(R)\phi \in L^2(R)生成的,则称ϕ\phi为生成L2(R)L^2(R)的多分辨率分析Vj{V_j}的尺度函数。
尺度函数满足的要求:

  1. 尺度函数对其正数平移是正交的
  2. 低尺度的尺度函数跨越的子空间嵌套在高尺度的尺度函数跨越的子空间里
  3. 唯一对所有的VjV_j通用的函数是f(x)=0f(x) = 0
  4. 任何函数都可以以任何精度表示

小波包

小波包分解:小波变换 仅对低通滤波的结果进行,从数据压缩的观点来看,通过小波变换得到的值越小越好,但是标准的小波变换,高频段频率分辨率不高,这就提出了小波包分解的概念。
小波包分解(wavelet packet analysis)是一种更加精细的信号分析方法,它将频带进行多层次的划分,对于多分辨率分析没有细分的部分进一步的分解,且能够根据被分析信号的特征,自适应的选择相应的频带,使之与信号频谱相匹配,从而提高了时频分辨率。

2017-03-19 16:15:34 Terrenceyuu 阅读数 3011

小波变换在数字图像上的应用(下)

仿真示例

  • 这里的程序均来自于张德丰版的MATLAB数字图像处理一书中,我只是拿出一部分来和大家分享,准备加上一些自己的理解。

1、连续小波变换和离散小波变换

这里写图片描述

  • 上图给出了原始信号和离散小波及连续小波变换的结果。
  • 可以看出其空间域与频率域的特性,如原信号在320-350是一个近似的直流信号,从小尺度的CWT或DWT都可以看出这段灰度值很小(偏黑色)。

2、二维小波变换

这里写图片描述

  • 上图是指纹图像,我们将对其做离散小波变换分析。

这里写图片描述

  • 上图展示了对原始图像的单层小波分析的结果。

这里写图片描述

  • 上图展示了对原始图像的两层小波分析的结果,即对低频a1再进行一次小波分解。

这里写图片描述

  • 上图是由2层小波分解得到的列向量(由低频,水平高频,垂直高频,对角高频组成)重构得到的原始图像,可见其恢复图像的精度很高。
  • matlab中使用[C,S]=wavedec2(X,N,’wname’)来进行二维离散小波分解。其中X是待分解信号,N是分解层数,wname为小波函数;输出变量C表示分解的结果,以[A(N)|H(N)|V(N)|(D(N)…A(1)|H(1)|V(1)|(D(1))]的结果存储为一个列向量。S表示对于的分解结构的系数矩阵大小,S的第一行表示尺度N的低频系数矩阵大小,第i(i>1)行表示尺度N-i+2的高频系数矩阵的大小。

3、提取小波分解的高低频系数

  • matlab提供detcoef2,appcoef2函数来用于提取小波分解的系数。其中,[chd2,cvd2,cdd2]=detcoef2(‘all’,c,s,2)用于提取三个高频系数,appcoef2(c,s,’db1’,N)用于提取N尺度的低频系数。

这里写图片描述

这里写图片描述

4、二维小波包分析

  • matlab提供wpdec2(X,N,’db2’)用于对X进行N层小波包分解,使用wpcoef(t,[x y])用于对(x,y)节点的提取。
    这里写图片描述

  • 剩下书中还有利用小波实现图像处理的一些具体示例,如图像压缩,图像增强,图像重构,图像融合等等。感兴趣童鞋的可以查阅书中代码,这里就不再赘述。

  • 这里是书中小波变换的所有代码。因为没有积分了……
    http://download.csdn.net/detail/terrenceyuu/9786302
2016-01-07 17:20:43 EbowTang 阅读数 17351

      小波变换下的图像对比度增强技术实质上是通过小波变换把图像信号分解成不同子带,针对不同子带应用不同的算法来增强不同频率范围内的图像分量,突出不同尺度下的近似和细节,从而达到增强图像层次感的目的。


       根据小波的多分辨率分析原理将图像进行多级二维离散小波变换,可以将图像分解成图像近似信号的低频子带和图像细节信号的高频子带。其中,图像中大部分的噪声和一些边缘细节都属于高频子带,而低频子带主要表征图像的近似信号。为了能够在增强图像的同时减少噪声的影响,可以对低频子带进行非线性图像增强,用以增强目标的对比度,抑制背景;而对高频部分进行小波去噪处理,减少噪声对图像的影响。最后小波重构得到增强的红外图像。基于小波变换的红外图像增强模型如下图所示




1,基于小波变换的简单线性变换对比度增强算法:

load woman;  
subplot(121);
image(X);colormap(map);title('原始图像');%画出原图像

[c,s]=wavedec2(X,3,'sym4');  %进行二层小波分解

len=length(c);
justdet = prod(s(1,:));%截取细节系数起始位置(不处理近似系数)  
%处理低频分解系数,突出轮廓
for I =1:justdet
    if(c( I )>250)
      c( I )=1.5*c( I );
    end
end
%处理高频分解系数,弱化细节
for I =justdet:len
    if(c( I ) < 150)
      c( I )=0.75*c( I );
    end
end

nx=waverec2(c,s,'sym4');%分解系数重构

subplot(122);
image(nx);title('增强图像')%画出增强图像


利用上面代码进行两层分解得到的增强效果图:



利用上面代码进行三层分解得到的增强效果图:



通过对小波系数进行简单的线性变来增强图像对比度,虽然能够取得一定的效果,根据对低频和高频系数增加不同的倍数,可以得到不同的视觉效果,但倍数的选择更多受到不同人的主观影响,不能做到最优的选取。

另外,简单的使用该方法还是会在增强图像的同时加大噪声,影响对比度的增强效果。



2,小波变换和直方图均衡化结合的图像增强算法

通俗一点说,直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。一般而言,经过直方图均衡化处理之后,灰度值出现概率较小的像素会被合并,从而导致该图像的部分灰度值被压缩,而灰度值出现概率较大的像素则会被拉伸。因此灰度值的合并必然引起来图像细节的丢失,而灰度值拉伸过程中必然会使得图像中的噪声被局部的增强。尤其是对于红外图像中背景和目标的灰度值非常接近的情况下,必然使得红外图像中的噪声被放大,细节丢失。

图像中经过小波变换后得到小波系数中的低频信息实际上表征了图像的低频信息,也即图像的整体轮廓。

而图像中的高频小波系数则包含了图像的细节信息,包括噪声、细节和边缘信息等。

因此通过只对低频小波系数进行直方图均衡化的方法就会很好的改善图像的噪声信息被放大的特性,因为图像的噪声信息已经大部分被包含在高频小波系数中。而对于高频小波系数而言,可以通过类似硬阈值去噪的方法,去除图像中的噪声,并对非噪声的高频小波系数进行增强,从而强化图像中的细节部分。这样就用小波变换的方法很好的弥补了直方图均衡化算法中增强噪声和丢失细节的问题,从而更好的完成了图像的增强。


I=imread('oct.bmp');
figure 
imshow(I);title('yuan')


[ca,ch,cv,cd]=dwt2(I,'db6');
X=imadjust(uint8(ca),[],[],1.3);
xx=idwt2(uint8(X),ch,cv,cd,'db6');
figure 
imshow(uint8(xx));



参考资源:

【1】一种基于小波变换的非线性红外图像增强算法刘兴淼,王仕成,赵 静(陕西省第二炮兵工程学院,陕西 西安 710025)


图像的小波变换

阅读数 11482

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