APP下载

利用Python解数学题 测量滴水湖的水面面积

消息来源:baojiabao.com 作者: 发布时间:2024-05-16

报价宝综合消息利用Python解数学题 测量滴水湖的水面面积

美丽的滴水湖

美丽的滴水湖坐落在上海的东南角,濒临东海,风景秀丽,安静舒适,是旅游、恋爱的绝佳去处。笔者有幸去过一回,对那儿的风土人情留下了深刻的印象,如果有机会,笔者还会多去几次!

滴水湖是个神奇的地方,神奇之处在于它的外形是一个正圆形,这源于城市规划者对临港新城的美好设想。每次路过这个美丽的湖时,笔者总会想:这个湖到底多大呢?

本文将会谈到如何如何得到滴水湖的水面面积。是手动测量?是地质勘测?No,No,No,我们还是借用我们熟悉的工具,那就是Python!什么,Python还能用来测量滴水湖的水面面积?你确定不是在逗我?别急,听笔者娓娓道来~

准备工作

  我们的准备工作很简单,开启百度地图,不需要考虑地图的比例尺,然后截两张图,一张截图(dishuihu.png)里面含有滴水湖的全部,一张截图(lingang_to_dishuihu.png)的一个角是临港大道地铁站,另一个角是滴水湖地铁站。如下图:

  dishuihu.png的大小为720*694, lingang_to_dishuihu.png的大小为444*451. 我们将要用到的工具是Python的影象处理工具模组cv2,它是OpenCV的Python界面。

滴水湖的直径

  首先我们需要将滴水湖的外形,即滴水湖所在的圆,检测出来,我们用的方法是霍夫变换(Hough Transform)圆检测。处理的Python程式码如下:

输出的结果如下:

检测到的圆如下如所示:

事实上,这个圆基本与滴水湖外圈所在的公路的圆重合。因此,我们得到的这个圆是完全OK的。

接下来,我们要测量这个圆的直径。

那么怎么测呢?这时候,就要派上大将lingang_to_dishuihu.png了。这张图片能够帮助我们得到地图的比例尺!But how? 其实呢,很简单。临港大道地铁站到滴水湖地铁站是一条直线,在百度地图上,利用测距工具(在地图右上方的工具箱能找到)得到这两个地铁站的距离是2.6公里,当然,这只是近似距离,但够用了。有了这个距离,我们就能得到图片中的一个画素代表的实际距离,利用以下Python程式码(接上面程式码)得到:

输出结果如下:

在刚才的圆检测中,我们得到滴水湖所在的圆的半径为327.1个画素单位,因此,滴水湖的直径为327.124.11,约为2686.77米,那么,滴水湖的面积为566.96万平方米。额,这样算出来的会对吗?来看看百度百科的说法吧。

这简直棒呆了!

下一步工作,就是求解滴水湖的水面面积~

滴水湖的水面面积

什么是滴水湖的水面面积?那就是湖的水面的面积,也就是图片中的蓝颜色部分。可是,水面的形状看上去如此不规则,该怎么计算呢?别担心,山人自有妙计。

第一步,去掉环形公路的外部部分,将其颜色设定为白色,避免将环形公路外的水面加进来。处理的Python程式码(接上面的程式码)如下:

处理后的图片如下:

  第二步,绘制刚才图片的灰色直方图,为了求出图片的颜色阈值,以方便后续对图片做二值化处理。处理的程式码(接上面程式码)如下:

得到颜色直方图分布如下:

由此可以分析得到,湖水的颜色应该在214附近。

第三步,先对刚才的灰度图片进行中值滤波,然后对其进行二值化(黑白)处理,设定阈值为220,处理的程式码(接上面程式码)如下:

得到的二值化后的图片如下:

可以发现,这张图片中的黑色部分与滴水湖的水面基本上是重合的。因此,我们可以用图片的黑色部分来代替滴水湖的水面,为此,我们只需要计算黑色画素的个数,这样,我们就能求出滴水湖的水面面积了喂!

第四步,计算滴水湖的水面面积。处理的程式码如下(接上面程式码):

输出的结果如下:

额,这样计算出来的水面面积会靠谱吗?下面,我们手动地来估算一下滴水湖的水面面积。

我们假设湖面的平均半径为1.2公里,再减去湖中三个小岛的面积,就是水面面积了。

因此,手动估算湖面的面积为π∗1200∗1200/10000−23.5−6−14π∗1200∗1200/10000−23.5−6−14,约为408.89万平方米,当然,我们还漏算了正上方的那个小湖。

总的来说,我们计算出来的滴水湖的水面面积,在允许的误差范围内,还是靠谱的。

问题来源

  笔者在乘车去阳澄湖的时候,查了一下阳澄湖的百度百科介绍,讲到了阳澄湖的蓄水量。之后又查了湖泊的蓄水量的计算方法,大概是利用微积分的思想求解的。当然,在地图上,是无法求出湖泊蓄水量的,但是,估算湖泊的水面面积应该还是可以的。因此,笔者找了之前去过的滴水湖作为实验样本,发现还是能估算出来的。

总结

以上内容纯属自娱自乐,不能作为严谨地测量湖泊水面面积的方法。如有任何问题,欢迎大家交流~

最后附上本文图片处理过程中完整的Python程式码,供大家参考。

附录

完整的Python程式码如下:

2019-12-07 23:15:00

相关文章