Image processing 使用数字显微照片(DM)脚本创建相邻像素差异的图像
下面的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时,脚本工作正常 关于剧本可能会发生什么或有什么问题,有什么想法吗 这个和那个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} 当我运行这个脚本时,第一行的第一个像素是正确的,但是其余的像素是不正确的。当我将
//用于计算图像标准偏差(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()