【问题标题】:How to stich a 2D image mosaic with LPSolve如何使用 LPSolve 拼接 2D 图像马赛克
【发布时间】:2014-05-23 17:42:54
【问题描述】:

我是 LPSolve 和工具包的新手。我正在尝试使用 LPSolve IDE 拼接 4 个图像 1024x1024 瓷砖。为了简化任务,我只使用了图块的 x 坐标。

    -------------------------------
   | Tile1         |Tile2          |
   |               |               |
   |               |               |
   |               |               |
   --------------------------------
   | Tile3         | Tile4         |
   |               |               |
   |               |               |
   |               |               |
   --------------------------------

如果我按以下方式定义关系

   min: +d1 +d3 +d4 +d6;

   -x1 +x2 -1024 +d1 <=0.1;
   -x1 +x2 -1024 +d1 >=-0.1;
   -x1 +x3 +1    +d2 <=0.1;
   -x1 +x3 +1    +d2 >=-0.1;
   -x2 +x4       +d3 <=0.1;
   -x2 +x4       +d3 >=-0.1;
   -x3 +x4 -1024 +d4 <=0.1;
   -x3 +x4 -1024 +d4 >=-0.1;
   x1=1024;
   x2=2048;
   x3=1023;
   x4=2047;

LPSolve 产生正确的结果

   d1=0
   d2=0
   d3=0.900000000000091
   d4=0
   x1=1024
   x2=2048
   x3=1023
   x4=2047

如果我将模型更改为以下,即将 Tile4 移动一个像素

   min: +d1 +d2 +d3 +d4;

   -x1 +x2 -1024 +d1 <=0.1;
   -x1 +x2 -1024 +d1 >=-0.1;
   -x1 +x3 +1    +d2 <=0.1;
   -x1 +x3 +1    +d2 >=-0.1;
   -x2 +x4       +d3 <=0.1;
   -x2 +x4       +d3 >=-0.1;
   -x3 +x4 -1024 +1 +d4 <=0.1;
   -x3 +x4 -1024 +1 +d4 >=-0.1;
   x1=1024;
   x2=2048;
   x3=1023;
   x4=2047;

LPSolve 响应“模型不可行”,而我认为响应应该是

 d1=1
   d2=0
   d3=0.900000000000091
   d4=1

我做错了什么?

【问题讨论】:

    标签: linear-programming image-stitching lpsolve


    【解决方案1】:

    您遇到了扩展问题。 lpsolve 有很多。

    如果您进行一些小的更改,您可以自己看到: 我在最后两个约束中替换了 x3 和 x4 的值:

     min: +d1 +d3 +d4 +d2;
    
       -x1 +x2 - 1024 +d1 <=0.1;
       -x1 +x2 - 1024 +d1 >=-0.1;
       -x1 +x3 +1    +d2 <=0.1;
       -x1 +x3 +1    +d2 >=-0.1;
       -x2 +x4      +d3 <=0.1;
       -x2 +x4       +d3 >=-0.1;
       -1023 + 2047  -1024 + 1 + d4 <= 0.1;
       -1023 +  x4   -1024 + 1 + d4 >=-0.1;
       x1=1024;
       x2=2048;
       x3=1023;
       x4=2047;
    

    您收到此警告/错误:

    initialize_solution: Invalid rebounding; variable 10 at refact 0, iter 0
    check_solution: Variable   d4 =                  0 is above its upper bound               -0.9
    
    Seriously low accuracy found ||*|| = 0.9 (rel. error 0.473684)
    lp_solve failed
    

    然而,当我尝试替换自己时:

     min: +d1 +d3 +d4 +d2;
    
       -x1 +x2 - 1024 +d1 <=0.1;
       -x1 +x2 - 1024 +d1 >=-0.1;
       -x1 +x3 +1    +d2 <=0.1;
       -x1 +x3 +1    +d2 >=-0.1;
       -x2 +x4      +d3 <=0.1;
       -x2 +x4       +d3 >=-0.1;
    //   -1023 + 2047  -1024 + 1 + d4 <= 0.1;
    //   -1023 +  x4   -1024 + 1 + d4 >=-0.1;
      d4 <= 0.1;
      d4 >-0.1;
       x1=1024;
       x2=2048;
       x3=1023;
       x4=2047;
    

    我们得到了解决方案,没有不可行:

    Actual values of the variables:
    d1                              0
    d3                            0.9
    d4                           -0.1
    d2                              0
    x1                           1024
    x2                           2048
    x3                           1023
    x4                           2047
    

    This link 告诉你发生了什么。

    引用最后一行:

    结论。您应该始终进行某种缩放。它开始于 你设计模型。额外的缩放可以通过其中之一来完成 lp_solve 的缩放选项。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 2018-08-05
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      相关资源
      最近更新 更多