patch matching 图像块匹配算法

进入实验室后,我读的第一篇paper是:Needle-Match: Reliable Patch Matching under High Uncertainty,其中涉及到了patch相似度匹配,作为一个新人我对此没有任何基础,我完全不懂如何匹配出相似的patch,当时在网上也没有找到说的很清楚的参考资料,经过两周的学习和matlab仿真,我简单讲讲如何找出一幅图中相似的p块和q块,这都是很简单的知识,仅仅献给初学者(若有错误欢迎指正):

在一幅512*512的灰度图中,以3x3的patch为例,在全图匹配出与p最相似的q块,使用的方法可称作“patch-NNs”:


1.首先把待匹配的patch块p的灰度值存入3x3矩阵,以一个像素为滑动单位(或者以3x3单位)计算全图每个3x3块q与原p的最小L2距离(欧式距离,使用其他距离也可以,如曼哈顿距离

(欧氏距离)


   (曼哈顿距离)



2.求出全图所有patch与p的距离,求出最小距离的q集合,再通过1st NN search方(即KNN算法,k=1)法找出与原patch最近的相似块, 仍然可以用曼哈顿距离:
(x,y)是patch的中心坐标

3.找出所有的匹配块后,可对图进行重构,用相似patch q 取代原patch p:
%变量初始化——————————————————————————————
src=imread('multisc1.jpg');%默认噪声原图为正方形(加入了高斯白噪声)
srclean=imread('srcmultisc1.jpg');%clean原图
[M,M1]=size(src);
N=3;%patch尺寸,默认搜索图像为正方形  
dst=zeros(M-N+1,M-N+1); %用于暂存当前匹配块的L2距离
recon=zeros(M,M);%从噪声图重构后的图像矩阵
recon=im2uint8(recon);
reconclean=zeros(M,M);%从clean图重构后的图像矩阵
reconclean=im2uint8(reconclean);
%曼哈顿距离 求相似块组————————————————————————
for p=1:N:M-N+1
     for q=1:N:M-N+1

            mask = src(p:p+N-1,q:q+N-1);%当前待匹配相似度的未知patch
             for i=1:N:M-N+1        %子图选取,每次滑动一个像素  
                for j=1:N:M-N+1  
                    temp=src(i:i+N-1,j:j+N-1);%当前子图  
                    B=sum(sum(abs(temp-mask)));
                    dst(i,j)=B;  %曼哈顿距离                  
                end  
            end  
            abs_min=min(min(dst)); 
            [x,y]=find(dst==abs_min); %找出最相似块的坐标           
%1st NN搜索法:Nearest-Neighbor——————————————
            T=[x y];%将训练样本坐标存入数组
            [a,b]=size(T);%求出有多少个训练样本
            U=[p q];
            U=repmat(U,a,1);
            U_abs_sum=sqrt(sum(abs(T-U).^2,2));%是按行求和
            for k=1:a
                   if(T(k,:)==[p q])
                       op=k;
                       U_abs_sum(op)=Inf;
                   end
            end    
            r=find(U_abs_sum==t_abs_dst_min); %找出离样本最近的训练样本  
%             r=find(U_abs_sum>min(U_abs_sum),1); %找出离样本最近的训练样本(除去本身) 
%重构图——————————————————————————
            x_near=x(r);
            y_near=y(r);
            recon(p:p+N-1,q:q+N-1)=src(x_near:x_near+N-1,y_near:y_near+N-1);  
            reconclean(p:p+N-1,q:q+N-1)=srclean(x_near:x_near+N-1,y_near:y_near+N-1);           
    end  
end 
%边角料处理,恢复成其原图灰度值(简单处理一下,不影响整体效果)——————————————————
md=mod(M,N);
if(md~=0)
    recon(1:M,M-md+1:M)=src(1:M,M-md+1:M);%纵向(包含交叉点) 
    recon(M-md+1:M,1:M)=src(M-md+1:M,1:M);%横向(包含交叉点)

    reconclean(1:M,M-md+1:M)=srclean(1:M,M-md+1:M);%纵向(包含交叉点) 
    reconclean(M-md+1:M,1:M)=srclean(M-md+1:M,1:M);%横向(包含交叉点)   
end
figure(1);
subplot(2,2,1);imshow(src);title('噪声图');
subplot(2,2,2);imshow(srclean);title('clean图');
subplot(2,2,3);imshow(recon);title('噪声图重构图(patch&NN)');
subplot(2,2,4);imshow(reconclean);title('clean图重构图(patch&NN)');
MES=sum(sum((srclean-reconclean).^2))/(M*M);     %均方差
PSNR=20*log10(255/sqrt(MES))
以上代码功能:对噪声图进行相似patch匹配处理,然后分别从噪声图和原clean图进行重构

patch matching 图像块匹配算法_第1张图片 
clean图重构相对原clean图的PSNR=33.4344


你可能感兴趣的:(matlab,图像计算,图像相似块匹配,算法,图像重构,图像块匹配,相似块算法)