1

次の Digitalmicrograph 関数は、画像の行のサブ行で隣接するピクセルの差分を取ることによって画像を作成しようとします。最初のピクセルは、こうして作成されたサブ行の差分結果の平均に置き換えられます。

たとえば、入力画像が幅 8 ピクセル、高さ 1 行で、サブ行のサイズが 4 の場合 - In_img = {8,9,2,4,9,8,7,5} 出力画像は次のようになります - Out_img = {平均(8,9,2,4)=5.75,9-8=1,2-9=-7,4-2=2,平均(9,8,7,5)=7.25,8-9= -1,7-8=-1,5-7=-2}

ここに画像の説明を入力

このスクリプトを実行すると、最初の行の最初のピクセルは正しくても、残りのピクセルは正しくありません。ループ制限を 1 つのサブ行と 1 つの行、つまり x=1 と y=1 に設定すると、スクリプトは正しく機能します。

何が起こっているのか、またはスクリプトに何が問題なのかについてのアイデアはありますか?

テスト画像はこちら結果はこちら。

    // Function to compute the standard deviation (sigma n-1) of an image, or
    // a set of values passed in as pixel values in an image. The
    // number of data points (n) the mean and the sum are also returned.
    // version:20080229
    // D. R. G. Mitchell, adminnospam@dmscripting.com (remove the nospam to make this email address work)
    // v1.0, February 2008
    void StandardDeviation(image arrayimg, number &stddev, number &n, number &mean, number &sum)
    {
        mean=mean(arrayimg)
        number xsize, ysize
        getsize(arrayimg,xsize, ysize)
        n=xsize*ysize
        sum=sum(arrayimg)
        image imgsquared=arrayimg*arrayimg
        number sumofvalssqrd=sum(imgsquared)
        stddev=sqrt(((n*sumofvalssqrd)-(sum*sum))/(n*(n-1)))
    }

image getVectorImage(image refImage, number rowsize)
{
    number fh, fv, fhx
    getsize(refImage, fh, fv)

    fhx=trunc(fh/rowsize)

    //result("ByteSize of refimage = "+refImage.ImageGetDataElementByteSize()+"\n")
    //create image to save std of each row of the ref image.  
    //The std values are saved as pixels of one row.  The row size is same as number of rows.
    //use fhx*rowsize for the new imagesize as fhx is truncated value.
    image retImage:=RealImage("",4,fhx*rowsize,fv)
    image workImage=slice1(refImage,rowsize+1,0,0,0,rowsize-1,1)

    number stddev,nopix,mean,sum

    for ( number y=0;y<fv;y++)
        {
        for (number x=0;x<fhx;x++) 
            {
                //result ("x,y="+x+","+y+"; fhx="+fhx+"; rowsize="+rowsize+"\n")
                workImage=slice1(refImage,x*rowsize+1,y,0,0,rowsize-1,1)-slice1(refImage,x*rowsize,y,0,0,rowsize-1,1)
                showimage(workImage)
                StandardDeviation(workImage,stddev,nopix,mean,sum )
                retImage[y,x*rowsize+1,y+1,x*rowsize+rowsize]=workImage
                retImage[y,x]=mean
                result("mean @ row "+y+" = "+mean+"\n")
            }
        }

    return retImage
}
showimage(getVectorImage(getfrontimage(),rowsize))
4

2 に答える 2

1

私はあなたのスクリプトにいくつかの観察があります:

  • 画像の平均/合計/標準偏差/nを取得するための定義済みの方法の代わりにimg、以下を使用して任意の画像からこれらの数値を簡単に取得できます。

    平均: number m = mean( img )

    和: number s = sum( img )

    標準偏差:number sd = sqrt( variance( img ) )

    ピクセル:number n = sum( 0 * img + 1 )

  • 「1つシフトした」画像との違いを取得したい場合は、行/列をループする必要はありませんが、slice2()コマンドを直接使用できます。icolirowを使用した [ ] 表記。またはコマンドoffset()個人的には、slice2()コマンドの方が好きです。

各行と後続の行との差の標準偏差を与えるスクリプトが必要な場合、つまり、すべての y < sizeY に対して stdDev(row_(y) - row_(y+1) ) が必要な場合、スクリプトは次のようになります。

Image img :=  GetFrontImage()
number sx,sy
img.GetSize(sx,sy)
number dy = 1

Image dif = img.Slice2(0,0,0, 0,sx,1, 1,sy-1,1 ) - img.Slice2(0,dy,0, 0,sx,1, 1,sy-1,1)
Image sDevs := RealImage( "Row's stDev", 4, sy-1 )
for ( number y=0; y<sy-1; y++ )
    sDevs[y,0] = SQRT( Variance( dif.Slice1(0,y,0, 0,sx,1) ) )

sDevs.ShowImage()

これは、あなたが達成しようとしていることですか?そうでない場合は、明確にするために質問を編集してください。

于 2014-11-30T17:16:55.717 に答える