Julia 透视扭曲朱莉娅的形象

Julia 透视扭曲朱莉娅的形象,julia,Julia,我有一张图像和一个3x3透视投影矩阵M。如何在图像上应用变换 我试图使用warp(img,tform)函数,但不知道如何从矩阵构造变换对象 已尝试tform=PerspectiveMap()∘ inv(LinearMap(M)),不知道这是否是创建转换的正确方法,但失败的原因是: 错误:坐标变换的逆变换。透视图尚未定义。答案有两个部分: 必须定义一个将2向量转换为2向量的变换 如果变换不可逆,则必须手动指定最终图像的索引范围 对于第一个问题,以下几点就足够了: julia> using

我有一张图像和一个3x3透视投影矩阵
M
。如何在图像上应用变换

我试图使用
warp(img,tform)
函数,但不知道如何从矩阵构造变换对象

已尝试
tform=PerspectiveMap()∘ inv(LinearMap(M))
,不知道这是否是创建转换的正确方法,但失败的原因是:


错误:坐标变换的逆变换。透视图尚未定义。

答案有两个部分:

  • 必须定义一个将2向量转换为2向量的变换
  • 如果变换不可逆,则必须手动指定最终图像的索引范围
对于第一个问题,以下几点就足够了:

julia> using StaticArrays, CoordinateTransformations

julia> M = @SMatrix [1 0 0; 0 1 0; -1/1000 0 1]   # a 3x3 perspective transformation matrix
3×3 StaticArrays.SArray{Tuple{3,3},Float64,2,9}:
  1.0    0.0  0.0
  0.0    1.0  0.0
 -0.001  0.0  1.0

julia> tform = PerspectiveMap() ∘ inv(LinearMap(M))
(CoordinateTransformations.PerspectiveMap() ∘ LinearMap([1.0 0.0 0.0; -0.0 1.0 0.0; 0.001 -0.0 1.0]))

julia> tform(@SVector([1,1,1]))   # this takes a 3-vector as input and returns a 2-vector
2-element SVector{2,Float64}:
 0.999001
 0.999001

julia> push1(x) = push(x, 1)
push1 (generic function with 1 method)

julia> tform2 = PerspectiveMap() ∘ inv(LinearMap(M)) ∘ push1    # here's one that takes a 2-vector as input (appends 1 to the 2-vector)
(::#55) (generic function with 1 method)

julia> tform2(@SVector([1,1]))
2-element SVector{2,Float64}:
 0.999001
 0.999001
现在让我们在一张图片上试试这个。我们将创建一个与输入图像具有相同索引的输出图像,尽管您可以选择:

img
如下所示:


imgw
看起来是这样的:

答案有两个部分:

  • 必须定义一个将2向量转换为2向量的变换
  • 如果变换不可逆,则必须手动指定最终图像的索引范围
对于第一个问题,以下几点就足够了:

julia> using StaticArrays, CoordinateTransformations

julia> M = @SMatrix [1 0 0; 0 1 0; -1/1000 0 1]   # a 3x3 perspective transformation matrix
3×3 StaticArrays.SArray{Tuple{3,3},Float64,2,9}:
  1.0    0.0  0.0
  0.0    1.0  0.0
 -0.001  0.0  1.0

julia> tform = PerspectiveMap() ∘ inv(LinearMap(M))
(CoordinateTransformations.PerspectiveMap() ∘ LinearMap([1.0 0.0 0.0; -0.0 1.0 0.0; 0.001 -0.0 1.0]))

julia> tform(@SVector([1,1,1]))   # this takes a 3-vector as input and returns a 2-vector
2-element SVector{2,Float64}:
 0.999001
 0.999001

julia> push1(x) = push(x, 1)
push1 (generic function with 1 method)

julia> tform2 = PerspectiveMap() ∘ inv(LinearMap(M)) ∘ push1    # here's one that takes a 2-vector as input (appends 1 to the 2-vector)
(::#55) (generic function with 1 method)

julia> tform2(@SVector([1,1]))
2-element SVector{2,Float64}:
 0.999001
 0.999001
现在让我们在一张图片上试试这个。我们将创建一个与输入图像具有相同索引的输出图像,尽管您可以选择:

img
如下所示:

imgw
看起来是这样的: