walsh-Hadamard变换
Posted AllyLi0224
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了walsh-Hadamard变换相关的知识,希望对你有一定的参考价值。
简介:
阿达马变换(Hadamard transform),或称沃尔什-阿达玛转换,是一种广义傅立叶变换(Fourier transforms),作为变换编码的一种在视频编码当中使用有很久的历史。在近来的视频编码标准中,阿达马变换多被用来计算SATD(一种视频残差信号大小的衡量)。
在数位信号处理大型集成电路算法的领域中,阿达马变换是一种简单且重要的算法之一,主要能针对频谱做快速的分析。
在H.264中使用了4阶和8阶的阿达马变换来计算SATD,其变换矩阵为:
SATD计算方法
当计算4x4块 的SATD时,先使用下面的方法进行二维的阿达马变换:
类似的,当计算8x8块的SATD时,先使用下面的方法进行二维的Hadamard变换:
下面是实现二维快速Walsh-Hadamard 变换matlab代码:
[plain] view plain copy
- function xx=fwhtdya2d(data2)
- xx=data2;
- N=length(xx);
- for i=1:N
- xx1(i,:)=fwhtdyald(xx(i,:));
- end
- xx=zeros(N);
- for j=1:N
- xx(:,j)=fwhtdyald(xx1(:,j));
- end
- function x=fwhtdyald(data1)
- N=length(data1);
- x=bitrevorder(data1);
- L=log2(N);
- k1=N;k2=1;k3=N/2;
- for i1=1:L
- L1=1;
- for i2=1:k2
- for i3=1:k3
- i=i3+L1-1;j=i+k3;
- temp1=x(i);temp2=x(j);
- x(i)=temp1+temp2;
- x(j)=temp1-temp2;
- end
- L1=L1+k1;
- end
- k1=k1/2;k2=k2*2;k3=k3/2;
- end
- x=inv(N)*x;
Walsh-Hadamard变换是实时的、对称的正交变换。因为该变换只包括加、减,没有任何乘、除运算,所以有快速算法。Walsh-Hadamard变换在图像处理中
的主要 用途是压缩编码。下面用一个图像压缩的例子讲述matlab如何实现Walsh-Hadamard变换。
将图像分割成为16*16的子图像后,每个子图像经过变换将有很多系数。按照每个系数的方差来排序。保留方差较大的系数,舍弃方差较小的系数。程序如下:
[plain] view plain copy
- I=imread('lena.png');
- sig=rgb2gray(I);
- sig=double(sig)/255;
- %figure,imshow(sig);
- [m_sig,n_sig]=size(sig);
- sizi=16;
- Snum=128;
- T=hadamard(sizi);
- hdcoe=blkproc(sig,[sizi sizi],'P1*x*P2',T,T);
- coe=im2col(hdcoe,[sizi sizi],'distinct');
- coe_temp=coe;
- [Y,Ind]=sort(coe);
- %舍去较小方差的系数
- [m,n]=size(coe);
- Snum=m-Snum;
- for i=1:n
- coe_temp(Ind(1:Snum),i)=0;
- end
- re_hdcoe=col2im(coe_temp,[sizi sizi],[m_sig n_sig],'distinct');
- re_sig=blkproc(re_hdcoe,[sizi sizi],'P1*x*P2',T,T);
- %figure,imshow(uint8(re_sig));
- error=sig.^2-re_sig.^2;
- MSE=sum(error(:)/prod(size(re_sig)))
- subplot(1,2,1),imshow(sig);
- subplot(1,2,2),imshow(uint8(re_sig));
处理结果如下:
以上是关于walsh-Hadamard变换的主要内容,如果未能解决你的问题,请参考以下文章