次の 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))