walsh-Hadamard变换

简介:

阿达马变换Hadamard transform),或称沃尔什-阿达玛转换,是一种广义傅立叶变换(Fourier transforms),作为变换编码的一种在视频编码当中使用有很久的历史。在近来的视频编码标准中,阿达马变换多被用来计算SATD(一种视频残差信号大小的衡量)。

在数位信号处理大型集成电路算法的领域中,阿达马变换是一种简单且重要的算法之一,主要能针对频谱做快速的分析。

在H.264中使用了4阶和8阶的阿达马变换来计算SATD,其变换矩阵为:


walsh-Hadamard变换_第1张图片

SATD计算方法

当计算4x4块 \begin{bmatrix}L_4\end{bmatrix} 的SATD时,先使用下面的方法进行二维的阿达马变换:


然后计算\begin{bmatrix}L_4'\end{bmatrix}所有系数绝对值之和并归一化。

类似的,当计算8x8块\begin{bmatrix}L_8\end{bmatrix}的SATD时,先使用下面的方法进行二维的Hadamard变换:


然后计算\begin{bmatrix}L_8'\end{bmatrix}所有系数绝对值之和并归一化。

下面是实现二维快速Walsh-Hadamard 变换matlab代码:

[plain]  view plain  copy
  1. function xx=fwhtdya2d(data2)  
  2. xx=data2;  
  3. N=length(xx);  
  4. for i=1:N  
  5.     xx1(i,:)=fwhtdyald(xx(i,:));  
  6. end  
  7. xx=zeros(N);  
  8. for j=1:N  
  9.     xx(:,j)=fwhtdyald(xx1(:,j));  
  10. end  
  11.   
  12. function x=fwhtdyald(data1)  
  13. N=length(data1);  
  14. x=bitrevorder(data1);  
  15. L=log2(N);  
  16. k1=N;k2=1;k3=N/2;  
  17. for i1=1:L  
  18.     L1=1;  
  19.     for i2=1:k2  
  20.         for i3=1:k3  
  21.             i=i3+L1-1;j=i+k3;  
  22.             temp1=x(i);temp2=x(j);  
  23.             x(i)=temp1+temp2;  
  24.             x(j)=temp1-temp2;  
  25.         end  
  26.         L1=L1+k1;  
  27.     end  
  28.     k1=k1/2;k2=k2*2;k3=k3/2;  
  29. end  
  30. x=inv(N)*x;  


walsh变换在图像压缩领域的应用:
Walsh-Hadamard变换是实时的、对称的正交变换。因为该变换只包括加、减,没有任何乘、除运算,所以有快速算法。Walsh-Hadamard变换在图像处理中

的主要 用途是压缩编码。下面用一个图像压缩的例子讲述matlab如何实现Walsh-Hadamard变换。

将图像分割成为16*16的子图像后,每个子图像经过变换将有很多系数。按照每个系数的方差来排序。保留方差较大的系数,舍弃方差较小的系数。程序如下:

[plain]  view plain  copy
  1. I=imread('lena.png');  
  2. sig=rgb2gray(I);  
  3. sig=double(sig)/255;  
  4. %figure,imshow(sig);  
  5. [m_sig,n_sig]=size(sig);  
  6. sizi=16;  
  7. Snum=128;  
  8. T=hadamard(sizi);  
  9. hdcoe=blkproc(sig,[sizi sizi],'P1*x*P2',T,T);  
  10. coe=im2col(hdcoe,[sizi sizi],'distinct');  
  11. coe_temp=coe;  
  12. [Y,Ind]=sort(coe);  
  13. %舍去较小方差的系数  
  14. [m,n]=size(coe);  
  15. Snum=m-Snum;  
  16. for i=1:n  
  17.     coe_temp(Ind(1:Snum),i)=0;  
  18. end  
  19. re_hdcoe=col2im(coe_temp,[sizi sizi],[m_sig n_sig],'distinct');  
  20. re_sig=blkproc(re_hdcoe,[sizi sizi],'P1*x*P2',T,T);  
  21. %figure,imshow(uint8(re_sig));  
  22. error=sig.^2-re_sig.^2;  
  23. MSE=sum(error(:)/prod(size(re_sig)))  
  24. subplot(1,2,1),imshow(sig);  
  25. subplot(1,2,2),imshow(uint8(re_sig));  

处理结果如下:

walsh-Hadamard变换_第2张图片

你可能感兴趣的:(matlab)