如何通过在任意语言的图片上设置2个控制点来进行图像重投影

问题描述 投票:0回答:1

描述:

  • 如何通过设置2点坐标来校正图片所有点坐标?或者我需要使用哪个库?
  • 我更喜欢
    python
    lib 解决方案,但任何语言解决方案都可以接受。
  • 如果能在参数中设置坐标系就更好了
  • 我想获得所有点(像素)新的协调,如示例所示,对图像本身不执行/更改任何操作。

示例:

  • 原图:
  • 一个点表示原始图像坐标(位置)中的一个像素。
[[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0)],
[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1)],
[(0, 2), (1, 2), (2, 2), (3, 2), (4, 2)],
[(0, 3), (1, 3), (2, 3), (3, 3), (4, 3)],
[(0, 4), (1, 4), (2, 4), (3, 4), (4, 4)]]
  • 示例图片协调矩阵:
    • (100,150)
      ,
      (200,200)
      代表我设置的两个点
[[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0)],
[(0, 1), (1, 1), (2, 1), (200, 200), (4, 1)],
[(0, 2), (1, 2), (2,2), (3, 2), (4, 2)],
[(0, 3), (100, 150), (2, 3), (3, 3), (4, 3)],
[(0, 4), (1, 4), (2, 4), (3, 4), (4, 4)]]
  • 想要的结果
    • 所有像素点旧坐标都应该变成新坐标,这意味着两个相邻像素之间的距离发生了变化。
    • (150,175)
      是校正后正确结果的示例。
    • 图像本身不会改变任何东西。
[[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0)],
[(0, 1), (1, 1), (2, 1), (200, 200), (4, 1)],
[(0, 2), (1, 2), (150,175), (3, 2), (4, 2)],
[(0, 3), (100, 150), (2, 3), (3, 3), (4, 3)],
[(0, 4), (1, 4), (2, 4), (3, 4), (4, 4)]]

我尝试过的:

  • python手写代码:
def correction(n,m,set_point):
    x_length = abs(set_point[1]["new_x"]-set_point[0]["new_x"])/abs(set_point[1]["old_x"]-set_point[0]["old_x"])
    y_length = abs(set_point[1]["new_y"]-set_point[0]["new_y"])/abs(set_point[1]["old_y"]-set_point[0]["old_y"])
    ans = [[[set_point[0]["new_x"]+(i-set_point[0]["old_x"])*x_length,
             set_point[0]["new_y"]+(j-set_point[0]["old_y"])*y_length] for i in range(n)] for j in range(m)]
    print(ans[::-1])

correction(5,5,[{"old_x":1,"old_y":1,"new_x":100,"new_y":150},{"old_x":3,"old_y":3,"new_x":200,"new_y":200}])
  • 结果:
[[[50.0, 225.0], [100.0, 225.0], [150.0, 225.0], [200.0, 225.0], [250.0, 225.0]],
[[50.0, 200.0], [100.0, 200.0], [150.0, 200.0], [200.0, 200.0], [250.0, 200.0]],
[[50.0, 175.0], [100.0, 175.0], [150.0, 175.0], [200.0, 175.0], [250.0, 175.0]], 
[[50.0, 150.0], [100.0, 150.0], [150.0, 150.0], [200.0, 150.0], [250.0, 150.0]],
[[50.0, 125.0], [100.0, 125.0], [150.0, 125.0], [200.0, 125.0], [250.0, 125.0]]]

问题:

  1. 有任何库或轮子可以解决这个问题吗?
  2. 如何将此算法应用到
    png
    jpg
    文件中,通过设置2点坐标来校正整个图片?
  3. 目前我已经默认设置了坐标系,那么如何通过传递参数来设置坐标系呢?
  4. 如果我想设置3个或更多的点来校正整个图片,如何改进这个算法?
python algorithm image tiff gdal
1个回答
0
投票
  • 最后我自己弄清楚了,我需要使用lib

    gdal
    通过设置控制点来进行图像重投影。

  • 示例代码:

from osgeo import gdal
from osgeo import osr
dataset = gdal.Open(r'test.tiff', gdal.GA_Update)
gcps = [gdal.GCP(-111.931075, 41.745836, 0, 1078, 648),
        gdal.GCP(-111.901655, 41.749269, 0, 531, 295),
        gdal.GCP(-111.899180, 41.739882, 0, 722, 334),
        gdal.GCP(-111.930510, 41.728719, 0, 102, 548)]
sr = osr.SpatialReference()
sr.SetWellKnownGeogCS('WGS84')
dataset.SetGCPs(gcps, sr.ExportToWkt())
dst_ds = gdal.Warp(r'test_dst.tiff', dataset, format='GTiff', tps=True, xRes=0.05, yRes=0.05, 
                   dstNodata=65535, srcNodata=65535, resampleAlg=gdal.GRIORA_NearestNeighbour, outputType=gdal.GDT_Int32)
© www.soinside.com 2019 - 2024. All rights reserved.