以下数字显微图功能试图通过获取图像行的子行中相邻像素的差值来创建图像。将第一像素替换为由此创建的子行的差结果的平均值。
例如,如果输入图像宽8像素,高1行,子行大小为4- In_img ={8,9,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-2}。

当我运行这个脚本时,第一行的第一个像素是正确的,但是其余的像素是不正确的。当我将循环限制设置为一个子行和一行(即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))发布于 2014-12-02 13:24:13
在编辑完之后,我了解到您想做这样的事情:

并且,这应该对图像的每一行单独执行。
下面的脚本会这样做。(下文解释)
image Modify( image in, number subsize )
{
// Some checking
number sx,sy
in.GetSize(sx,sy)
if ( 0 != sx%subsize )
Throw( "The image width is not an integer multiplication of the subsize." )
// Do the means...
number nTile = sx/subsize
image meanImg := RealImage( "Means", 4, nTile , sy )
meanImg = 0
for ( number i=0; i<subsize; i++ )
meanImg += in.Slice2( i,0,0, 0,nTile,subsize, 1,sy,1 )
meanImg *= 1/subsize
// Do the shifted difference
image dif := RealImage( "Diff", 4, sx-1, sy )
dif = in.slice2( 1,0,0, 0,sx-1,1, 1,sy,1) - in.slice2( 0,0,0, 0,sx-1,1, 1,sy,1)
// Compile the result
image out := in.ImageClone()
out.SetName( in.getName() + "mod" )
out.slice2( 1,0,0, 0,sx-1,1, 1,sy,1 ) = dif
out.slice2( 0,0,0, 0,nTile,subsize, 1,sy,1 ) = meanImg
return out
}
number sx = 8, sy = 4
image img := RealImage( "test", 4, 8, 4 )
img = icol*10 + trunc( Random()*10 )
img.ShowImage()
Modify(img,4).ShowImage()一些解释:
slice2命令非常方便,因为它允许在采样时定义步骤大小。您可以使用它直接寻址深灰色像素。:=和=在图像表达式上的区别。第一个是内存分配:- `A := B` means that A now _is the same memory location_ as B. A is basically another _name_ for B.
- `A = B` means A gets the values of B (copied). A and B are two different memory locations and _only_ values are copied over.
发布于 2014-11-30 17:16:55
我在你的剧本中有一些观察:
img获得这些数字:
平均值:number m = mean( img )
总和:number s = sum( img )
stdev:number sd = sqrt( variance( img ) )
像素:number n = sum( 0 * img + 1 )slice2()命令;使用icol和irow的符号;或者命令offset(),我更喜欢slice2()命令。如果我想要一个脚本,给出每个行与其后继行(即stdDev( row_(y) - row_(y+1) )对所有y< sizeY的差异的标准差,那么我的脚本将是:
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()这就是你想要达到的目标吗?如果没有,请编辑您的问题,以获得一些澄清。
https://stackoverflow.com/questions/27178748
复制相似问题