当下一款休闲小游戏 “找不同”。给出两幅相似图片找其中不同点,如下图
随着游戏等级提升,很难一眼看出不同之处。MATLAB图像分析有一个减法运算,即两张图像做减法,相同的像素被抹去,剩下的就是不同的像素。但是减法运算要求两张图片尺寸相等(即水平方向和垂直方向的像素大小相同),如果有这两个图片的文件还好说,如上图这种就需要使用分割算法将两个图片从图中抠出来,再做运算。关键之处在于两点
1、分割出来的图尺寸相等。2、分割后的图要保留图片信息一样。
先上效果图:
图中高亮的部分是不同的地方(不知道您之前看出来没有)。得到此图还可以检测高亮区域并在原图中绘制出来,更容易一眼看出结果(此处不做该部分)。
介绍一下思路
- 读取图片并灰度化处理
- canny算子边缘检测
- hough变化找出图片边缘的矩形直线从而得出图像分割边界数据
- 处理边界数据
- 减法运算
源码如下:
clear;clc;
img=imread('yuantu.jpg');
a=rgb2gray(img);
[m n]=size(a);
a1=edge(a,'canny');
[H, theta, rho]= hough(a1,'RhoResolution', 2); %%霍夫变化
peak=houghpeaks(H,5); %%huofu空间交点投票
lines=houghlines(a1,theta,rho,peak); %%霍夫反变化得出直线
sum_L=0;ave=0;sum_R=0;cont1=0;cont2=0;max=0;mid=0;det=0;%%定义一些变量
for p=1: length(lines)
if lines(p).theta==-90
min=lines(p).point1(2);
end
end
for k=1:length(lines) %%遍历得到的直线
if lines(k).theta==0 %%查找竖直方向的直线
if lines(k).point1(1)<n/2 %%左边界线
sum_L=lines(k).point1(1)+lines(k).point2(1)+sum_L;cont1=cont1+1;%%记录做边界线位置和条数
else%%右边界线
sum_R=lines(k).point1(1)+lines(k).point2(1)+sum_R;cont2=cont2+1;%%记录右边界线位置和条数
end
else if lines(k).theta==-90 %%查找水平方向的直线
if lines(k).point1(2)>max %%找到下面图片的下边界
max=lines(k).point1(2);
else if lines(k).point1(2)<min %%找到上面图片的上边界
min=lines(k).point1(2);
end
end
end
end
end
nip=round((max-min)/2+min); %%计算上下边界中间线
for ii=1:length(lines)
if lines(ii).theta==-90
if lines(ii).point1(2)<nip&&lines(ii).point1(2)>min %%认为是第一张图的下边界
mid=lines(ii).point1(2);
det=mid-min;break; %%记录图片上下宽度
else if lines(ii).point1(2)>nip&&lines(ii).point1(2)<max %%认为是第二张图的上边界
mid=lines(ii).point1(2);
det=max-mid;break; %%记录图片上下宽度
end
end
end
end
ch_L=round(sum_L/(cont1*2));ch_R=round(sum_R/(cont2*2)); %%计算图片左右平均边界线位置
pic1=a(min:min+det,ch_L:ch_R);%%分割出第一个图片
pic2=a(max-det:max,ch_L:ch_R);%%分割出第二个图片
%%%%%显示原图探索效果%%%%%%
%figure(10);imshow(img);hold on;
%for k=1:length(lines)
%%%%%%绘制图片边界%%%%%%%%
%plot([lines(k).point1(1),lines(k).point2(1)],[lines(k).point1(2),lines(k).point2(2)],'linewidth',1,'color','red');
%end
%%%%%%显示分割效果%%%%%
%figure(11);imshow(pic1);title('image1');
%figure(12);imshow(pic2);title('image2');
%%%%%%显示寻找结果%%%%%
res=pic2-pic1; %%减法运算
figure(13);imshow(res);title('look here!');%%显示运算结果
详情见注释;
最后我们再来一个截图试试效果:
运行效果如下
效果不错!