本周最佳文件交换选择

我们最好的用户提交

把船卡住!

在这篇博文中,我想让这艘曾经给过我的货船在MathWorks旁边的池塘里按比例搁浅有没有给过你

内容

上船

我们会从公共资源下载飞船并隔离它。

船= imread ('https://e3.365dm.com/21/03/768x432/skynews-ever-given-suez-canal_5320248.jpg?20210327160438');imshow(船舶)

我可能会想出一种方法来自动分割飞船,但我只需要做一次,所以我只需要画多边形并遮罩它。

如果在船的边界上绘制多边形p = drawpolygon;其他的装载(“p.mat”“p”)imshow(“eg.png”结束

基于多边形蒙版船只,并将其应用到原始图像。

shipmask = poly2mask (p。Position(:, 1), p.Position(:, 2), height(船),width(船));Shipmask = imeroy (Shipmask, strel(“磁盘”, 2)); 图:平铺布局(2、1、平铺布局)=“紧凑型”填充=“紧”) nexttile imshow(船舶掩码)nexttile ship =船舶。*铸造(shipmask、类(船));imshow(船)

从舰船遮罩获取方向并将其应用于原始图像。

shipprops = regionprops (shipmask,“方向”)shiphorizontal=imrotate(船舶,-shipprops.方向);图imshow(船舶水平)
shipprops=带字段的结构:方向:19.5882

切到船上

/ / / / / / / / / / / / / / / / / / /“边界框(“大小))shipthumb=imcrop(shiphorizontal,ShipBox.BoundingBox);imshow(shipthumb)
shipbbox = struct with fields: BoundingBox: [181.5000 320.5000 427 67]

下载湖滨卫星图像

我们会为我们关心的地区下载美国地质调查局的卫星图像。我将交互式地为我关心的区域选择区域限制。

如果%以交互方式选择限制w=webmap[latlim,lonlim]=wmlimits(w)其他的latlim=[42.296650847271042.305379653471]lonlim=[-71.3800315706306-71.3639383165411]结束
lonlim = -71.3800 -71.3639

找到正射孔层,下载这个区域。

正交=wmsfind(“usgsimageryonly”SearchField =“serverurl”); [lakeside,lakesidereference]=wmsread(正交,latlim=latlim,lonlim=lonlim);图geoshow(湖边,湖边参考)轴

为“靠泊”做好准备

我想把船放在9号公路和紧靠MathWorks湖边校园的铁路轨道之间的小湖里。它看起来像一艘船,方向大约会很好的。

Shipn75 = imrotate(shipthumb, -75,“最近的”);图imshow (shipn75);

我们将以米为单位工作,需要船的尺寸。在网上快速搜索一下,长度是399.94米光束是58.8米

shiplength = 399.94;shipbeam = 58.8;

同时将检查长宽比与我们的图像。

道具= regionprops(逻辑(shipn75 (:,: 1)),“MajorAxisLength”“MinorAxisLength”);image_shipratio = props.MajorAxisLength /道具。minoraxlength actual_shiratio =船长/船梁
图像装运率=6.7436实际装运率=6.8017

我很高兴这样做(!),特别是考虑到我只是用绘制的多边形来近似这艘船。

现在我们需要计算出旋转图像的大小,单位为米。假设飞船是一个完美的矩形,我们可以使用一些三角法计算这个大小。我已经有一段时间没有这样做了,所以我打开一个可靠的信封,试着记住soh cah toa。图像尺寸的方程是:

imgwidthm = shiplength*sind(15)+shipbeam*cosd(15)
imghightm = 401.5309 imgwidthm = 160.3085

最后,我们需要将图像的背景转换为NaN,这样当我们绘图时它就会显示为透明。这里所有的通道都是0。

shipoverlay=im2double(shipn75);shipoverlay(repmat(all(~shipoverlay,3),[1-13]))=NaN;

在湖边准备一艘船

我们需要将卫星图像从地理坐标(lat/lon)投影到笛卡尔坐标(x/y,单位为米)以覆盖船。我们将使用马萨诸塞州优化的质量状态平面坐标参考系。快速网络搜索告诉我,该坐标系的代码为26986

p = projcrs(26986) [latgrid, longrid] = geoicgrid (lakesidreference);[xgrid, ygrid] = projfwd(p, latgrid, longrid);图mapshow (xgrid ygrid,湖边)轴
p = projects with properties: Name: "NAD83 / Massachusetts Mainland"地理学crs: [1×1 geocrs] ProjectionMethod: "Lambert Conic Conformal (2SP)"ProjectionParameters: [1×1 map.crs.ProjectionParameters]

我将使用数据提示来找到左上角的船应该去的地方。实时编辑器给了我下面的代码来复制它。

甘氨胆酸ax =;图= ax.Children (1);datatip(图表、210495、894667);

由于地图现在处于投影坐标中,x/y值表示米。我们可以创建地图参考单元,用于描述船只图像的像素大小和位置,从而使绘制变得简单。

xpt=210495;ypt=894667;mr=maprefcells([xpt-xpt+imgwidthm],[ypt-imgheightm-ypt],大小(shippoverlay[1 2]),列开始自=“北方”
mr=MapCells与属性的引用:XWorldLimits:[210495 210655.308527484]YWorldLimits:[894265.469065182 894667]光栅大小:[432 177]RasterInterpretation:'cells'ColumnStartFrom:'north'Rows StartFrom:'west'CellExtentInWorldX:0.905697895390393 CellExtentInWorldY:0.929469756523354 RasterExtentInWorldX:160.3085274841 RasterExtentInWorldY:401.530934818089 XIntrinsicLimits:[0.5177.5]YIntrinsicLimits:[0.5432.5]TransformationType:“直线”坐标系统Type:“平面”投影CR:[]

把船!

现在我们终于可以绘制湖边的图像了,在顶部按比例叠加。

图保存mapshow(xgrid, ygrid, lakeside) s = mapshow(zero (size(shipoverlay, [1 2])), mr, DisplayType=“表面”CData = shipoverlay);轴xticks ([]) yticks ([])

|
  • 打印
  • 发送电子邮件

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。