图像矩
<pre><code class="language-python">import numpy as np
import pandas as pd
import math
import meteva.base as meb
import meteva.method as mem
import pprint</code></pre>
<h1>图形矩检验</h1>
<p><font face="黑体" color=Blue size=4><strong>imomenter_matrix(look_merge)</strong></font> </p>
<p>计算一个目标的体积、质心位置、方向角和二阶矩等属性。(Hu,1962年)。<br />
参考文献: Hu M K .Visual Pattern Recognition by Moment Invariants[J].Information Theory, IRE Transactions on, 1962, 8(2):179-187.DOI:10.1109/TIT.1962.1057692.</p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数</th>
<th style="text-align: center;">说明</th>
<th style="text-align: left;">备注</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Blue size=5>look</font></strong></td>
<td style="text-align: center;">merge_force函数的返回结果</td>
<td style="text-align: left;">字典</td>
</tr>
</tbody>
</table>
<p><strong>————————————————————————————————————————————————————————————————————————————————————————————————————————————</strong>
<font face="黑体" color=Green size=4><strong>imomenter_matrix函数返回结果内容说明</strong></font> </p>
<table>
<thead>
<tr>
<th style="text-align: left;">一级关键词</th>
<th style="text-align: left;">二级关键词</th>
<th style="text-align: left;">三级关键词</th>
<th style="text-align: left;">四级关键词</th>
<th style="text-align: left;">五级关键词</th>
<th style="text-align: left;">说明</th>
<th style="text-align: left;">备注</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>time</font></strong></td>
<td style="text-align: left;"></td>
<td style="text-align: left;">预报场的起报时间</td>
<td style="text-align: left;">字符串</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>dtime</font></strong></td>
<td style="text-align: left;"></td>
<td style="text-align: left;">预报场的预报时效</td>
<td style="text-align: left;">整数</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>match_count</font></strong></td>
<td style="text-align: left;"></td>
<td style="text-align: left;">匹配的目标对数</td>
<td style="text-align: left;">整数</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>feature_table</font></strong></td>
<td style="text-align: left;"></td>
<td style="text-align: left;">feature_table函数的返回结果</td>
<td style="text-align: left;">字典</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>interester</font></strong></td>
<td style="text-align: left;"></td>
<td style="text-align: left;">相似度结果</td>
<td style="text-align: left;">当return_all_info为True时,<br>其内容如interester函数返回结果;<br><br>为False时返回size= match_count的一维数组,<br>其中记录了成功匹配的目标对直接的相似度</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>1</font></strong></td>
<td style="text-align: left;"></td>
<td style="text-align: left;">编号为1的观测和预报目标的属性及检验结果</td>
<td style="text-align: left;">字典</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>imomenter_matrix</font></strong></td>
<td style="text-align: left;"></td>
<td style="text-align: left;">编号为1的观测和预报目标的轴属性</td>
<td style="text-align: left;">字典</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>ob</font></strong></td>
<td style="text-align: left;"></td>
<td style="text-align: left;">编号为1的观测目标的属性</td>
<td style="text-align: left;"></td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>volume</font></strong></td>
<td style="text-align: left;"></td>
<td style="text-align: left;">编号为1的观测目标的体积,对【格点面积×降水量】进行积分</td>
<td style="text-align: left;">单位:mm × ° ×°</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>centroid</font></strong></td>
<td style="text-align: left;"></td>
<td style="text-align: left;">目标质心的位置,以每个格点的降水量作为权重,计算目标的质心位置</td>
<td style="text-align: left;">字典</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>x</font></strong></td>
<td style="text-align: left;">目标质心的位置经度坐标</td>
<td style="text-align: left;">单位: ×°</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>y</font></strong></td>
<td style="text-align: left;">目标质心的位置纬度坐标</td>
<td style="text-align: left;">单位: ×°</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>OrientationAngle</font></strong></td>
<td style="text-align: left;">以格点降水量作为权重计算得到的目标倾角,0-180°</td>
<td style="text-align: left;">字典</td>
</tr>
<tr>
<td style="text-align: left;"><font face="黑体" color=Green size=3><strong>cov</strong></font></td>
<td style="text-align: left;">二阶矩</td>
<td style="text-align: left;">字典</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>cov_xx</font></strong></td>
<td style="text-align: left;">对【(格点经度-质心经度)的平方×格点降水量×格点面积/volume】 进行积分</td>
<td style="text-align: left;">实数</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>cov_yy</font></strong></td>
<td style="text-align: left;">对【(格点纬度-质心纬度)的平方×格点降水量×格点面积/volume】 进行积分</td>
<td style="text-align: left;">实数</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>cov_xy</font></strong></td>
<td style="text-align: left;">对【(格点纬度-质心纬度)×(格点经度-质心经度)×格点降水量×格点面积/volume】 进行积分</td>
<td style="text-align: left;">实数</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>fo</font></strong></td>
<td style="text-align: left;"></td>
<td style="text-align: left;">编号为1的预报目标的轴属性,形式和ob相同</td>
<td style="text-align: left;">字典</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Green size=3>...</font></strong></td>
<td style="text-align: left;">其它编号的观测和预报属性,形式如同1</td>
</tr>
</tbody>
</table>
<p><strong>调用示例</strong></p>
<pre><code class="language-python"># 读取观测和预报数据
grid1 = meb.grid([100, 120, 0.05], [24, 40, 0.05])
path_ob = r'H:\test_data\input\mem\mode\ob\rain03\20072611.000.nc'
path_fo_03 = r'H:\test_data\input\mem\mode\ec\rain03\20072608.003.nc'
path_fo_27 = r'H:\test_data\input\mem\mode\ec\rain03\20072508.027.nc'
grd_ob = meb.read_griddata_from_nc(path_ob, grid=grid1, time=&quot;2020072611&quot;, dtime=0, data_name=&quot;OBS&quot;)
grd_fo_03 = meb.read_griddata_from_nc(path_fo_03, grid=grid1, time=&quot;2020072608&quot;, dtime=3, data_name=&quot;ECMWF&quot;)
grd_fo_27 = meb.read_griddata_from_nc(path_fo_27, grid=grid1, time=&quot;2020072508&quot;, dtime=27, data_name=&quot;ECMWF&quot;)
look_ff = mem.mode.feature_finder(grd_ob, grd_fo_03, smooth=5, threshold=5, minsize=5)
print(&quot;*** 目标识别完成 ***\n&quot;)
look_match = mem.mode.centmatch(look_ff)
look_merge = mem.mode.merge_force(look_match)
mem.mode.plot_value_and_label(look_merge)</code></pre>
<pre><code>*** 目标识别完成 ***</code></pre>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=8447df2f87ac9bd66a992bb94dc482e7&amp;file=file.png" alt="" /></p>
<pre><code class="language-python">result = mem.image_moments.imomenter_matrix(look_merge)
pprint.pprint(result) </code></pre>
<pre><code>{1: {'imomenter_matrix': {'fo': {'OrientationAngle': 0.4343390746601114,
'centroid': {'x': 107.08620670630734,
'y': 29.57289432014575},
'cov': {'cov_xx': 7.453508867813763,
'cov_xy': 3.207802864165347,
'cov_yy': 2.0264467730568185},
'volume': 190.13112520000004},
'ob': {'OrientationAngle': 0.4079402761185016,
'centroid': {'x': 108.07048017184957,
'y': 29.48064243681245},
'cov': {'cov_xx': 10.746954291434704,
'cov_xy': 4.3134368786080275,
'cov_yy': 2.630611893772771},
'volume': 251.43260920000003}}},
2: {'imomenter_matrix': {'fo': {'OrientationAngle': 0.536880733219785,
'centroid': {'x': 115.34693577641487,
'y': 33.94236960269696},
'cov': {'cov_xx': 0.6643036367643437,
'cov_xy': 0.28894460380579406,
'cov_yy': 0.35082264880908043},
'volume': 26.923833300000013},
'ob': {'OrientationAngle': 0.6986057080783061,
'centroid': {'x': 115.5497600163589,
'y': 33.65706564738658},
'cov': {'cov_xx': 0.3459030648223052,
'cov_xy': 0.2021815754048839,
'cov_yy': 0.2749981261118228},
'volume': 21.589721600000015}}},
3: {'imomenter_matrix': {'fo': {'OrientationAngle': -0.08866110200817028,
'centroid': {'x': 117.78317230753282,
'y': 31.075482099732277},
'cov': {'cov_xx': 0.043658347717791916,
'cov_xy': -0.0031170263757121577,
'cov_yy': 0.008870961889997489},
'volume': 1.8385562999999998},
'ob': {'OrientationAngle': -0.07028834582273102,
'centroid': {'x': 118.79078255350404,
'y': 30.07165674894282},
'cov': {'cov_xx': 0.3200925895888941,
'cov_xy': -0.014475807398721372,
'cov_yy': 0.1155021225250448},
'volume': 20.541087500000017}}},
4: {'feature_axis': {'fo': {'OrientationAngle': 0.0163575323548104,
'centroid': {'x': 117.69301200731284,
'y': 25.28954118895637},
'cov': {'cov_xx': 0.010078661605948584,
'cov_xy': 7.960547965467414e-05,
'cov_yy': 0.005213803265976652},
'volume': 0.645439999999999}},
'imomenter_matrix': {'ob': {'OrientationAngle': -1.3522207593307836,
'centroid': {'x': 118.55664379860443,
'y': 25.47775071405532},
'cov': {'cov_xx': 0.013236046850870481,
'cov_xy': -0.0022188112938238192,
'cov_yy': 0.02273225053138134},
'volume': 2.372610300000001}}},
5: {'imomenter_matrix': {'ob': {'OrientationAngle': -0.7095160979553476,
'centroid': {'x': 118.55175371690272,
'y': 34.9445539961194},
'cov': {'cov_xx': 0.0039545349931722745,
'cov_xy': -0.0017027424946354588,
'cov_yy': 0.003433699682791485},
'volume': 0.2658867000000011}}},
'dtime': 3,
'label_list_matched': [1, 2, 3],
'match_count': 3,
'member': 'ECMWF',
'time': '20200726080000',
'unmatched': {'fo': [4], 'ob': [4, 5]}}</code></pre>
<pre><code class="language-python"></code></pre>