Image 如何通过图像表达式操纵像素值?

Image 如何通过图像表达式操纵像素值?,image,expression,pixel,dm-script,manipulate,Image,Expression,Pixel,Dm Script,Manipulate,最近我正在写一个脚本来处理图像中的像素值。其思想是将落在给定范围内的像素设置为特定值。使用图像表达式,而不是使用从像素到像素循环的命令“for”,例如: Img = (Img>=thresh_Low && Img<=thresh_Up ? 0 : Img) Img=(Img>=thresh\u Low&&Img计算图像表达式的效率比任何逐像素操作都要高。即使因此计算一些不需要的平均值,脚本的执行速度也会快得多。因此: 您应该计算平均图像(对于所有像素,而不仅仅是遮罩

最近我正在写一个脚本来处理图像中的像素值。其思想是将落在给定范围内的像素设置为特定值。使用图像表达式,而不是使用从像素到像素循环的命令“for”,例如:

Img = (Img>=thresh_Low && Img<=thresh_Up ? 0 : Img)

Img=(Img>=thresh\u Low&&Img计算图像表达式的效率比任何逐像素操作都要高。即使因此计算一些不需要的平均值,脚本的执行速度也会快得多。因此:

您应该计算平均图像(对于所有像素,而不仅仅是遮罩像素),然后在遮罩指定中使用它。 以下示例说明了这一点。只有最后两行是您问题的直接答案。该条件用于复制原始值或平均值:

number aver\u NN=3//下一个邻居平均值。1=3x3,2=5x5等)
数字maskRad=0.3//仅显示遮罩的半径
图像img:=GetFrontImage()
如果(2!=img.ImageGetNumDimensions())抛出(“仅支持二维图像”)
//创建平均图像(为简单起见,忽略边界区域)
图像av:=img*0

for(number dx=-aver_NN;dx)非常感谢您提供的有用信息。您的意思是“for”循环对于准备遮罩(即平均图像)仍然是必要的?顺便说一句,我很难计算作为遮罩的附近像素的平均值,尤其是在边界处,因为for循环将报告错误消息。我们将非常感谢进一步的示例。@dmadventorer是的,但这是一个平均移位上的for循环,而不是像素。要计算平均图像,需要对每个方向上移动一到两个像素的图像求和(因此9或25次迭代)。因此,此图像的每个像素中都有来自原始像素及其相邻像素的值。上述脚本中的for循环不会在边界区域中产生错误,因为“offset”命令适用于图像,只需将缺少的像素归零即可。我将在上面的编辑中添加一个进一步的示例。另外……计算像素平均图像e似乎只使用简单的数学,但它是有效的。我的大脑太复杂了。同时,卷积法对我来说非常酷。欠你一杯啤酒。一个辅助问题。我试图添加一个附加函数,将这种图像处理应用于局部区域,而不是整个图像,例如,一个初步的assigned ROI。事实上,我首先想到的是再次使用for循环,但是使用给定的x和y坐标。是否可以合并这个想法,但仍然使用图像表达式?@DMAdventurer如果该区域是一个常规的rect子数组,您只需使用slice2()命令,然后像使用输入图像一样使用它。

number size = 25
image test := realimage("Source",4,size,size)
test = 1 + random()
test.ShowImage()

image offset_N = test.offset(  0, -1 )
image offset_S = test.offset(  0,  1 )
image offset_W = test.offset( -1,  0 )
image offset_E = test.offset(  1,  0 )
offset_N.ShowImage()
offset_N.SetName("N")
offset_S.ShowImage()
offset_S.SetName("S")
offset_W.ShowImage()
offset_W.SetName("W")
offset_E.ShowImage()
offset_E.SetName("E")

image average = test + offset_N + offset_S + offset_W + offset_E
average /= 5
average.SetName("Average")
average.ShowImage()

EGUPerformActionWithAllShownImages("Arrange")