Cornell University
BioNB 441
Using Images
Introduction.
Images and image analysis has a large role in neurobiology including:
Matlab makes it easy to produce and handle images algorithmically. It fills a different niche from a program like Adobe Photoshop which allows human artistic interaction with an image. You might use Matlab image abilities to process a few hundred microscope images in order to filter, convert to grayscale, and store as a movie. Such a process would be very tedious using an program designed for artistic manipulations.
The examples will use Matlab and the Matlab Image toolbox.
Examples
clf clear all set(gcf,'doublebuffer','on'); %Build the grid which determines the image resolution [x,y] = meshgrid(1:256,1:128); %initialize the movie n=40; mov=moviein(n); %build the frames speed=.05;freq=.2; for i=1:n %the frame is just a sinewave grating %intensity modulated to--to-botton img=128 * (sin(x*freq+speed*i)+1) .* y.^2/128^2; image(img); %add a frame number text(10,10,num2str(i),'color','white') %Force real pixels truesize(gcf) %transfer the image to a movie frame mov(i)=getframe; end %clear the image image(0*x);axis image; pause(1); %playback the movie %--five times, with reversal %--at 30 frames/sec movie(mov,-5,30); image(0*x);axis image;One frame from the animation is shown below.
% generate a fractal coastline via FFT clf; clear all; %grid size n = 256; [x,y] = meshgrid(1:n,1:n); %Generate a random frequency domain grid s = sum(100*clock); rand('seed',s); freq = (rand(n,n)-.5) + i* (rand(n,n)-.5); % Set the DC level to zero freq(1,1) = 0; % Slope of cutoff filter in freq domain %less negative => rougher outline %-1.5 to -2.5 is reasonable for real coestlines c = -2.1; % % make a matrix with entries proportional to the freq dist = sqrt( x.^2 + y.^2 ) ; % Reduce high freq components by a power law f**c %to make a fractal surface filtered = freq .* dist .^c ; surface = ( real(ifft2(filtered)) ) ; %add a bias to make a lake or a mountain %just change the sign when adding the bias to the surface bias = 6e-8*sqrt( (x-n/2).^2 + (y-n/2).^2 ); bias = bias-mean(mean(bias)); surface = surface - bias ; %Convert to a rgb (truecolor) image surface = cat(3,... .8*(surface>0), ... .6*(surface>0),... surface<=0); image(surface); truesize(gcf);An example is shown below.
figure(1) clf; set(gcf,'doublebuffer','on') clear all; %grid size n = 128; %Generate a random frequency domain grid s = sum(100*clock); rand('seed',s); freq = (rand(n,n)-.5) + i* (rand(n,n)-.5); %Set the DC level to zero newfreq(n/2,n/2) = 0; %low pass parameter--bigger means faster pattern alpha = .1; %lowest spatial frequency -- units are cycles/frame width lowcut = 2; %highest spatial frequency hicut = 10; % make a matrix with entries proportional to the freq %for use in filtering in freq domain [x,y] = meshgrid(1:n,1:n); dist = sqrt( (x-n/2).^2 + (y-n/2).^2 ) ; for j=1:120 %get the next random input newfreq = (rand(n,n)-.5) + i* (rand(n,n)-.5); % Set the DC level to zero newfreq(n/2,n/2) = 0; %lowpass filter combines old and new state freq = freq *(1-alpha) + newfreq*alpha; %band-pass filter the spatial frequency filtered = freq .* ( (dist>=lowcut) & (dist<=hicut) ); %make the intensity distribution surface = abs( (ifft2(fftshift(filtered))) ) ; %and scale it to 0-1 range surface = (surface - min(min(surface)))/(max(max(surface)) - min(min(surface))); %Convert to a rgb (truecolor) image dis = cat(3,surface, surface, surface); %display the grayscale image imshow(dis); truesize(gcf); colormap(gray); mov(j) = getframe; %drawnow end figure(2) movie(mov,1,30);
%make two animal distibutions dist1x=randn(100,1); dist1y=randn(100,1); dist2x=randn(100,1)+2; dist2y=randn(100,1); %compute the convex hull of each c1=convhull(dist1x,dist1y); c2=convhull(dist2x,dist2y); %plot the two distributions and %their respective convex hulls figure(1) clf hold on plot(dist1x,dist1y,'r.'); plot(dist1x(c1),dist1y(c1),'r'); plot(dist2x,dist2y,'b.'); plot(dist2x(c2),dist2y(c2),'b'); %will need the image size below xdist=get(gca,'xlim'); ydist=get(gca,'ylim'); %============= %fill the convex hull polygons %convert them to binary images %then compute the intersection area %and compute the area ratios figure(2) clf hold off axis image fill(dist1x(c1),dist1y(c1),'r'); set(gca,'xlim',xdist); set(gca,'ylim',ydist); pause(1) img=getframe; d1bw=~im2bw(img.cdata,.9); imshow (d1bw); pause(1) fill(dist2x(c2),dist2y(c2),'r'); set(gca,'xlim',xdist); set(gca,'ylim',ydist); img=getframe; d2bw=~im2bw(img.cdata,.9); imshow (d2bw); pause(1) %trim the image edges because of %bogus pixels at the edges [a b]=size(d1bw) d1bw=(d1bw(5:a-10,5:b-10)); d2bw=(d2bw(5:a-10,5:b-10)); imshow(d2bw & d1bw) disp('areas') bwarea(d2bw & d1bw) bwarea(d2bw & d1bw)/bwarea(d2bw) bwarea(d2bw & d1bw)/bwarea(d1bw)An example of two disributions and their computed overlap region is shown below.