def run_script(): # We can use import inside of code blocks to limit the scope. import math from ij import IJ, ImagePlus from ij.process import FloatProcessor blank = IJ.createImage("Blank", "32-bit black", img_size, img_size, 1) # This create a list of lists. Each inner list represents a line. # pixel_matrix[0] is the first line where y=0. pixel_matrix = split_list(blank.getProcessor().getPixels(), wanted_parts=img_size) # This swaps x and y coordinates. # http://stackoverflow.com/questions/8421337/rotating-a-two-dimensional-array-in-python # As zip() creates tuples, we have to convert each one by using list(). pixel_matrix = [list(x) for x in zip(*pixel_matrix)] for y in range(img_size): for x in range(img_size): # This function oszillates between 0 and 1. # The distance of 2 maxima in a row/column is given by spacing. val = (0.5 * (math.cos(2 * math.pi / spacing * x) + math.sin(2 * math.pi / spacing * y)))**2 # When assigning, we multiply the value by the amplitude. pixel_matrix[x][y] = amplitude * val # The constructor of FloatProcessor works fine with a 2D Python list. crystal = ImagePlus("Crystal", FloatProcessor(pixel_matrix)) # Crop without selection is used to duplicate an image. crystal_with_noise = crystal.crop() crystal_with_noise.setTitle("Crystal with noise") IJ.run(crystal_with_noise, "Add Specified Noise...", "standard=%d" % int(amplitude / math.sqrt(2))) # As this is a demo, we don't want to be ask to save an image on closing it. # In Python True and False start with capital letters. crystal_with_noise.changes = False crystal.show() crystal_with_noise.show() filtered = fft_filter(crystal_with_noise) # We create a lambda function to be used as a parameter of img_calc(). subtract = lambda values: values[0] - values[1] # This is a short form for: # def subtract(values): # return values[0] - values[1] # The first time we call img_calc with 2 images. difference = img_calc(subtract, crystal, filtered, title="Difference of 2") difference.show() # The first time we call img_calc with 3 images. minimum = img_calc(min, crystal, filtered, crystal_with_noise, title="Minimum of 3") minimum.show() for imp in (crystal, crystal_with_noise, filtered, difference, minimum): IJ.run(imp, "Measure", "")
def run_script(): # We can use import inside of code blocks to limit the scope. import math from ij import IJ, ImagePlus from ij.process import FloatProcessor blank = IJ.createImage("Blank", "32-bit black", img_size, img_size, 1) # This create a list of lists. Each inner list represents a line. # pixel_matrix[0] is the first line where y=0. pixel_matrix = split_list(blank.getProcessor().getPixels(), wanted_parts=img_size) # This swaps x and y coordinates. # http://stackoverflow.com/questions/8421337/rotating-a-two-dimensional-array-in-python # As zip() creates tuples, we have to convert each one by using list(). pixel_matrix = [list(x) for x in zip(*pixel_matrix)] for y in range(img_size): for x in range(img_size): # This function oszillates between 0 and 1. # The distance of 2 maxima in a row/column is given by spacing. val = (0.5 * (math.cos(2*math.pi/spacing*x) + math.sin(2*math.pi/spacing*y)))**2 # When assigning, we multiply the value by the amplitude. pixel_matrix[x][y] = amplitude * val # The constructor of FloatProcessor works fine with a 2D Python list. crystal = ImagePlus("Crystal", FloatProcessor(pixel_matrix)) # Crop without selection is used to duplicate an image. crystal_with_noise = crystal.crop() crystal_with_noise.setTitle("Crystal with noise") IJ.run(crystal_with_noise, "Add Specified Noise...", "standard=%d" % int(amplitude/math.sqrt(2))) # As this is a demo, we don't want to be ask to save an image on closing it. # In Python True and False start with capital letters. crystal_with_noise.changes = False crystal.show() crystal_with_noise.show() filtered = fft_filter(crystal_with_noise) # We create a lambda function to be used as a parameter of img_calc(). subtract = lambda values: values[0] - values[1] """ This is a short form for: def subtract(values): return values[0] - values[1] """ # The first time we call img_calc with 2 images. difference = img_calc(subtract, crystal, filtered, title="Difference of 2") difference.show() # The first time we call img_calc with 3 images. minimum = img_calc(min, crystal, filtered, crystal_with_noise, title="Minimum of 3") minimum.show() for imp in (crystal, crystal_with_noise, filtered, difference, minimum): IJ.run(imp, "Measure", "")
def snapshot(imp, c, z, f, x, y, L): '''Take a L x L snapshot centered at (x,y) at channel c, slice z and frame f Parameters: imp: an ImagePlus object for processing c, z, f: specificed channel, slice (z-dimension) and frame coordinate x, y: targeted center position to take the snapshot L: desired edge lengths of the snapshot in pixels Returns: cropped: an ImagePlus object of the snapshot image ''' # Import inside function to limit scope from ij import ImagePlus # Get the dimensions of the images cN = imp.getNChannels() zN = imp.getNSlices() # fN = imp.getNFrames() # Convert specified position (c,z,f) to index assuming hyperstack order is czt (default) sliceIndex = int(cN * zN * (f-1) + cN * (z-1) + c) imp.setSlice(sliceIndex) ipTemp = imp.getProcessor() impTemp = ImagePlus('temp', ipTemp) # Expand the image by half of L to make sure final duplicate is the same size # when requested (x,y) could be within L pixels of the edge wOld = ipTemp.getWidth() hOld = ipTemp.getHeight() wNew = wOld + int(L) hNew = hOld + int(L) ipNew = ipTemp.createProcessor(wNew, hNew) ipNew.setColor(0) # 0 = black color ipNew.insert(ipTemp, int(L/2), int(L/2)) imgNew = ImagePlus('new', ipNew) # Use the specified center coordinate x, y and the target side length to create ROI imgNew.setRoi(int(x), int(y), int(L), int(L)) # cropped = ImagePlus('cropped', ipNew.crop()) cropped = imgNew.crop() impTemp.close() imgNew.close() return cropped
def generate_kymograph(data_to_plot, colormap_string, title_string, trim=True): """Display one-channel kymograph with point furthest from the edges along the middle of the kymograph """ kym_height = 2 * max([len(data) for data in data_to_plot]) + 1 ip = FloatProcessor(len(data_to_plot), kym_height) # normalise such that point furthest from the anchors is in the middle of the kymograph maxy = 0 miny = kym_height for idx, data in enumerate(data_to_plot): dist = [ mb.vector_length(data[0][0], p) * mb.vector_length(data[-1][0], p) for p in [d[0] for d in data] ] distal_idx = dist.index(max(dist)) pix = ip.getPixels() for kidx, didx in zip( range(((kym_height - 1) / 2 + 1), ((kym_height - 1) / 2 + 1) + len(data) - distal_idx), range(distal_idx, len(data))): pix[kidx * len(data_to_plot) + idx] = data[didx][1] for kidx, didx in zip( range(((kym_height - 1) / 2 + 1) - distal_idx, ((kym_height - 1) / 2 + 1)), range(0, distal_idx)): pix[kidx * len(data_to_plot) + idx] = data[didx][1] maxy = ((kym_height - 1) / 2 + 1) + len(data) - distal_idx if ( ((kym_height - 1) / 2 + 1) + len(data) - distal_idx) > maxy else maxy miny = ((kym_height - 1) / 2 + 1) - distal_idx if (( (kym_height - 1) / 2 + 1) - distal_idx) < miny else miny imp = ImagePlus(title_string, ip) IJ.run(imp, colormap_string, "") if trim: maxtomiddle = maxy - (kym_height - 1) / 2 + 1 mintomiddle = (kym_height - 1) / 2 + 1 - miny if maxtomiddle > mintomiddle: miny = (kym_height - 1) / 2 + 1 - maxtomiddle else: maxy = (kym_height - 1) / 2 + 1 + mintomiddle if (maxy - miny) / 2 == round((maxy - miny) / 2): maxy = maxy - 1 imp.setRoi(Roi(0, miny, imp.getWidth(), (maxy - miny))) imp = imp.crop() imp.show() return imp