数字图像处理 找出两幅图像中有几处不同(含有位移)
分析:因为两幅图片含有相对位移,首先是找到相对的位移,还原到本来的位置,再做差找出不同,在原图上标记出来。
代码:
close all;
f=imread('hw1_painting_1.jpg');
g=imread('hw1_painting_2.jpg');
min=sum(sum(abs(f).^2));
%寻找位移量
for i=-5:5 %第一次循环是从-50,50 结果得出之后,考虑到运行速度,变成了-5,5
for j=-5:5
se = translate(strel(1), [i j]); % 向下和向右移动i j个位置
J = imdilate(f,se); %平移之后的图像,对f进行平移,使之与g相同
J1=rgb2gray(J); %将彩色图片转换成灰色
g1=rgb2gray(g);
C=J1-g1; %进行图像减法 得到两幅图像的差别
mo=sum(sum(abs(C).^2)); %计算C的模
if mo<min
min=mo;
m=i;n=j; %记录位移
end
end
end
se = translate(strel(1), [m n]); % 向下和向右移动m n个位置
f1= imdilate(f,se); %平移之后的图像 此时f1和g已经没有错位了
fin1=f1-g; %考虑到图像相减有负值,负值显示不出来,故用(f1-g),(g-f1)
fin2=g-f1;
fin=2*fin1+2*fin2; %为了使结果更明显,进行了线性增强
%进行原图标记
fin1=rgb2gray(fin); %将彩色图片转换成灰色
b = imbinarize(fin1); %转化成二值图像
shuzu = strel('square', 6); %创造一个6*6的矩阵元素
pengzhang = imdilate(b, shuzu); %进行膨胀
subplot(224);
imshow(pengzhang);
liantong = bwlabel(pengzhang); %标记连通区域
stats = regionprops(liantong);
num = length(stats) ; %连通域总个数
subplot(221);
imshow(f);
hold on
for index=2:num
rectangle('Position',stats(index).BoundingBox,'curvature',[1,1],'LineWidth',1,'EdgeColor','r') ;
end
subplot(222);
imshow(g);
for index=2:num
rectangle('Position',stats(index).BoundingBox,'curvature',[1,1],'LineWidth',1,'EdgeColor','r') ;
end
subplot(223);
imshow(fin);
结果: