アダマール変換の定義
F(u,v) &= \frac{1}{n} \sum_{x=0}^{n-1}\sum_{y=0}^{n-1} f(x,y)\cdot (-1)^{q(x,y,u,v)} \\ q(x,y,u,v) &= \sum_{i=0}^{b-1}x_i g_i(u) + y_i g_i (v)\\ g_i(u) &= u_{b-i} + u_{b-i-1}
ただしbはu(およびv)を2進数で表現したときに必要なビット数
たとえば8x8画像だとすると、u(およびv)は8なので、その表現ビット数はb=3(∵3'b111=7)となる。
以下はMatlabでの実装
Matlabのindexは0からじゃなくて1からだけど、上のアダマール変換の定義式では0からインデックスを振らないといけないのでハマった
function show_hadamard_basis clear; close all; m = 8; N = m*m; b = 3; % <8> can be expressed with <3> bit function F=getBasisF(u,v) F = zeros(m,m); for yidx=0:m-1 for xidx=0:m-1 F(yidx+1,xidx+1) = (-1)^getQ(xidx,yidx,u,v); end end F = 1/m * F; end function q=getQ(x,y,u,v) q = 0; for idx=0:b-1 q = q + Bit(idx,x)*getG(idx,u) + Bit(idx,y)*getG(idx,v); end end function g = getG(i,u) g = Bit(b-i,u) + Bit(b-i-1,u); end function bit = Bit(index,u) filter = bitshift(1, index); flag = bitand(u,filter); if flag ~= 0 bit = 1; else bit = 0; end end for vidx=0:m-1 for uidx=0:m-1 F = getBasisF(uidx,vidx); subplot(m,m,m*vidx+uidx+1); imagesc(F); colormap(gray); axis image; axis off; end end end