非线性图像缩放

时间:2015-07-19 19:01:01

标签: imagemagick

开始情况: 我有一个扭曲的图像,例如带有网格的地理地图。失真就是这样的:在地图的顶部10°地理纬度对应30 px,但在图像的底部10°纬度仅对应10 px。

目的: 现在我想缩放图像,10°纬度对应于整个图像的20 px。

让我更多地说明问题:

开始状态:整体高度为100像素的图片:

区域1 - 30像素高度

区域2 - 25像素高度

区域3 - 20像素高度

区域4 - 15像素高度

区域5 - 10像素高度

目标:图像整体高度保持不变(100像素),但现在区域应该是相同的高度:

区域1 - 20像素高度

区域2 - 20像素高度

区域3 - 20像素高度

区域4 - 20像素高度

区域5 - 20像素高度

如果用imagemagick以外的其他软件可以实现这一点,也欢迎提示。 感谢您提前回复。

2 个答案:

答案 0 :(得分:0)

仅使用像ImageMagick这样的光栅图像处理工具无法正确地重新缩放和重新投影地图图像。您需要一种能够计算正确图像变换的工具,同时考虑到地图投影的变化。您还需要有关图像的投影元数据,可以是图像本身(如果它是某种格式,如GeoTIFF),也可能需要关联的元数据头文件,如果它是原始光栅格式,如PNG或JPEG。

我建议您查看地理空间数据抽象库GDAL。它是一个包含命令行工具的库,允许您正确地重新投影和转换多种栅格地图图像。

答案 1 :(得分:0)

现在我发现了我的起始地图和我想要的地图之间的转换功能:

f(y_px) = 200 (-0.5 + 0.01 * sqrt(150 + y_px))

这可以通过任何适配软件来完成。

现在我使用“-fx”参数和“自定义矩阵”成功转换了地图:

convert -monitor -size 100x100 xc:       map-starting.png  \
        -virtual-pixel Black  -interpolate NearestNeighbor \
        -fx "xx =  i ;
             yy = 200 (-0.5 + 0.01 * sqrt(150+ j));
             v.p{xx,yy}" \
        map-aim.png

map-aim.png是我想要的;)