基于MATLAB的希尔伯特曲线索引构建

基于MATLAB的希尔伯特曲线索引构建@TOC

希尔伯特曲线矩阵构建

希尔伯特曲线是一种邻近索引,便于图像相邻区域的相关性分析。话不多说,上图:
基于MATLAB的希尔伯特曲线索引构建
如图所示,就是希尔伯特曲线。从左上角的起始位置开始沿线走下去就是该曲线的索引序列。

曲线的构建思路

在笔者看来,希尔伯特曲线的任何维度都可以抽象为四个矩阵的拼接。
基于MATLAB的希尔伯特曲线索引构建
以4的一次方为例,就是由0,1,2,3这四个1×1的矩阵拼接而成。拼接的规则为第一个矩阵和第二个进行上下拼接形成第五个矩阵;第三个矩阵和第四个进行下上拼接形成第六个矩阵,再将五六矩阵进行左右拼接,希尔伯特曲线由4的0次方扩张到4的1次方。

接下来是4的二次方。
基于MATLAB的希尔伯特曲线索引构建
可以看出,4的2次方维度的希尔伯特曲线矩阵是由四个4的1次方的矩阵拼接而成。上图中,红色序号为矩阵序号,一号矩阵为种子矩阵,二号矩阵是一号矩阵转置后各元素加上4的1次方得到;三号矩阵是二号矩阵各元素加上4的1次方得到;四号矩阵是三号矩阵沿副对角线转置后各元素加上4的1次方得到。最后将一、二矩阵进行左右拼接形成五矩阵,三、四矩阵进行右左拼接形成六矩阵,再将五六矩阵上下拼接,则希尔伯特曲线矩阵由4的1次方扩张到4的2次方。

再来看一下由4的2次方到4的3次方的扩张:
基于MATLAB的希尔伯特曲线索引构建
上图中,绿色序号为矩阵序号,一号矩阵为种子矩阵,二号矩阵是一号矩阵转置后各元素加上4的2次方得到;三号矩阵是二号矩阵各元素加上4的2次方得到;四号矩阵是三号矩阵沿副对角线转置后各元素加上4的2次方得到。最后将一、二矩阵进行上下拼接形成五矩阵,三、四矩阵进行下上拼接形成六矩阵,再将五六矩阵左右拼接,则希尔伯特曲线矩阵由4的2次方扩张到4的3次方。

讲了这么多,相信规律大家已经找到了吧?我来总结一下:希尔伯特矩阵的扩张是由矩阵的复制变化和矩阵的拼接两部分构成。
首先是矩阵的复制规律:复制种子矩阵并转置后各元素加上种子矩阵的元素个数值,形成二号矩阵;复制二号矩阵并将各元素加上种子矩阵的元素个数值,形成三号矩阵;复制三号矩阵并逆转置(即沿副对角线的转置,自己起的名字)后各元素加上种子矩阵的元素个数值,形成四号号矩阵。
接下来是矩阵的拼接:如果是由4的奇数次方扩张到4的偶数次方,则将一、二矩阵进行左右拼接形成五矩阵,三、四矩阵进行右左拼接形成六矩阵,再将五六矩阵上下拼接完成矩阵的扩张;如果是由4的偶数次方扩张到4的奇数次方,则将一、二矩阵进行上下拼接形成五矩阵,三、四矩阵进行下上拼接形成六矩阵,再将五六矩阵左右拼接完成矩阵的扩张。

代码展示

首先解释一下逆转置:
基于MATLAB的希尔伯特曲线索引构建
如上图所示,矩阵的转置是沿红色线(主对角线)对称部分元素互换;矩阵的逆转置则是沿绿色线(副对角线)对称元素进行互换。矩阵逆转置函数如下:
%========================
%% 矩阵逆转置
% 输入pjz0为原始矩阵
% 输出pjz为逆转置后的矩阵
function [pjz] = zhuanzhijz(pjz0)
[r,c] = size(pjz0);
for i = 1:1:r
for j = 1:1:c
pjz(i,j) = pjz0(r-j+1,c-i+1);
end
end
end
%=======================

接下来就是代码主体部分,流程图如下:
基于MATLAB的希尔伯特曲线索引构建
%================================
weidu = 4; %指定维度(可以是任意正整数!)
xlbt = 0 ; %雪球核(维度为4的0次方)
pGM = weidu-2;jsqgm = -1;
while jsqgm <=pGM
jsqgm = jsqgm + 1 ;
a1 = xlbt’+ 4^(jsqgm) ;
a2 = a1 + 4^(jsqgm) ;
a3 = zhuanzhijz(a2) +4^(jsqgm) ;
if mod(jsqgm,2) == 0
xlbt = cat (1,xlbt,a1);
xlbt1 = cat(1,a3,a2);
xlbt = cat (2,xlbt,xlbt1);
else
xlbt = cat (2,xlbt,a1);
xlbt1 = cat(2,a3,a2);
xlbt = cat (1,xlbt,xlbt1);
end
end
%===============================

总结

笔者将希尔伯特曲线矩阵的构建看成是一个滚雪球的过程,起始的雪球核为4的0次方个元素即1个元素,值可以是任意值,本文定义为0.雪球通过迭代滚大,每迭代一次,雪球滚三次,雪球壮大为原来的4倍。怎么样,这个比喻会不会使你理解起来比较方便?
最后是本代码的生成结果(一张希尔伯特矩阵索引表):
基于MATLAB的希尔伯特曲线索引构建