ImageJ Script: как добавить одно изображение к существующему изображению

На Фиджи (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()

person Miguel    schedule 04.01.2018    source источник


Ответы (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 - это ImageProcessors [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#setPositionWithoutUpdate-int-int-int-

person felix the cat    schedule 04.01.2018
comment
Спасибо за хороший ответ. И спасибо за ссылку на setPositionWithoutUpdate. В итоге я использовал его как: imp.setPositionWithoutUpdate(1,slice,1) p2 = imp.getProcessor(). Единственное, что меня удивляет, это то, что в классе ImageProcessor нет функции add(ImageProcessor input) - person Miguel; 05.01.2018
comment
@Miguel, метод add(ImageProcessor p), вероятно, не существует из-за неоднозначности для разных типов изображений (серые, rgb и т. Д., См. imagej.nih.gov/ij/developer/api/ij/process/) - person felix the cat; 05.01.2018