【问题标题】:Is there cumulative sum function in DM-scripting?DM脚本中是否有累积和功能?
【发布时间】:2016-05-12 14:48:52
【问题描述】:

我想沿图像数据的 x 或 y 方向进行累积和。 DM 脚本中是否有任何功能,例如 Matlib 中的“cumsum”? 谢谢!

例如一个 4x4 像素的图像,像素值是

1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7

沿x方向的累积和会导致:

1 1+2=3 1+2+3=6 1+2+3+4=10
2 5 9 14
3 7 12 18
4 9 15 22 

【问题讨论】:

  • 不是每个人都知道 Matlib 和“cumsum”,但我假设您想要的是图像沿 X 和 Y 方向的投影总和,对吗?
  • 对不起,我没有把自己说清楚。 2D图像的cumsum结果仍然是与输入图像相同大小的图像。每个像素的值是沿列/行方向左侧/顶部的所有像素的总和。
  • 请参阅下面的修改后的答案。这符合您的要求吗?
  • 是的,就是这样!谢谢!内变量法效果更好!
  • 好奇:这个有什么用途? (我认识的大多数人都使用这种类型的累积求和来“预测”数据。)

标签: image-processing projection dm-script


【解决方案1】:

有不同的方法可以实现这一点,但可能最快和最简单的方法是创建图像的“完全分箱”版本。

image img := GetFrontImage()
number sizeX, sizeY
img.GetSize( sizeX, sizeY )

image vSum = Rebin( img, 1, sizeY )
image hSum = Rebin( img, sizeX, 1 )
vSum.SetName( "vertical sum" )
vSum.ShowImage()
hSum.SetName( "horizontal sum" )
hSum.ShowImage()

如果您想要一个 2D 图像作为结果,其中每个像素包含其左侧所有像素的总和,您可以通过添加偏移图像来实现:

image img := GetFrontImage()
number sizeX, sizeY
img.GetSize( sizeX, sizeY )

image vCumSum := img.ImageClone() 
for( number x = 1; x<sizeX ; x++ )
{
    hCumSum += offset( img, -x, 0 )
}
hCumSum.SetName( "horizontal sum (cumulative)" )
hCumSum.ShowImage()

或者,您可以使用内部变量创建表达式,如

image img := GetFrontImage()
image hCumSum := 0 * img.ImageClone() 
hCumSum += img[icol,irow] + hCumSum[ icol - 1, irow ]
hCumSum.SetName( "horizontal sum (cumulative)" )
hCumSum.ShowImage()

GMS 3.4 还提供了一个专用的、速度优化的命令:

RealImage Project( BasicImage img, Number axis )
RealImage Project( BasicImage img, Number axis, Boolean rescale )
void Project( BasicImage img, BasicImage dst, Number axis )
void Project( BasicImage img, BasicImage dst, Number axis, Boolean rescale )

【讨论】:

    【解决方案2】:

    进行投影的另一种方法是矩阵乘法。将 2-D 图像乘以 1 的 1-D 矩阵会将图像投影到 1-D 累加上。

    number d0, d1
    image HProject, VProject, ones, img
    img:=getfrontImage()
    img.getSize(d0,d1)
    ones:=exprSize(1,d0,1) 
    HProject=MatrixMultiply(img,ones)
    HProject.rotateLeft()
    HProject.showImage()
    ones:=exprSize(d1,1,1)
    VProject=MatrixMultiply(ones,img)
    VProject.showImage()
    

    【讨论】:

      【解决方案3】:

      我也有一个

      image cumsum(image img)
      //  computes the cumulative sum along x direction
      {
          number sx, sy
          img.GetSize(sx,sy)
      
          for(number i=1; i<sx; i++)
          {
              img[0,i,sy,i+1]=img[0,i-1,sy,i]+img[0,i,sy,i+1]
          }
          return img
      }
      
      image im=getfrontimage()
      im=im.cumsum()
      im.showimage()
      

      【讨论】:

      • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多