本周的文件交换选择

我们最好的用户提交

把船陷入困境!

在这个博客文章中,我想让在Mathworks旁边的池塘里陷入困境的池塘中的曾经被占用的货船。这个博客帖子由Ned Gulely使用的启发曾经有过

内容

拿到船

我们将从公共来源下载该船并将其隔离。

船舶= 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),高度(船),宽度(船));shipmask = imerode(Shormask,strel(“磁盘”,2));图TileDlayout(2,1,TileSpacing =“袖珍的”,填充=“紧的”)NextDile imshow(ShipMask)NextTile Ship =船舶。*铸(船员,班级(船舶));imshow(船)

从船舶面具获取方向并将其应用于原始图像。

ShipProps = RegionProps(ShipMask,“方向”)Shophorizo​​Ntal = imrootate(船舶,-Shipprops.Oorientation);图imshow(shophorizo​​ttal)
ShipProps =带有字段的结构:方向:19.5882

作物只是船

ShipBox = RegionProps(逻辑(Shophorizo​​Ntal(:,:,1)),“绑定盒”)Shipthumb = Imcrop(Shophorizo​​Ntal,ShipBbox.BoundingBox);imshow(shopthumb)
HACKBBOX = Struct with字段:boundingbox:[181.5000 320.5000 427 67]

下载湖畔卫星图像

我们将从USGS下载我们关心的区域的卫星图像。我将交互地选择我关心的区域的区域限制。

如果错误的%交互式选择限制w = webmap [latlim,lonlim] = wmlimits(w)别的Latlim = [42.2966508472710 42.305379620710 42.30537962534711] LONLIM = [-71.3800315706306 -71.3639383165411]结尾
Latlim = 42.2967 42.3054 Lonlim = -71.3800 -71.3639

找到Ortho图层并为此区域下载。

ortho = wmsfind('usgsimageryonly',searchfield ='serverurl');[湖畔,湖畔湖娘] = WMSREAD(ORTHO,LATLIM = LATLIM,LONLIM = LONLIM);图Geoshow(湖边,湖畔湖娘)轴紧的

为“对接”准备船

我想把船放在Rt 9之间的小湖泊和马克斯的湖畔校园内的铁路轨道。它看起来像一个船的方向会很好。

shipn75 = imrootate(shopthumb,-75,'最近');图imshow(shipn75);

我们将以米为单位,需要船的尺寸。一个快速的网络搜索说长度是399.94m.并且梁是58.8M.

shiplength = 399.94;船坞= 58.8;

同时将使用图像的长度与宽度的比率。

Props = RegionProps(逻辑(Shipn75(:,:,1)),“majoraxislength”“mintelaxislength”);image_shipratio = props.majoraxislength / props.minoraxislength actual_shipratio = shiplength / shipbeam
image_shipratio = 6.7436实际_shipratio = 6.8017

我很满意(!)特别考虑我刚用绘制的多边形近似船只。

现在我们需要弄清楚这个旋转图像的大小以米为单位。假设船舶是一个完美的矩形,我们可以使用一些三角形来计算这种大小。已经完成了这一点,这是一段时间,所以我爆发了一个值得信赖的信封,并试图记住SOH-CAH-TOA。图像尺寸的方程是:

IMGHEIGHTM = SHOPBEAM * SIND(15)+ SHIPLength * COSD(15)IMGWIDTHM = SHIPLength * SIND(15)+ SIPBEAM * COSD(15)
IMGHEIGHTM = 401.5309 IMGWIDTHM = 160.3085

最后,我们需要将图像的背景转换为NaN,因此当我们绘制它显示为透明时。这是所有频道为0的地方。

Shipoverlay = IM2double(Shopn75);Shipoverlay(Repmat(所有(〜Sacoporlay,3),[1 1 3]))= NaN;

为船准备湖边

我们需要将卫星图像从地理坐标(LAT / LON)投影到笛卡尔坐标(米米的X / Y),以覆盖船上。我们将使用质量状态平面坐标参考系统,该参考系统针对马萨诸塞州进行了优化。一个快速的网络搜索告诉我这个坐标系的代码是26986

p = projcrs(26986)[latgrid,longrid] = GeographicGrid(Lakesidereference);[Xgrid,Ygrid] = projfwd(p,latgrid,longrid);图Mapshow(Xgrid,Ygrid,湖边)轴紧的
P =具有属性的Projcrs:名称:“Nad83 / Massachusetts大陆”地理COINGCLS:[1×1 Geocrs]投影筛选:“Lambert Conic Conformal(2SP)”LextureInit:“仪表”投影参数:[1×1 map.crs.projectionParameters]

我将使用DataTip找到船应该去的左上角。Live编辑器给了我以下代码来重现它。

斧头= GCA;图表= ax.children(1);DataTip(图表,210495,894667);

由于地图现在处于投影坐标,因此X / Y值表示仪表。我们可以创建描述船舶图像和位置的像素大小的地图参考单元,然后使其变得容易地绘制。

XPT = 210495;YPT = 894667;MR = MAPREFCELLS([XPT XPT + IMGWIDTHM],[YPT-IMGHEIGHTM YPT],大小(SHIPOVERLAY,[1 2]),ColumnSstartFrom =“北”
MR = MapCellsReference与属性:XWorldLimits:[210495 210655.308527484] YWorldLimits:[894265.469065182 894667] RasterSize:[432 177] RasterInterpretation: '细胞' ColumnsStartFrom: '北' RowsStartFrom: '西方' CellExtentInWorldX:0.905697895390393 CellExtentInWorldY:0.929469756523354 RasterExtentInWorldX:160.3085274841 RasterExtentInWorldY:401.530934818089新生林利用:[0.5 177.5]金林根林:[0.5 432.5]转换型:'直线'CoordinateSystemtype:'Planar'Projectedcrs:[]

坚持船!

现在我们最终可以将湖边形象覆盖在顶部以上。

图持有Mapshow(Xgrid,Ygrid,Lakeside)S = Mapshow(零(大小(Shifoverlay,[1 2])),MR,DisplayType =“表面”,cdata = shipoverlay);轴紧的xticks([])yticks([])

|
  • 打印
  • 发送电子邮件

注释

要发表评论,请点击这里登录您的MathWorks帐户或创建新的。