MATLAB:利用灰度投影法进行图像配准

图像配准中可以利用灰度在水平和竖直方向进行累加投影,然后利用两条曲线进行配准。
灰度投影法用于配准十分简单。主要有以下步骤:
1、如果是RGB图像,先将图像转化为gray图像
2、根据gray图像,分别向水平和竖直方向投影,计算每一行或者每一列中所有像素的和
3、在水平和垂直方向分别设定一个搜索范围和步长,并计算两个曲线的差值
4、选择相差最小的位置作为最优结果

clear; clc;
% result:
% vertical: 52
% horizon: 48

%% read img data
img1 = imread('one.jpg');
img2 = imread('two.jpg');
img1 = rgb2gray(img1);
img2 = rgb2gray(img2);

[row, column] = size(img1);

%% project the src(source) img in horizon and vertical
horizonImg1 = zeros(1,row);
horizonImg2 = zeros(1,row);
verticalImg1 = zeros(1, column);
verticalImg2 = zeros(1, column);

for i=1:row
    horizonImg1(1,i) = sum(img1(i,:));
    horizonImg2(1,i) = sum(img2(i,:));
end

for i=1:column
    verticalImg1(1,i) = sum(img1(:,i));
    verticalImg2(1,i) = sum(img2(:,i));
end

%% plot the project of src img
figure,
% subplot(211),
verticalImg1_projection_src = verticalImg1;
plot(verticalImg1_projection_src,'-or','markersize',3)
hold on
% title('vertical-1')
% subplot(212),
verticalImg2_projection_src = verticalImg2;
plot(verticalImg2_projection_src,'-ob','markersize',3)
% title('vertical-2')
title('vertical - src')
xlabel('方向')
ylabel('the sum of pixel value')

figure,
% subplot(211),
horizonImg1_projection_src = horizonImg1;
plot(horizonImg1_projection_src,'-or','markersize',3)
hold on;
% title('horizon-1')
% subplot(212),
horizonImg2_projection_src = horizonImg2;
plot(horizonImg2_projection_src,'-ob','markersize',3)
% title('horizon-2')
title('horizon - src')
xlabel('方向')
ylabel('the sum of pixel value')

%% compute the error in horizon, the image 1 is referenced
region = 200; % 匹配总范围
stepHorizon = 2; % 步长
start = 2; % 匹配起点
errorHorizon = inf * ones(1, floor(region-start)/stepHorizon+1);
for position=start:stepHorizon:region
    horizonImg1_ = horizonImg1(1,1:row - position + 1);
    horizonImg2_ = horizonImg2(1,position:row);
    errorHorizon(1,(position-start)/stepHorizon+1) = sum(abs(horizonImg1_ - horizonImg2_));
end
minErrorHorizon = min(errorHorizon);
minErrorIndexHorizon = stepHorizon * (find(errorHorizon == minErrorHorizon) - start) + start; % may be not only one

%% compute the error in vertical, the image 1 is referenced too
regionVertical = 200;
stepVertical = 2;
start = 2;
errorVertical = inf * ones(1, floor(regionVertical - start)/stepVertical + 1);
for position=start:stepVertical:regionVertical
    verticalImg1_ = verticalImg1(1,1:column-position+1);
    verticalImg2_ = verticalImg2(1,position:column);
    errorVertical(1, (position - start) / stepVertical + 1) = sum(abs(verticalImg2_ - verticalImg1_));
end
minErrorVertical = min(errorVertical);
minErrorIndexVertical = stepVertical * (find(errorVertical == minErrorVertical) - start) + start; % may be not only one

%% change the no-reference image
img2 = imread('two.jpg');
img2 = img2(minErrorIndexHorizon(1):end, minErrorIndexVertical(1):end,:);
figure,imshow(img2)

img1 = imread('one.jpg');
img1 = img1(1:row-minErrorIndexHorizon, 1:column-minErrorIndexVertical, :);
figure, imshow(img1);

[row, column] = size(img1);
horizonImg1 = zeros(1,row);
horizonImg2 = zeros(1,row);
verticalImg1 = zeros(1, column);
verticalImg2 = zeros(1, column);

%% compute the align images and gray projection curve
for i=1:row
    horizonImg1(1,i) = sum(img1(i,:));
    horizonImg2(1,i) = sum(img2(i,:));
end

for i=1:column
    verticalImg1(1,i) = sum(img1(:,i));
    verticalImg2(1,i) = sum(img2(:,i));
end

figure,
% subplot(211),
plot(verticalImg1,'-or','markersize',3)
hold on
plot(verticalImg1,'-or','markersize',3)
% title('vertical-1')
% subplot(212),
plot(verticalImg2,'-ob','markersize',3)
% title('vertical-2')
title('vertical - after align')

figure,
% subplot(211),
plot(horizonImg1,'-or','markersize',3)
hold on;
% title('horizon-1')
% subplot(212),
plot(horizonImg2,'-ob','markersize',3)
% title('horizon-2')
title('horizon - after align')

以下,看一下结果并分析:
原图像,可以看到原图像左边是有不一样的地方的。
这里写图片描述
这里写图片描述
原图像对应的灰度投影曲线:
水平方向
垂直方向
再看配准后的投影曲线:
水平方向
垂直方向
配准后的图像对比
这里写图片描述
这里写图片描述

注意:由结果可见,配准效果不是非常好。投影曲线并没有重合。还相差一个距离。
这是由于灰度投影法无法解决旋转问题。

有兴趣的人,可以用faststone软件比较两幅图片是否有旋转。实际上,是有一个沿着左上角和右下角的一个旋转。

猜你喜欢

转载自blog.csdn.net/qq_27261889/article/details/81322388