图像自身有很多相似性的结构:例如大块单色、规整的边缘等
块匹配利用了这种相似结构进行平均或滤波,可以较好的还原图片
利用块匹配较为出名的算法有:NonLocal Means、BM3D等
CS_NLR算法中作者给出的块匹配函数如下:
function pos_arr = Block_matching(im, par)
% im读入图片, par是一个参数结构体,里面含有提前设置好的参数
S = 20;
f = par.win;
% par.win 是块匹配的大小
f2 = f^2;
s = par.step;
% par.step 是块匹配移动的步长
% 在CS_NLR算法中step = min{par.win-1, 6}
N = size(im,1)-f+1;
M = size(im,2)-f+1;
r = [1:s:N];
% r是每一块行的索引值
r = [r r(end)+1:N];
c = [1:s:M];
% c是每一块列的索引值
c = [c c(end)+1:M];
L = N*M;
X = zeros(f*f, L, 'single');
k = 0;
for i = 1:f
for j = 1:f
k = k+1;
blk = im(i:end-f+i,j:end-f+j);
X(k,:) = blk(:)';
% X(k, :)是第k块,这个块在原来图片中的位置为[i:i+6, j:j+6]
end
end
% Index image
I = (1:L);
I = reshape(I, N, M);
N1 = length(r);
M1 = length(c);
pos_arr = zeros(par.nblk, N1*M1 );
X = X';
for i = 1 : N1
for j = 1 : M1
row = r(i);
col = c(j);
off = (col-1)*N + row;
off1 = (j-1)*N1 + i;
rmin = max( row-S, 1 );
rmax = min( row+S, N );
cmin &