画像データの x または y 方向に沿って累積合計を実行したいと思います。Matlib の「cumsum」のような DM スクリプトに関数はありますか? ありがとう!
たとえば、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
画像データの x または y 方向に沿って累積合計を実行したいと思います。Matlib の「cumsum」のような DM スクリプトに関数はありますか? ありがとう!
たとえば、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
これを実現するにはさまざまな方法がありますが、おそらく最速で最も簡単な方法は、画像の「完全にビニングされた」バージョンを作成することです。
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 )
射影を行うもう 1 つの方法は、行列の乗算です。2 次元イメージを 1 の 1 次元マトリックスで乗算すると、イメージが 1 次元累積に投影されます。
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()