破碎文件的拼接在司法物证复原、历史文献修复以及军事情报获取等领域都有着重要的应用。传统上,拼接复原工作需由人工完成,准确率较高,但效率很低。特别是当碎片数量巨大,人工拼接很难在短时间内完成任务。随着计算机技术的发展,人们试图开发碎纸片的自动拼接技术,以提高拼接复原效率。
clear; I=imread('xingshi32.bmp');
if(isgray(I)==0) disp('请输入灰度图像,本程序用来处理128 *128的灰度图像!'); else if (size(I)~=[128,128]) disp('图像的大小不合程序要求!'); else H.color=[1 1 1]; %设置白的画布 figure(H);imshow(I); title('原图像'); zeroImage=repmat(uint8(0),[128 128]); figure(H); %为分裂合并后显示的图设置画布 meansImageHandle=imshow(zeroImage); title('块均值图像'); %%%%%设置分裂后图像的大小由于本图采用了128像素的图 blockSize=[128 64 32 16 8 4 2]; %%设置一个S稀疏矩阵用于四叉树分解后存诸数据 S=uint8(128); S(128,128)=0; threshold=input('请输入分裂的阈值(0--1):');%阈值 threshold=round(255*threshold); M=128;dim=128;
%%%%%%%%%%%%%%%%% 分裂主程序%%%%%%%%%%% while (dim>1) [M,N] = size(I);
Sind = find(S == dim); numBlocks = length(Sind); if (numBlocks == 0) %已完成 break; end rows = (0:dim-1)'; cols = 0:M:(dim-1)*M; rows = rows(:,ones(1,dim)); cols = cols(ones(dim,1),:); ind = rows + cols; ind = ind(:);
tmp = repmat(Sind', length(ind), 1); ind = ind(:, ones(1,numBlocks)); ind = ind + tmp;
blockValues= I(ind); blockValues = reshape(blockValues, [dim dim numBlocks]);
if(isempty(Sind)) %已完成 break; end [i,j]=find(S); set(meansImageHandle,'CData',ComputeMeans(I,S)); maxValues=max(max(blockValues,[],1),[],2); minValues=min(min(blockValues,[],1),[],2); doSplit=(double(maxValues)-double(minValues))>threshold; dim=dim/2; Sind=Sind(doSplit); Sind=[Sind;Sind+dim;(Sind+M*dim);(Sind+(M+1)*dim)]; S(Sind)=dim; end [i,j]=find(S); % 用来寻找四叉机分解结果中大小为S的块的位置 set(meansImageHandle,'CData',ComputeMeans(I,S)); % 显示分解结果块均值图像 Numberofbloks=length(i); %计算块数 %sizev=size(v); end end
|