这个夏天,席卷全球(什么时候可以席卷到中国= =)的Pokémon Go吸引了各路宅男宅女走出房间,更有大神把它和MATLAB联系在一起,使用图像处理技术黑入游戏,自动搜索PokéStops,抓住小精灵们!
如何实现的呢?
首先获取游戏截图:
url = 'http://blogs.mathworks.com/steve/files/pokemon-go-screen.jpg';
rgb = imread(url);imshow(rgb)
图片里的蓝色圆环部分代表了PokéStop。我们的任务是在地图上自动搜素到它们。这里是关键的几步:
通过颜色对图像分区;
使用形态学闭运算清理分割区域;
计算连通部分的面积和图心;
选择最大对象。
首先,可以使用Color Thresholder,通常和Lab color space一起,根据颜色对图像分区。下图显示了通过调整a*和b*的阈值来选出PokéStop的颜色区间。
使用imshow看一下分区结果:
第二步,使用形态学闭运算进一步调整PokéStop的图形:
BW2 = imclose(BW,strel('disk',20));
imshow(BW2)
结果如下:
第三步,使用regionprops找到所有连通域,并计算面积和图心。
在最新版的Image Processing Toolbox中,你可以让regionprops以列表的方式返回计算结果,更加易读:
t = regionprops('table',BW2,'area','centroid')
t =
Area Centroid
_____ ________________ 1157 37.43 665.14 13259 260.56 313.99 2 217 49.5 6 259 31.5 1 265 82 6 356.5 31.667 12 387.5 31.5
最后,找到其中最大的区域,并返回图心位置:
[~,j] = max(t.Area);
location = t.Centroid(j,:)
location =
260.5581 313.9893
在最初的截图中检验一下计算结果:
imshow(rgb)
hold on
plot(location(1),location(2),'dy','MarkerSize',10,'MarkerFaceColor','y')
hold off
全部0条评论
快来发表一下你的评论吧 !