Скрипт ImageJ: Как добавить одно изображение к существующему
На Фиджи (ImageJ) у меня открыты два изображения (Img1 и Img2). Я хочу запустить скрипт, который добавляет оба изображения и сохраняет результат в Img1. Я собираюсь сделать это в последовательности изображений, поэтому я хотел бы попытаться избежать создания и закрытия многих изображений.
Будет ли это возможно? Я попробовал код ниже, но он вылетает, когда я вызываю второй Sum3and50.show()
после первого AddSlice()
вызов. В основном я хотел бы просто иметь возможность Sum3and50+=imp[Slice]
from __future__ import division
from ij import IJ
from ij import plugin
import time
def AddSlice(Stack,SumImg,Slice):
Stack.setSlice(Slice)
ic = plugin.ImageCalculator()
SliceImg = ic.run("Copy create", Stack, Stack)
SliceImg.show()
time.sleep(SLEEP_TIME)
SumImg=ic.run("Add RGB", SumImg, SliceImg)
return SumImg
SLEEP_TIME=1 #seconds
#imp = IJ.getImage()
imp = IJ.openImage("http://imagej.nih.gov/ij/images/flybrain.zip");
W,H,NCh,NSl,NFr = imp.getDimensions()
imp.show()
Sum3and50 = IJ.createImage("Sum3and50", "RGB black", W, H, 1)
Sum3and50.show()
time.sleep(SLEEP_TIME)
Sum3and50 = AddSlice(imp,Sum3and50,3)
Sum3and50.show()
time.sleep(SLEEP_TIME)
Sum3and50 = AddSlice(imp,Sum3and50,5)
Sum3and50.show()
1 ответ
Чтобы избежать появления окон, я стараюсь избегать плагинов и работать с ImageProcessor
непосредственно. Такая функция, которая принимает сумму каждой пары пикселей двух изображений, перезаписывающих первый вход, будет выглядеть так:
def pixel_pair_sum(pro1, pro2):
for x in range(pro1.getWidth()):
for y in range(pro1.getHeight()):
v1 = pro1.get(x, y)
v2 = pro2.get(x, y)
pro1.set(x, y, v1 + v2)
pro1
а также pro1
являются ImageProcessor
с [1]. Таким образом, вам нужно, чтобы получить их в первую очередь от ImagePlus
перед вызовом функции выше:
...
sum3and50 = IJ.createImage("Sum3and50", "RGB black", W, H, 1)
p1 = sum3and50.getProcessor()
stk = imp.getStack()
p2 = stk.getProcessor(1) # get the processor for the first slice [2]
pixel_pair_sum(p1, p2) # add the pixel values of slice 1 to sum3and50
p2 = stk.getProcessor(2) # add another slice to sum3and50
pixel_pair_sum(p1, p2)
...
sum3and50.show()
для справки: https://imagej.nih.gov/ij/developer/api/ij/ImageStack.html
[1] https://imagej.nih.gov/ij/developer/api/ij/process/ImageProcessor.html
[2] также см. https://imagej.nih.gov/ij/developer/api/ij/ImagePlus.html