利用MATLAB霍夫变化完成图像分割玩“找不同”

当下一款休闲小游戏 “找不同”。给出两幅相似图片找其中不同点,如下图
游戏原图
随着游戏等级提升,很难一眼看出不同之处。MATLAB图像分析有一个减法运算,即两张图像做减法,相同的像素被抹去,剩下的就是不同的像素。但是减法运算要求两张图片尺寸相等(即水平方向和垂直方向的像素大小相同),如果有这两个图片的文件还好说,如上图这种就需要使用分割算法将两个图片从图中抠出来,再做运算。关键之处在于两点
1、分割出来的图尺寸相等。2、分割后的图要保留图片信息一样。
先上效果图:
在这里插入图片描述
图中高亮的部分是不同的地方(不知道您之前看出来没有)。得到此图还可以检测高亮区域并在原图中绘制出来,更容易一眼看出结果(此处不做该部分)。

介绍一下思路

  1. 读取图片并灰度化处理
  2. canny算子边缘检测
  3. hough变化找出图片边缘的矩形直线从而得出图像分割边界数据
  4. 处理边界数据
  5. 减法运算

源码如下:

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!');%%显示运算结果

详情见注释;
最后我们再来一个截图试试效果:
原始图片

运行效果如下
在这里插入图片描述
效果不错!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值