鬼成像是利用数据之间的相关性进行非定域成像。其系统结构主要包含两部分:一部分为光学系统部分另一部分为计算部分。在光学系统中,经过处理的激光散斑要通过两条路径,一条路径作用到目标物体上,透过物体的光斑被透镜汇聚到无空间分辨率的桶探测器进行收集其总光强,另一条路径直接被具有空间分辨率的CCD探测器进行记录,收集其激光散斑的空间分布信息
。收集的总光强值要与每次的激光散斑一一对应。经过M多次采样就可以获得多对数据(光强值与对应的激光散斑),然后利用鬼成像公式进行重构回复出目标物体。
由前面知识我们可以知道,传统鬼成像的重构效率非常的不理想。从鬼成像的成像原理我们也清楚的明白,要想得到较好的重构效果,除了在设备上的改进外,还可以从激光散斑以及重构算法的改进两方面来提高重构图像的质量。新的重构算法后面再讨论,本节激光散斑的改进。利用计算鬼成像可以提前对光源进行优化并作为已知信息进行保存,也就是对进行处理。首先生成特定的结构性激光散斑矩阵,然后将矩阵的每一列进行重构成与目标物体大小相同的新矩阵去对目标物体进行重构。然后利用新矩阵与对应的光强值利用上述公式进行重构。
为什么要讨论测量散斑呢,因为在计算鬼成像系统中,不同的测量散斑会严重影响影响鬼成像的质量。从最初的随机散斑到现在研究较多的结构散斑性离散正余弦散斑、Hadamard散斑以及Hadamard衍生散斑等等。后三者因为其重构的照明散斑系列之间的正交性相比于随机散斑不仅可以减少采样次数而且可以提高鬼成像重构图像的质量。
Hadamard散斑:阿达玛矩阵是一种由+1和-1元素组成的正交矩阵,其阶数等于方阵中任意行或列中所有元素的平方和。高阶Hadamard矩阵可以由二阶Hadamard矩阵构造,其表达式如下:
Hadamard散斑在采样率较低时会产生大量的重影,不利于人眼的视觉观察。Hadamard衍生散斑具有hadamard散斑的优良特性,且在采样率较低时不会出现重影现象。
将Hadamard矩阵按照特定的规则重新排列得到Walsh测量矩阵。采用灰色编码获得沃尔什测量矩阵。设Walsh的行号为nhN,一般行号为n, Hadamard阶数为n,则灰色码为$m=log_2^ n $,灰色码的二进制为g(n)=(g_{m-1}g_{m-2}…g_{1}g_{0})_2,则n与nhN的关系可表示为
例如,要使用3位Gray码生成88 Walsh测量矩阵,则Walsh测量矩阵的第一行对应Gray码(001)。颠倒排列后,它对应于十进制值4。因此,Walsh测量矩阵的第一行对应于大小相同的Hadamard矩阵的第四行。此过程将继续处理后续行。Walsh测量矩阵是一种改进的Hadamard方法,其值为+1或-1的二进制正交码。8x8的Walsh测量矩阵可表示为:
这里还介绍一种常用hadamard衍生散斑即切蛋糕矩阵。首先,取出Hadamard矩阵的每一行,将每一行重组成大小为的矩阵。如果将重塑的基本模型看作是一块蛋糕,那么可以计算出有多少块蛋糕,每一块蛋糕都可以看作是一个相连的区域。在拓扑学和数学中,连通域是指不能表示为两个或多个不相交的非空子集的并的拓扑域。这个属性意味着域内的每个点要么被赋予一个黑色值,要么被赋予一个白色值。根据阿达玛尔基图案的件数进行排序,排序序列的大小为N×1。将N个模式重构为N个行向量,且这N个行向量的大小均为1 × N,则可形成一个N × N的切蛋糕矩阵。
离散余弦散斑:离散余弦变换矩阵被认为图像信息的最佳变换,通过离散余弦矩阵生成离散余弦散斑的过程如下:首先生成离散余弦矩阵,一维离散余弦变换定义为:设{g(x)|x=0,1,2,⋯,N-1}为离散的信号列,其公式如下:
其中,N为一维序列的长度;g(x)表示原始信号;G(u)表示变换后的信号;F(u)为补偿系数。令离散余弦变换矩阵为正交矩阵,并将离散余弦变换式中的系数矩阵提取出作为鬼成像中的光源调制矩阵,矩阵形式如下:
然后将离散余弦矩阵的每一列生成散斑。
由以上公式生成的有序结构性散斑图如下:
相对于随机散斑,结构散斑的使用可以极大的提高重构图像的效率。
WAISH散斑生成程序:
function wh=walsh(m)
N=log2(m);
x=hadamard(m);
walsh=zeros(m);
graycode=gen_gray_code(N);
nh1=zeros(m,N);
for i=1:m
q=graycode(i,:);
nh=0;
for j=N:-1:1
nh1(i,j) =q(j)*2^(j-1);
end
nh=sum(nh1(i,:));
walsh(i,:)=x(nh+1,:);
end
wh=walsh;
end
function [dct]=DCT(n)
N=n;
[cc1,rr1] = meshgrid(0:N-1);
dct= sqrt(2 / N) * cos(pi *(2*cc1 + 1) .* rr1 / (2 * N));
dct(1,:) = dct(1,:) / sqrt(2);
end
function ch=cchdm(m)%切蛋糕矩阵
N=log2(m);
x=hadamard(m);
a=sqrt(m);b=a;
cchdmm=zeros(m);
for i=1:m
row=reshape(x(i,:),[a,b]);
num1=0;num2=0;
for j=1:a-1
if row(1,j)~= row(1,j+1);
num1=num1+1;
end
if row(j,1)~=row(j+1,1)
num2=num2+1;
end
num(i)=(num1+1)*(num2+1);
end
end
[B,index]=sort(num);
for k=1:m
cchdmm(k,:)=x(index(k),:);
end
ch=cchdmm;
end