Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 使用数字显微照片(DM)脚本创建相邻像素差异的图像_Image Processing_Dm Script - Fatal编程技术网

Image processing 使用数字显微照片(DM)脚本创建相邻像素差异的图像

Image processing 使用数字显微照片(DM)脚本创建相邻像素差异的图像,image-processing,dm-script,Image Processing,Dm Script,下面的digitalmicrograph函数尝试通过获取图像行的子行中相邻像素的差值来创建图像。用由此创建的子行的差分结果的平均值替换第一像素 例如,如果输入图像宽8像素,高1行,子行大小为4- In_img={8,9,2,4,9,8,7,5} 然后将输出图像- 平均值(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} 当我运行这个脚本时,第一行的第一个像素是正确的,但是其余的像素是不正确的。当我将

下面的digitalmicrograph函数尝试通过获取图像行的子行中相邻像素的差值来创建图像。用由此创建的子行的差分结果的平均值替换第一像素

例如,如果输入图像宽8像素,高1行,子行大小为4- In_img={8,9,2,4,9,8,7,5} 然后将输出图像- 平均值(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}

当我运行这个脚本时,第一行的第一个像素是正确的,但是其余的像素是不正确的。当我将循环限制设置为只有一个子行和一行,即x=1和y=1时,脚本工作正常

关于剧本可能会发生什么或有什么问题,有什么想法吗

这个和那个

//用于计算图像标准偏差(sigma n-1)的函数,或
//在图像中作为像素值传入的一组值。这个
//数据点的数量(n)也返回平均值和总和。
//版本:20080229
//D.R.G.米切尔,adminnospam@dmscripting.com(删除nospam以使此电子邮件地址正常工作)
//v1.0,2008年2月
无效标准偏差(图像阵列、数字和标准差、数字和n、数字和平均值、数字和总和)
{
平均值=平均值(arrayimg)
数字xsize,ysize
getsize(arrayimg、xsize、ysize)
n=xsize*ysize
总和=总和(arrayimg)
图像imgsquared=arrayimg*arrayimg
数量SumofValsqrd=总和(imgsquared)
stddev=sqrt((n*sumofvalssqrd)-(sum*sum))/(n*(n-1)))
}
图像getVectorImage(图像重影,数字行大小)
{
编号fh、fv、fhx
getsize(重新图像、fh、fv)
fhx=trunc(fh/行大小)
//结果(“RefImageByteSize=“+RefImageGetDataElementByteSize()+”\n”)
//创建图像以保存ref图像每行的std。
//std值保存为一行的像素。行大小与行数相同。
//将fhx*行大小用于新的imagesize,因为fhx是截断值。
图像重映像:=真实图像(“,4,fhx*行大小,fv)
图像工作图像=切片1(重新图像,行大小+1,0,0,行大小-1,1)
数字STDEV、nopix、平均值、总和

对于(数字y=0;y我在您的脚本中有一些观察:

  • 使用以下方法,您可以从任何图像
    img
    轻松获取这些数字,而不是获取图像平均值/sum/stdev/n的定义方法:

    平均值:
    数字m=平均值(img)

    总和:
    number s=sum(img)

    标准偏差:
    number sd=sqrt(方差(img))

    像素:
    number n=sum(0*img+1)

  • 如果您想获得图像与图像“偏移1”的差异,您不必在行/列上循环,但可以直接使用
    slice2()
    命令;使用icol和irow的[]符号;或者个人使用
    offset()
    命令,我更喜欢
    slice2()
    命令

如果我想要一个脚本,它给出每一行与其后继行之间差值的标准偏差,即所有y
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()
Image-img:=GetFrontImage()
数字sx,sy
img.GetSize(sx,sy)
数字dy=1
图像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)
图像sDevs:=RealImage(“世界其他地区的标准开发设备”,4,sy-1)

对于(数字y=0;y),在编辑之后,我了解到您希望执行以下操作:

这应该分别对图像的每一行执行

下面的脚本执行此操作。(解释如下。)

图像修改(图像输入,编号子化)
{
//一些检查
数字sx,sy
in.GetSize(sx,sy)
如果(0!=sx%子补贴)
抛出(“图像宽度不是子屏幕的整数倍。”)
//你的意思是。。。
数量nTile=sx/子版
图像平均值:=真实图像(“平均值”,4,nTile,sy)
平均值=0

对于(数字i=0;iI编辑问题以添加示例。评论部分不允许我在文本中添加格式。将问题编辑为最终的、易于理解的文本是网站上人们非常喜欢的。即使您对给出的答案感到满意,有时也有助于更清楚地陈述问题,以便其他人e有相同的问题可以很容易地从你的帖子中获益。请在你有时间的时候这样做-这将赢得你在这里社区的尊重。你也可以很容易地在你的帖子中添加图像-这有时会有很大帮助。我已经对你的问题进行了编辑(希望很快得到同行的批准)你能交叉检查一下这是否是你真正想要的吗?(这似乎有点奇怪,你需要它做什么?)我试图根据剂量和样本统计了解图像。我认为这将是学习DM脚本的一个很好的方法。感谢您的帮助和解释。您的评估基本上是正确的。除了,是同一行的像素。请参阅我添加到问题中以澄清的示例。但我明白了你的要点。还要感谢你提供的平均值、总和、stdev和像素。我在执行slice1-slice1时得到了正确的结果,问题在于将结果分配给图像的子行。
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()
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()