我正在使用Marching Squares algorithm来获取值的晶格,并在值超过50%时将它们变成轮廓。我的值的属性最大为0%和100%,其中从0%到100%的过渡最多发生一个中间值,这样创建的轮廓将穿过该值大于0%的每个晶格位置并且少于100%。例如,请考虑以下值的字段,该值代表下图的灰度正方形中显示的近似百分比:
0 0 0 0 0 0 0 0
0 0 6 71 71 20 0 0
0 28 35 100 100 48 20 0
0 100 100 100 100 100 71 0
0 100 100 100 100 100 71 0
0 9 18 100 100 35 6 0
0 0 9 100 100 28 0 0
0 0 0 0 0 0 0 0
传统的Marching Squares算法将生成一个轮廓,如下图所示:
蓝色字段代表轮廓,灰度正方形代表上述数据的晶格值。
给出结果轮廓,我可以将每个晶格位置的轮廓覆盖区域作为该晶格位置的重新创建值,再次将其转换回数字晶格。对于上面的轮廓,看起来像这张图像显示了相同的轮廓,并且将结果值转换回了由灰度正方形显示的值的格:
新值与原始值相似,但不完全相同,有些较大,有些较小,因此信息已经丢失,算法是有损压缩。值的解压缩字段大致如下所示:
0 0 0 0 0 0 0 0
0 0 3 67 70 4 0 0
0 12 43 100 100 59 4 0
0 91 100 100 100 100 70 0
0 88 100 100 100 100 67 0
0 4 27 100 100 43 3 0
0 0 3 88 91 12 0 0
0 0 0 0 0 0 0 0
是否有一种方法可以调整线性插值步长而不丢失信息,或者至少不至于更接近原始数据字段?如果没有,轮廓是否可以添加额外的点来解决。例如,也许插值步骤保持不变,但是行进正方形算法中的点之间不是直线,而是沿路径添加了额外的点,以将所需的区域强加到考虑的四个格子正方形的每个角上。行进步骤算法的每个部分?
在示例的右下方区域,行进步骤算法的一个步骤找到了以下四个值:
100 28
0 0
插值在左侧产生50%,在顶部产生70%。这意味着在左侧,点A恰好位于左下方0%正方形和左上方100%正方形之间的边界上。这意味着在顶部,B点位于右上角28%值中心的70%处。前述结果导致从A到B的对角线取值为100的左上角。
我们可以在A和B之间添加其他中间点,以使面积值在从轮廓值返回到晶格值后(解压缩)不会丢失。例如,考虑以下图形:
原始行进正方形在图形中给出了点A和B。黄色高亮显示可以添加的其他点X,Y和Z,因此覆盖的区域是左上100%,左下0%和右上28%。对于28%的客户,B点以下处理了14%,B点以上处理了14%。
这是已知的问题,已经存在解决方案,还是在压缩图像时存在类似的问题可以用来帮助解决该问题?提议的解决方案看起来合理还是可以进一步简化?我担心处理产生行的14个行进广场的每个变体的四个象限会非常复杂,因此,如果有一种简化方法,我想找到它。
总而言之,想调整蓝色轮廓的计算,以使轮廓所覆盖的每个晶格正方形的面积与用于创建蓝色轮廓的原始数据相匹配,从而进行无损压缩以将晶格转换为完全可逆的轮廓。