Skip to content
Snippets Groups Projects
Commit c0b45a60 authored by Mark Winter's avatar Mark Winter Committed by Mark Winter
Browse files

Commit of MATLAB dependencies.

parent 99fd8d54
Branches
No related tags found
No related merge requests found
......@@ -46,6 +46,7 @@ function debugMovieTracks(trackingStruct, startFrame, trackId, trackColors, mvfi
bPlotCC = 1;
t = startFrame;
fullTrackList = BuildFullTrackList(trackingStruct);
%imwght = (1.6)*mkHCAxon(im, trace, 1.0, 5) + 0.4;
imwght = ones(size(im));
......@@ -130,8 +131,8 @@ function debugMovieTracks(trackingStruct, startFrame, trackId, trackColors, mvfi
function dispTracking(curxlim, curylim)
for k=1:length(selectObjId)
trkt = trackingStruct.globNodeLUT(trackingStruct.trackList{selectObjId(k)},1)';
trkidx = trackingStruct.globNodeLUT(trackingStruct.trackList{selectObjId(k)},2)';
trkt = trackingStruct.globNodeLUT(fullTrackList{selectObjId(k)},1)';
trkidx = trackingStruct.globNodeLUT(fullTrackList{selectObjId(k)},2)';
idx = find(trkt==t);
if ( ~isempty(idx) )
x=trackingStruct.rgDetect{t}(trkidx(idx),2);
......@@ -147,3 +148,27 @@ function debugMovieTracks(trackingStruct, startFrame, trackId, trackColors, mvfi
drawnow
end
end
function fullTrackList = BuildFullTrackList(trackingStruct)
fullTrackList = trackingStruct.trackList;
for i=1:length(trackingStruct.trackList)
trkt = trackingStruct.globNodeLUT(trackingStruct.trackList{i},1)';
deltat = diff(trkt);
sharedidx = find(deltat > 1);
tshift = 0;
for k =1 :length(sharedidx)
srcNode = trackingStruct.trackList{i}(sharedidx(k));
destNode = trackingStruct.trackList{i}(sharedidx(k)+1);
srcPath = trackingStruct.gCellData(trackingStruct.gConnect(srcNode,destNode)).path;
trkt = [trkt(1:sharedidx(k)+tshift) trackingStruct.globNodeLUT(srcPath(2:deltat(sharedidx(k))),1)' trkt(sharedidx(k)+tshift+1:end)];
fullTrackList{i} = [fullTrackList{i}(1:sharedidx(k)+tshift) srcPath(2:deltat(sharedidx(k))) fullTrackList{i}(sharedidx(k)+tshift+1:end)];
tshift = tshift + deltat(sharedidx(k))-1;
end
end
end
function makeTrackingMovie(trackingStruct, fname, fps, selectTracks, minlength)
if ( ~exist('minlength','var'))
minlength = 0;
end
if ( ~exist('selectTracks','var') )
selectTracks = [];
end
if ( ~exist('fps','var') )
fps = 5;
end
fullTrackList = BuildFullTrackList(trackingStruct);
numtracks = length(fullTrackList);
cmap = [winter(512); summer(512)];
trackColors = cmap(round(rand(length(fullTrackList),1)*1023)+1,:);
iminfo = imfinfo(fullfile(trackingStruct.moviepath, trackingStruct.moviename));
kymoinfo = imfinfo(fullfile(trackingStruct.moviepath, trackingStruct.moviename));
N = length(iminfo);
[tracemin, tracemax] = getTrackExtents(trackingStruct, N);
imheight = tracemax(2) - tracemin(2);
kymoheight = size(trackingStruct.imKymo,1);
if ( imheight < 600 )
bDoubleHeight = 1;
imheight = imheight * 2;
end
vidheight = max(imheight, kymoheight);
imratio = vidheight / imheight;
kymoratio = vidheight / kymoheight;
imsize = round(imratio*[(tracemax(2) - tracemin(2)) (tracemax(1) - tracemin(1))]);
if ( bDoubleHeight )
imsize = imsize * 2;
end
kymosize = round(kymoratio*size(trackingStruct.imKymo));
imwght = (5.0)*mkHCAxon(zeros(iminfo(1).Height,iminfo(1).Width), [trackingStruct.jPath';trackingStruct.iPath'], 1.0, 20) + 0.5;
imfig = figure();
kymofig = figure();
bFlipKymo = (trackingStruct.iPath(end) - trackingStruct.iPath(1)) < 0;
movfile = [];
try
movfile = avifile(fname, 'Compression','None', 'fps',fps);
for t=1:N
kymoFrame = drawKymo();
imFrame = drawTracking();
fullFrame = kymoFrame;
fullFrame.cdata = [kymoFrame.cdata imFrame.cdata];
movfile = addframe(movfile,fullFrame);
end
catch excp
if ( ~isempty(movfile) )
movfile = close(movfile);
end
rethrow (excp);
end
movfile = close(movfile);
function frm = drawKymo()
figure(kymofig);
kymoimg = trackingStruct.imKymo;
if ( bFlipKymo )
kymoimg = kymoimg(end:-1:1,:);
end
imagesc(kymoimg);colormap(gray);hold on;
for i=1:length(fullTrackList)
if ( any(i == selectTracks) )
continue;
end
trkt = trackingStruct.globNodeLUT(fullTrackList{i},1)';
trkidx = trackingStruct.globNodeLUT(fullTrackList{i},2)';
if ( length(trkt) <= minlength )
continue;
end
plotidx = find(trkt <= t);
if ( length(plotidx) < 2 )
continue
end
trkpts = GetKymoPt(trackingStruct.rgDetect, trkidx', trkt', trackingStruct.LKymo, [trackingStruct.jPath';trackingStruct.iPath']);
if ( bFlipKymo )
trkpts = size(kymoimg,1) - trkpts;
end
%plot(trkt(1), trkpts(1), 'o', 'Color', trackColors(i,:));
plot(trkt(plotidx), trkpts(plotidx), 'Color', trackColors(i,:), 'LineWidth',2, 'LineStyle','-');
end
for i=1:length(selectTracks)
trkt = trackingStruct.globNodeLUT(fullTrackList{selectTracks(i)},1)';
trkidx = trackingStruct.globNodeLUT(fullTrackList{selectTracks(i)},2)';
plotidx = find(trkt <= t);
if ( isempty(plotidx) )
continue
end
trkpts = GetKymoPt(trackingStruct.rgDetect, trkidx', trkt', trackingStruct.LKymo, [trackingStruct.jPath';trackingStruct.iPath']);
if ( bFlipKymo )
trkpts = size(kymoimg,1) - trkpts;
end
%plot(trkt(1), trkpts(1), 'o', 'Color', trackColors(i,:));
plot(trkt(plotidx), trkpts(plotidx), 'Color', [1 0 0], 'LineWidth',2, 'LineStyle','-');
plot(trkt(plotidx(end)), trkpts(plotidx(end)), 'or', 'LineWidth',2);
text(trkt(plotidx(end))-3, trkpts(plotidx(end)), [num2str(selectTracks(i)) ' \rightarrow'], 'HorizontalAlign','Right', 'FontSize',8, 'Color', [1 0 0]);
end
plot([t t], [1 size(trackingStruct.imKymo,1)], '-r', 'LineWidth',2);
hold off;
drawnow;
truesize(kymofig, kymosize);
frm = getframe(gca);
end
function frm = drawTracking()
figure(imfig);
im = imread(fullfile(trackingStruct.moviepath, trackingStruct.moviename), t);
im = mat2gray(im);
imagesc(im.*imwght);colormap(gray);hold on;
brighten(0.2);
%plot(trackingStruct.jPath(1), trackingStruct.iPath(1), 'og');
%plot(trackingStruct.jPath(end), trackingStruct.iPath(end), 'xg');
for i=1:length(fullTrackList)
if ( any(i == selectTracks) )
continue;
end
trkt = trackingStruct.globNodeLUT(fullTrackList{i},1)';
trkidx = trackingStruct.globNodeLUT(fullTrackList{i},2)';
if ( length(trkt) <= minlength )
continue;
end
idx = find(trkt == t,1);
if ( isempty(idx) )
continue;
end
trkpts = GetKymoPt(trackingStruct.rgDetect, trkidx', trkt', trackingStruct.LKymo, [trackingStruct.jPath';trackingStruct.iPath']);
x=trackingStruct.rgDetect{t}(trkidx(idx),2);
y=trackingStruct.rgDetect{t}(trkidx(idx),1);
if ( trackingStruct.jPath(round(trkpts(1))) < x )
text(x+5,y,['\leftarrow '], 'FontSize',8, 'HorizontalAlignment','Left', 'Color',trackColors(i,:));
else
text(x-5,y,[' \rightarrow'], 'FontSize',8, 'HorizontalAlignment','Right', 'Color',trackColors(i,:));
end
end
for i=1:length(selectTracks)
trkt = trackingStruct.globNodeLUT(fullTrackList{selectTracks(i)},1)';
trkidx = trackingStruct.globNodeLUT(fullTrackList{selectTracks(i)},2)';
idx = find(trkt == t,1);
if ( isempty(idx) )
continue;
end
trkpts = GetKymoPt(trackingStruct.rgDetect, trkidx', trkt', trackingStruct.LKymo, [trackingStruct.jPath';trackingStruct.iPath']);
x=trackingStruct.rgDetect{t}(trkidx(idx),2);
y=trackingStruct.rgDetect{t}(trkidx(idx),1);
bwim = zeros(size(im));
r = trackingStruct.rgCC{t}{trkidx(idx)}(:,1);
c = trackingStruct.rgCC{t}{trkidx(idx)}(:,2);
linidx = sub2ind(size(bwim), r,c);
bwim(linidx) = 1;
bwbound = bwboundaries(bwim);
plot(bwbound{1}(:,2),bwbound{1}(:,1), 'Color',[1 0 0], 'LineStyle','-');
n2 = length(trkt)/2;
if ( trackingStruct.jPath(round(trkpts(n2))) < trackingStruct.rgDetect{t}(trkidx(n2),2) )
text(x+5,y,['\leftarrow ' num2str(selectTracks(i))], 'FontSize',10, 'HorizontalAlignment','Left', 'Color',[1 0 0]);
else
text(x-5,y,[num2str(selectTracks(i)) ' \rightarrow'], 'FontSize',10, 'HorizontalAlignment','Right', 'Color',[1 0 0]);
end
end
text(tracemin(1),tracemin(2), ['t=' num2str(t)], 'HorizontalAlign','Left', 'VerticalAlign','Top', 'FontSize',8, 'BackgroundColor',[0 0.6 0.5]);
xlim([tracemin(1) tracemax(1)]);
ylim([tracemin(2) tracemax(2)]);
hold off;
drawnow;
truesize(imfig, imsize);
frm = getframe(gca);
end
end
function fullTrackList = BuildFullTrackList(trackingStruct)
fullTrackList = trackingStruct.trackList;
for i=1:length(trackingStruct.trackList)
trkt = trackingStruct.globNodeLUT(trackingStruct.trackList{i},1)';
deltat = diff(trkt);
sharedidx = find(deltat > 1);
tshift = 0;
for k =1 :length(sharedidx)
srcNode = trackingStruct.trackList{i}(sharedidx(k));
destNode = trackingStruct.trackList{i}(sharedidx(k)+1);
srcPath = trackingStruct.gCellData(trackingStruct.gConnect(srcNode,destNode)).path;
trkt = [trkt(1:sharedidx(k)+tshift) trackingStruct.globNodeLUT(srcPath(2:deltat(sharedidx(k))),1)' trkt(sharedidx(k)+tshift+1:end)];
fullTrackList{i} = [fullTrackList{i}(1:sharedidx(k)+tshift) srcPath(2:deltat(sharedidx(k))) fullTrackList{i}(sharedidx(k)+tshift+1:end)];
tshift = tshift + deltat(sharedidx(k))-1;
end
end
end
function [tracemin, tracemax] = getTrackExtents(trackingStruct, N)
tracemin = [Inf Inf];
tracemax = [0 0];
for t=1:N
xmin = min(trackingStruct.rgDetect{t}(:,2));
xmax = max(trackingStruct.rgDetect{t}(:,2));
ymin = min(trackingStruct.rgDetect{t}(:,1));
ymax = max(trackingStruct.rgDetect{t}(:,1));
tracemin = [min(tracemin(1), xmin) min(tracemin(2), ymin)];
tracemax = [max(tracemax(1), xmax) max(tracemax(2), ymax)];
end
end
\ No newline at end of file
function wght = mkHCAxonWeight(im, trace, maxwght, stdv)
%imnew = im;
wght = zeros(size(im));
if ( isempty(trace) )
return;
end
[X,Y] = meshgrid(1:size(im,2),1:size(im,1));
coord = [X(:),Y(:)]';
minrad = Inf*ones(1,size(coord,2));
minidx = zeros(1,size(coord,2));
for i=1:size(trace,2)
dstx = (trace(1,i) - coord(1,:));
dsty = (trace(2,i) - coord(2,:));
rad = dstx.^2 + dsty.^2;
[minrad idx] = min([minrad;rad],[],1);
minidx(idx==2) = i;
end
minrad = sqrt(minrad);
%dstx = (repmat(trace(1,:),[size(coord,2) 1]) - repmat((coord(1,:)'),[1 size(trace,2)])).^2;
%dsty = (ones(size(coord,2),1)*trace(2,:) - (coord(2,:)')*ones(1,size(trace,2))).^2;
%rad = sqrt(min(dstx+dsty,[],2));
wght(:) = sqrt(2*pi)*stdv*maxwght*normpdf(minrad, 0, stdv);
%figure;imagesc(wght);
%imnew = im .* wght;
end
\ No newline at end of file
......@@ -28,14 +28,31 @@ function plotConnect(inStruct, minlength)
for i=1:length(inStruct.trackList)
trkt = inStruct.globNodeLUT(inStruct.trackList{i},1)';
trkidx = inStruct.globNodeLUT(inStruct.trackList{i},2)';
trkpts = GetKymoPt(inStruct.rgDetect, trkidx', trkt', inStruct.LKymo, [inStruct.jPath';inStruct.iPath']);
if ( length(trkt) > minlength )
if ( length(trkt) <= minlength )
continue;
end
% deltat = diff(trkt);
% sharedidx = find(deltat > 1);
% tshift = 0;
% for k =1 :length(sharedidx)
% srcNode = inStruct.trackList{i}(sharedidx(k));
% destNode = inStruct.trackList{i}(sharedidx(k)+1);
%
% srcPath = inStruct.gCellData(inStruct.gConnect(srcNode,destNode)).path;
%
% trkt = [trkt(1:sharedidx(k)+tshift) inStruct.globNodeLUT(srcPath(2:deltat(sharedidx(k))),1)' trkt(sharedidx(k)+tshift+1:end)];
% trkidx = [trkidx(1:sharedidx(k)+tshift) inStruct.globNodeLUT(srcPath(2:deltat(sharedidx(k))),2)' trkidx(sharedidx(k)+tshift+1:end)];
%
% tshift = tshift + deltat(sharedidx(k))-1;
% end
trkpts = GetKymoPt(inStruct.rgDetect, trkidx', trkt', inStruct.LKymo, [inStruct.jPath';inStruct.iPath']);
plot(trkt(1), trkpts(1), 'o', 'Color', trackColors(i,:));
h = plot(trkt, trkpts, 'Color', trackColors(i,:), 'LineWidth',1, 'LineStyle','-');
set(h, 'ButtonDownFcn',@PlotSegmentClickFunc, 'UserData', i);
end
end
% function PlotDetectionClickFunc(src, evt)
% clktype = get(gcf, 'SelectionType');
......@@ -106,7 +123,7 @@ function plotConnect(inStruct, minlength)
if ( isempty(mvfig) )
mvfig = figure();
end
debugMovieTracks(inStruct, xData(nearestidx), trackidx, trackColors, mvfig);
debugMovieTracks(inStruct, round(curPt(1,1)), trackidx, trackColors, mvfig);
end
end
......
function [Hscale,Htext]=plot_scale(Pos,Scale,Length,Color,UnitsName,Orient);
%-------------------------------------------------------------------
% plot_scale function Add a scale bar on a plot or image.
% Input : - Scale bar position [X, Y].
% - Scale [Units per pixel].
% - Scale bar length in units (e.g., arcsec).
% - Color, default is 'k';
% - Units name, default is 'arcsec'.
% - Scale bar orientation:
% 'h' - Horizontal (default).
% 'v' - Vertical.
% Output : - Handle for the scale line.
% - Handle for the text.
% Tested : Matlab 7.0
% By : Eran O. Ofek July 2005
% URL : http://wise-obs.tau.ac.il/~eran/matlab.html
%-------------------------------------------------------------------
DistFactor = 0.05;
if (nargin==3),
Color = 'k';
UnitsName = 'arcsec';
Orient = 'h';
elseif (nargin==4),
UnitsName = 'arcsec';
Orient = 'h';
elseif (nargin==5),
Orient = 'h';
elseif (nargin==6),
% do nothing
else
error('Illegal Number of input arguments');
end
NextPlot = get(gca,'NextPlot');
hold on;
XLim = get(gca,'XLim');
YLim = get(gca,'YLim');
Xdiff = abs(diff(XLim));
Ydiff = abs(diff(YLim));
switch Orient
case 'h'
LineX = Pos(1) + 0.5.*Length./Scale.*[-1;-1;+1;+1];
LineY = Pos(2).*[1+0.1*Length./Scale./Pos(2);+1;+1;1+0.1*Length./Scale./Pos(2)];
DistXdir = 0;
DistYdir = -1;
case 'v'
LineX = Pos(1).*[1-0.1*Length./Scale./Pos(2);+1;+1;1-0.1*Length./Scale./Pos(2)];
LineY = Pos(2) + 0.5.*Length./Scale.*[-1;-1;+1;+1];
DistXdir = +1;
DistYdir = 0;
otherwise
error('Unknown Orient Option');
end
%--- plot line ---
Hscale = plot(LineX,LineY);
set(Hscale,'Color',Color);
%--- plot text ---
DistX = DistXdir.*DistFactor.*Xdiff;
DistY = DistYdir.*DistFactor.*Ydiff;
Htext = text(Pos(1)+DistX,Pos(2)+DistY,sprintf('%5.1f %s',Length,UnitsName));
switch Orient,
case 'h'
% do nothing
case 'v'
set(Htext,'Rotation',90);
otherwise
error('Unknown Orient Option');
end
set(Htext,'HorizontalAlignment','center','Color',Color);
set(gca,'XLim',XLim);
set(gca,'YLim',YLim);
set(gca,'NextPlot',NextPlot);
function scrollMovie(root, fname, trace, rgDetect)
if ( ~exist('rgDetect', 'var') )
rgDetect = [];
end
if ( nargin < 3 )
trace = [];
end
fig = figure;
set(fig, 'WindowScrollWheelFcn', @scrollWheelCallback);
set(fig, 'KeyPressFcn', @keyReleaseCallback);
info=imfinfo(fullfile(root, fname));
NFRAMES = length(info);
istat=[]; stats=[0 Inf];
for tk=1: NFRAMES
im=imread(fullfile(root, fname),tk);
if max(im(:))<stats(2)
stats(2)=max(im(:));
end
if min(im(:))>stats(1)
stats(1)= min(im(:));
end
end
t = 1;
imwght = ones(size(im));
% if ( ~isempty(trace) )
% imwght = (0.4)*mkHCAxon(im, trace, 1.0, 5) + 0.8;
% end
tracelimX = [1 size(im,2)];
tracelimY = [1 size(im,1)];
mode = 0;
dispFrame(tracelimX, tracelimY, trace, rgDetect);
function keyReleaseCallback(src, evt)
if ( strcmp(evt.Key, 'm') )
mode = ~mode;
curxlim = xlim;
curylim = ylim;
dispFrame(curxlim, curylim, trace, rgDetect);
end
end
function scrollWheelCallback(src, evt)
if ( evt.VerticalScrollCount < 0 )
t = t - 1;
else
t = t + 1;
end
if ( t > NFRAMES-1 )
t = NFRAMES-1;
elseif ( t < 1 )
t = 1;
end
curxlim = xlim;
curylim = ylim;
dispFrame(curxlim, curylim, trace, rgDetect);
end
function dispFrame(curxlim, curylim, trace, rgDetect)
im=imread(fullfile(root, fname),t);
%im(im<stats(1))=stats(1);
im(im>stats(2))=stats(2);
im=mat2gray(im);
if ( mode == 1 )
k=stdfilt(im,true(7))./im;
hold off;imagesc(k.*imwght);colormap(hot);hold on
else
hold off;imagesc(im.*imwght);colormap(gray);hold on
end
axis equal;
title(num2str(t));
xlim(curxlim);
ylim(curylim);
if ( ~isempty(trace) )
plot(trace(1,:),trace(2,:),'b', 'ButtonDownFcn',@TraceClickFunc);
end
if ( ~isempty(rgDetect) )
plot(rgDetect{t}(:,2), rgDetect{t}(:,1), 'ro');
end
drawnow
scllength = 10;
upp = 0.18;
while ( scllength/upp > (0.5*(curxlim(2)-curxlim(1))) )
scllength = scllength / 10;
end
posx = min(curxlim(2)-(0.5*scllength/upp + 1),0.9*(curxlim(2)-curxlim(1))+curxlim(1));
plot_scale([posx,0.9*(curylim(2)-curylim(1))+curylim(1)], upp, scllength, 'r', 'um', 'h');
hold off;
end
function TraceClickFunc(src, evt)
ca = gca();
loc = get(ca, 'CurrentPoint');
loc = loc(1,1:2);
[len, idx] = min(sum((trace-(loc')*ones(1,size(trace,2))).^2, 1));
slope = (trace(2,idx)-trace(2,idx+1)) / (trace(1,idx)-trace(1,idx+1));
orthslope = -1/slope;
hold on;plot([trace(1,idx)-4;trace(1,idx)+4],[trace(2,idx)-5*orthslope;trace(2,idx)+5*orthslope], 'm');hold off;
end
end
\ No newline at end of file
function writeMotionBlurData(filename, rgMotionBlur)
fid = fopen(filename, 'w');
totalPts = 0;
totalPtrs = 0;
maxNextLength = 0;
for i=1:length(rgMotionBlur)
totalPtrs = totalPtrs + length(rgMotionBlur{i});
for j=1:length(rgMotionBlur{i})
if ( maxNextLength < size(rgMotionBlur{i}{j},2) )
maxNextLength = size(rgMotionBlur{i}{j},2);
end
totalPts = totalPts + size(rgMotionBlur{i}{j},2);
end
end
fprintf(fid, '%d %d %d\n\n', length(rgMotionBlur), totalPtrs, totalPts);
for i=1:length(rgMotionBlur)
fprintf(fid, '%d\n', length(rgMotionBlur{i}));
for j=1:length(rgMotionBlur{i})
fprintf(fid, '%d\n', size(rgMotionBlur{i}{j},2));
for k=1:size(rgMotionBlur{i}{j},2)
fprintf(fid, '%d ', (rgMotionBlur{i}{j}(1,k) - 1));
end
fprintf(fid, ':');
for k=1:size(rgMotionBlur{i}{j},2)
%fprintf(fid, '%d ', rgMotionBlur{i}{j}(2,k));
fprintf(fid, '%g ', rgMotionBlur{i}{j}(2,k));
end
fprintf(fid, '\n');
end
end
fclose(fid);
end
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment