post:meanintinellipse.m

meanIntInEllipse.m

Class: Function

Description: Takes in a specified element of the procTracks data structure and an image, and calculates the average intensity of pixels in that image within an ellipse with geometry defined by the selected object.

Author: Oliver J. Meacock

meanIntInEllipse.m
function [meanInt,total] = meanIntInEllipse(img,procTrack,ind,pxSize)
%MEANINTINELLIPSE returns the average and total pixel intensity within the
%specified ellipse in the given image.
%
%   INPUTS:
%       -img: the original image for the ellipse to be cut from.
%       -procTrack: a single track from a larger procTracks structure.
%       Should contain majorLen, minorLen, x, y and phi
%       fields, corresponding to 'Length', 'Width', 'Position' and 
%       'Orientation' in the feature extraction module.
%       -ind: the track timepoint containing the ellipse parameters you 
%       want to draw your mask with.
%       -pxSize: the side length of a single pixel. Found in the
%       metadata structure if FAST's image inport has been used.
%
%   OUTPUTS:
%       -mean: The average intensity of pixels within the ellipse
%       specified.
%       -total: The total intensity of pixels within the ellipse specified.
%
%   Author: Oliver J. Meacock
 
%Rescale ellipse parameters
xPx = round(procTrack.x(ind)/pxSize);
yPx = round(procTrack.y(ind)/pxSize);
minLenPx = round(procTrack.minorLen(ind)/pxSize);
majLenPx = round(procTrack.majorLen(ind)/pxSize);
phi = procTrack.phi(ind);
 
halfWindow = majLenPx*2;
 
%Generate a cut out bit of the coordinate grid for calculating the ellipse
%over.
[xGrid,yGrid] = meshgrid(round(xPx)-halfWindow:round(xPx)+halfWindow,round(yPx)-halfWindow:round(yPx)+halfWindow);
 
minX = max(1,round(xPx)-halfWindow);
maxX = min(size(img,2),round(xPx)+halfWindow);
minY = max(1,round(yPx)-halfWindow);
maxY = min(size(img,1),round(yPx)+halfWindow);
 
imgSmall = img(minY:maxY,minX:maxX);
 
%Transform x and y grids into canonical coordinates.
xCan = (xGrid-xPx)*cosd(-phi) + (yGrid-yPx)*sind(-phi);
yCan = -(xGrid-xPx)*sind(-phi) + (yGrid-yPx)*cosd(-phi);
 
geometry = ((xCan.^2)/(majLenPx^2)) + ((yCan.^2)/(minLenPx^2));
 
mask = geometry < 3; %Full disclosure - this should be a 1 in principle, but this just makes things that bit wider.
mask = mask(1:maxY-minY+1,1:maxX-minX+1);
 
imgSmall(mask == 0) = 0;
total = sum(imgSmall(:));
meanInt = total/sum(mask(:));

Example usage

  imgLoc = 'FluoImg.tif';
  trackLoc = 'Tracks.mat';
  load(trackLoc,'procTracks')
 
  %Get the pixel size from the input image
  imgInfo = imfinfo(imgLoc);
  pixelSize = 1/imgInfo.XResolution;
 
  %Load the image
  imPlane = double(imread(startImgLoc,'Index',1));
 
  %Get the mean and total fluorescence of the object in track 10 at timepoint 1
  [meanFluo,totalFluo] = meanIntInEllipse(imPlane,procTracks(10),1,pixelSize);

Example output: Histogram of mean object intensities for a set of tracks with an associated fluorescence image at their first timepoint. For more details see labelstartandendfluocells.m.

  • post/meanintinellipse.m.txt
  • Last modified: 2019/11/18 16:45
  • by pseudomoaner