# Superimposing line plots on images152

Posted by Steve Eddins,

Several people have asked me recently how to plot some kind of shape on top of an image, so I thought I'd show the basic technique here. Essentially, you display the image, then call hold on, and then use plot or some other graphics command to superimpose the desired shape. For my first example, I'll superimpose the boundaries found by the bwboundaries function on top of the original binary image.
bw = imread('circles.png');
b = bwboundaries(bw);
imshow(bw)
Now call hold on. This causes subsequent plotting commands to add to what's already in the figure, instead of replacing it.
hold on
Finally, call plot to superimpose the boundary locations.
for k = 1:numel(b)
plot(b{k}(:,2), b{k}(:,1), 'r', 'Linewidth', 3)
end
It's good to get in the habit of calling hold off when you're done adding plot elements. That way, the next high-level plotting command will start over, which is usually what is expected. My second example shows how to superimpose a 25-pixel-by-25-pixel grid on an image. (See Natasha's blog comment.) Display the image first, and then call hold on.
clf
imshow(rgb)
hold on
Now superimpose the grid. To make sure the grid is visible over all pixel colors, I'll use the trick of superimposing two line objects with contrasting colors and line styles. The Pixel Region Tool in the Image Processing Toolbox uses this same trick.
M = size(rgb,1);
N = size(rgb,2);

for k = 1:25:M
x = [1 N];
y = [k k];
plot(x,y,'Color','w','LineStyle','-');
plot(x,y,'Color','k','LineStyle',':');
end

for k = 1:25:N
x = [k k];
y = [1 M];
plot(x,y,'Color','w','LineStyle','-');
plot(x,y,'Color','k','LineStyle',':');
end

hold off

Get the MATLAB code

Published with MATLAB® 7.3

Dear Steve,

I ran into the following peculiar aspect of overlays – if you decide to fill the BW image in your example with single pixel dots using the plot command, you do not obtain a smooth even coverage – it becomes patterned, as if the plot command is interfering with something else. In include a code example below

b = bwboundaries(bw);
figure(1);
imshow(bw);
[sx sy]=size(mybw)
myhighim=zeros(sx,sy);
Ihigh=find(mybw>0.5);
myhighim(Ihigh)=1;
hold on;

[mycol myrow]=find(myhighim>0);

plot(myrow,mycol, ‘.’,’color’,’red’,’MarkerSize’,1);

TomAtVandy replied on : 2 of 152

Besides the typos, if you use
plot(myrow,mycol, ‘.’,’color’,’red’,’MarkerSize’,10);
plot(myrow,mycol, ‘.’,’color’,’red’,’MarkerSize’,1);
the circles will be filled in completely when you enlarge the plot. There may be other issues but this worked for me with my video card and screen resolution.
Tom

Steve replied on : 3 of 152

Steffen – I observed no pattern when I ran your code. If you resized the figure, then I would expect you to see a pattern.

Tracy replied on : 4 of 152

Hello Steve,

I have a question about one function in the image toolbox, that is, canny in ‘edge’. Applying canny edge detector requires two thresholds, low threshold and high threshold. They are derived from PercentOfPixelsNotEdges and ThresholdRatio which is set as 0.7 and 0.4. How do these two values come from? The file is in \MATLAB701\toolbox\images\images\edge.m, and these two values are at 221st and 222nd line. Thank you so much.

Regards,
Tracy

Steve replied on : 5 of 152

Tracy – I believe those default threshold values were determined heuristically, which is a fancy way of saying that we experimented and picked values that seemed to work well most of the time.

Matt Whitaker replied on : 6 of 152

Hi Steve,
When I have to superimpose lines on images I usually use the line function directly. This way the hold command is not required (and remembering to turn it off!!)
So for your first example I would do:
b = bwboundaries(bw);
imshow(bw)
for k = 1:numel(b)
line(‘Parent’,gca,…
‘XData’,b{k}(:,2),…
‘YData’,b{k}(:,1),…
‘Color’,’r’,…
‘Linewidth’, 3)
end

Keep up the the great , must read, blog
Matt

Steve replied on : 7 of 152

Good point, Matt – and thanks for the encouragement!

Karl replied on : 8 of 152

Hi Steve,

one – probably simple – question: how can I plot shapes (e.g., lines) _into_ an image, so it will remain in the img matrix and I can go on working with it? So, to make this clear, I don’t want to superimpose the plot.

Can you help me on this? Thanks alot!
Karl

Steve replied on : 9 of 152

Karl – You’ll need to superimpose the plot and then use getframe to get a new image containing the superimposed graphics.

Jaakko replied on : 10 of 152

Hi Steve!

Thank you for the great article! I’ve been looking all over the internet for a simple way to plot on an image. Keep the great blog entries coming :)

- Jaakko

Steve replied on : 11 of 152

Jaakko—Happy to help!

Hi Steve,

I have plotted a polygon (say Polygon-A) on an image. Now, I need to plot another polygon (say Polygon-B), on the image such that Polygon-A is not visible. I need to do this without using either imshow or image or imagesc command again. In other words, how can i simply erase Polygon-A and plot Polygon-B without calling either imshow or image or imagesc command again.

Steve replied on : 13 of 152

Sridharan—Delete the line object created when you plotted Polygon A. For example, you could get the handle returned by plot and then later delete it when you no longer want it visible:

h = plot(ax, ay);
...
delete(h)  % make Polygon A plot go away

Barbara replied on : 15 of 152

Hello,
I have got a problem with the matlab function bwboundaries, correctly with the using of its results.
Perhaps somebody has already a solution.

I have a black-white picture as data and the boundaries are found by the function.
I can correctly display the boundaries included in the original image.
My problem starts, if I want to display only the boundaries. The bwboundaries seems not “take” every information of the picture, so the boundaries are misscaled and rotated but I can’t find a possiblity to get the original size back.

Thank you for the help.

Steve replied on : 16 of 152

Barbara—I assume you are plotting the x-y locations of boundary vertices using plot. The plot function by default autoscales the plot so that it encompasses just the data being plotted. Set the XLim and YLim properties so that the plotted range is the same as the image, and set the YDir property so that the y-axis increases downward instead of upward. The xlim and ylim functions are convenient for this purpose. If your image has 100 rows and 200 columns, for example, then do this:

plot(x,y)
xlim([0.5 200.5])
ylim([0.5 100.5])
set(gca,'YDir','reverse')

Julius replied on : 17 of 152

Dear Steve,

I would like to seek your help on the following:

I have a JPEG, which I have divided into 30 rows by 60 columns using your method above.

Now, if I would want to highlight a particular rectangle, say (29, 59), how should I do it?

Thanks a lot!

Steve replied on : 18 of 152

Julius—You could use the techniques in this blog post to plot that rectangle on top of the image. Or you could superimpose a semitransparent patch covering the desired rectangle. See the MATLAB Graphics documentation covering patches and transparency.

Julius replied on : 19 of 152

Dear Steven,

Thanks a lot for your help!

Martin replied on : 20 of 152

Dear Steven,
Maybe this is a little bit offtopic, but I have tried to save an image with the grid like you blogged it with saveas.

saveas(fig, savefile, ‘jpg’ );

But if I save the figure, only the image is saved, the grid isn’t saved with. Why? I tried a few other endings but no one was working.

Martin

Steve replied on : 21 of 152

Martin—I don’t know. I suggest that you contact technical support.

Martin replied on : 22 of 152

Oh okey,
Have a nice day,
Martin

Steve replied on : 23 of 152

Martin—I have a two-minute threshold on blog comments. If I can answer in less than two minutes, I do so immediately. Otherwise I move it onto my list to do “later.” :-)

Varun replied on : 24 of 152

Great work Steve. I just started image processing and matlab and this has been really helpful. Thanks a lot.

Hello Steve,

Could you tell me a little bit more about your grid overlay function? I’m new to matlab so I wouldn’t know how to tweak your commands off hand.

Ideally I’d like display a 1536 box grid (rectangle) overlay of a set of images.

See this link for an image example:

The grid would serve two purposes.

1. To visually correlate a hit (white spot) with the corresponding treatment (which is already mapped out in alphanumeric coordinates A1, B2, etc)

2. To use the quadrant as a way of keeping track or bounding elements that are identified using the “numObjects” and “regionprops” functions.

Andrew

Steve replied on : 27 of 152

Andrew—It looks to me like you face an image analysis problem before you can even know where to draw the grid. You need to detect the dot spacing and possibly the dot grid rotation. You might want to look at the DNA microarray case study on the MATLAB Central File Exchange.

There’s not much going on in the code in this post. There are basically three steps:

1. Display the image with imshow
2. Call hold on so subsequent plotting commands don’t start by clearing the figure
3. Call plot with the x-y coordinates that form the grid.
pallavi replied on : 28 of 152

hi,,
my project is face recognition using dct.
i have to extract features like eyes, nose, mouth and take dct of those coefficients. using impixel i can get the pixel value for eye centre and i have constucted a matrix which cover eye region.
now my problm is i have to show the traced eye(which is a matrix) region on the face image in the form of rectangle .
how do i do that??

Steve replied on : 29 of 152

Pallavi—Have you tried the techniques shown in this post for superimposing a line plot on an image?

Tommy replied on : 30 of 152

Can you educate me how to do template matching for two image?
Thank you very much.

Steve replied on : 31 of 152

Tommy—Take a look at the normxcorr2 function.

Tommy replied on : 32 of 152

Yes, i have tried over this function. Actually, I want to get the highest correlation score within the templates to determine the person of the full face image. I use it on face recognition. However, I am not quite sure how to write it in Matlab. In C, I used affine transform to patch the template on the image and calculate the correlation score. Do you mind to write me or show me where to get such references on template matching algorithm in programming?

Thank you very much.

Steve replied on : 33 of 152

Tommy—I still don’t see how what you’re describing is different from normalized cross correlation. If you want to see how to program that, look inside normxcorr2.m.

Azmi Mohd replied on : 34 of 152

Dear Steve
I’m working with an image of a shaft and the purpose is to measure its diameter. I have problem with the image because it is shining on the top . I tried many ways but no one was working.Hope you can help me.

Localhorst replied on : 35 of 152

Hi Steve,

grid works fine, thx. Is it possible to make eache square a button, so i can extract the accordant tile image from the complete image? Would be very nice, if you have some ideas about that.

Thx
Localhorst

Steve replied on : 36 of 152

Localhorst—You can give the image object a ButtonDownFcn and then program the callback to do whatever you want, including extracting tiles.

Jonathan Schmitt replied on : 37 of 152

Hey Steve,

Is it possible to superimpose a 3D contour onto a real time image?

Thanks

Jon

Aditya replied on : 38 of 152

Hi Steve,

I’m doing motion estimation using block matching and need to create a grid of arrows to represent the motion vectors.
Can you tell me how to plot arrows with using only the start and end co-ordinates?
I tried using the line ‘Marker’ property, but it marks both the ends of the line!

Thanks a lot.

Steve replied on : 39 of 152

Steve replied on : 40 of 152

Jonathan—I don’t understand your question. What do you mean by “3D contour” – an isosurface? And what do you mean by “real time image”?

Dan B replied on : 41 of 152

Is it possible to superimpose a image onto the XY plane in a 3d plot?

I would like to draw “bars” over certain parts of an image, to show values at those given locations. i was planning on drawing the bars manually, ie, plotting points from z = 0 to the height, for a given x and y.

What about if i would like to create an animation? Ie, the bars change height with time.

Steve replied on : 42 of 152

Dan—Handle Graphics image objects are rendered only in 2-D views. However, you can texture map on image onto a flat surface object to get a 3-D graphic. Take a look at the documentation for surface.

Erik replied on : 43 of 152

I am ploting trajectories, an in every timestep I would like to plot the background image corresponding to the most recent point in time.

When I use imshow, all lines ploted in the past are cleared, although I have “hold on”. How can I keep them and only update the background image? Thanks!

Jon Schmitt replied on : 44 of 152

Steve,

Sorry for the confusion. I want to overlay a Matlab plot onto a real time video feed. So basically I want to acquire video and then onto these real-time images I want to place a MATLAB plot. I hope this helps.

Steve replied on : 45 of 152

Jon—You can use the Image Acquisition Toolbox to acquire video. Then you can use standard Handle Graphics functionality to display the video images with superimposed plots. I suggest that you update the CData property of the HG image object directly, instead of calling image (or imshow) for each video frame.

Lori replied on : 46 of 152

Is there a way to superimpose a small image onto a larger plot? I’m doing some geographical maps and would like to use small icons/gifs to represent some features.

Steve replied on : 47 of 152

Lori—Sure, multiple Handle Graphics objects can be combined in one plot. If you want to use imshow to display the image, use the 'Parent', 'XData', and 'YData' input parameters to set which axes object the image goes into, and where it gets displayed in x-y data space of the axes.

Shashank replied on : 48 of 152

Hello Steve,
I wish to plot a regular plot on an image. The problem is that once an image is displayed, Matlab reads the current figure in terms of pixels rather than x and y values which i need.
For instance:
imshow(‘1.jpg’);
hold on;
t = 1:100;
plot(t,sin(t));

Kindly help,
Shashank.

Steve replied on : 49 of 152

Shashank—Images are displayed by default with each pixel taking up one unit along the x- and y-axes. You can control this spacing by setting the XData and YData properties of the image object. Take a look at the coordinate systems section of the Image Processing Toolbox Users Guide. Also look at the doc for imshow to see how to use the XData and YData syntax.

Peter replied on : 50 of 152

Is there any way to do the plot overlay on an image without using the imshow function? Or, more specifically I would like to run this in the background without it the image popping up popping up a zillion times. Anyway we can just interact with the objects? Thanks so much! Great advice so far!

Steve replied on : 51 of 152

Peter—imshow will display in the current figure if there is one. That figure doesn’t need to be on top or even visible. Or you can use the 'Parent' syntax of imshow to direct it to display in whatever axes you wish.

Conni replied on : 52 of 152

Dear Steve, i have a gray scale image and a second image of the same size with ‘colormap’ patches on a zeros background (and can also extract the point coordinates and values of the patch pixels). After adding the patch pixels with the ‘hold on’ -> ‘plot’ command to the gray scale image, how can I make these patch pixels appear in ‘colormap’ style? Thanks a lot for you help, Conni

Steve replied on : 53 of 152

Conni—I don’t understand what you mean by an “image with ‘colormap’ patches” and “patch pixels with ‘colormap’ style.”

Conni replied on : 54 of 152

Dear Steve, with ‘colormap’ patches I mean round objects in the image displayed via colormap(jet) and I would like to have only these in colour on top of the grayscale image. Thanks, Conni

Steve replied on : 55 of 152

Conni—A figure can have only one colormap at a time. So you can’t display one image with a grayscale colormap and another image with the jet colormap in the same figure. You’ll need to convert the images to truecolor form.

Ryan replied on : 56 of 152

Dear Steve,

I have programmed an animation that shows the affect of gravity on an object. I want to lay my animation over a background image. Due to the way that the image matrix sets the axes, my object is “falling up”. How can I change the way that the image matrix counts itself so that that the bottom left corner is the (0,0) index of the image and it counts up vertically and to the right?

Cheers,
Ryan

Ryan replied on : 57 of 152

Wait I just figured it out! Ignore my last post.

Steve replied on : 58 of 152

Juri Minxha replied on : 59 of 152

Hello,

I am trying to do an oval profile of an image. It sums up the pixel intensities in a particular radius starting from the center. How can I do this?

Thanks

Steve replied on : 60 of 152

Juri—You can use interp2 to extract pixel values along your oval path.

Andrew replied on : 61 of 152

Dear Steve,

I would like to know how can I plot extracted edges (via canny filter) of the image on the original image (which is a grey scale image)without making it boundary?

Thank you,

Andrew

Steve replied on : 62 of 152

Andrew—Take a look at my image overlays post.

Fernando Marques replied on : 63 of 152

Dear Steve.
I was wondering if you could help me out. I’d like to superimpose two line plots with difference axis range. I created this sample script to illustrate my problem:
%
clear all;
k=0.0:0.05:1;
%
figure(‘position’,[25 25 1260 945],’color’,’white’)
plot(k.*exp(k));
F=getframe(gcf);
X0=F.cdata;
imwrite(X0,’fig1.tif’,’tif’);
%
clear all;
k=0.0:0.05:1;
imagesc(bg);
axis off;
hold on;
plot(k.*log(k+10))
%
As you can see, I first create a TIF file with the first line plot. I then read in this figure and try to superimpose a second line plot over it.
My problem is that the second plot shows up very small on the upper left-hand corner of the figure. I’d like both line plots occupying the same space, and only the first plot’s axes properties showing. How can I do that? Thank you in advance for your help. Fernando

Steve replied on : 64 of 152

Fernando—You can control the spatial extent of image pixels by setting the XData and YData properties of the Handle Graphics image object. You might need to do this in order to establish consistent coordinate system for the different things you are trying to plot together. See the Image Processing Toolbox document for the section on image coordinate systems.

sharmin replied on : 65 of 152

Dear Steve

I have a question that might be related to the subject you posted on this site. I need to graph a 2-D velocity model using a gray scale. Could you please guide me how can I do it in MATLAB?

Thank you
Sharmin

Steve replied on : 66 of 152

Sharmin—Try looking at MATLAB functions such as imagesc, colormap, gray, and colorbar. Also take a look at the “Graphics” section of the MATLAB documentation.

Berkan replied on : 67 of 152

Dear Steve,

I am trying to detect moving objects in a video. I use optical flow to get the coordinates (stats.BoundingBox = [r c w h] ) for each frame. My aim is to draw a rectangle on each frame and save the frames with the rectangle that helps track the object. i.e. without superimposing and without ever calling imshow().
Example code:

%n = number of frames in the video sequence
%vid(h*w*n)= intensity video,consisting of n frames
%B(n*4)= the coordinates matrice (for each frame)that gives the location of the object for each frame. e.g. B(1,:) = [1 50 100 100]
%M(h*w*n) = The matrice to store my results

M = zeros([size(vid,1) size(vid,2) n]);
for k=1 : n
imagek = vid(:,:,k);
rectangle('Position', B(k,:), 'EdgeColor', 'r');
Xk = function that places the rectangle on imagek (my current frame).
M(:,:,k)=Xk
end
implay(M);


I believe it should be simple but couldnt figure it out :(.

Berkan

Steve replied on : 68 of 152

Berkan—It sounds like you want to modify each frame so that it contains a white rectangle, but without displaying any graphics. But your sample code contains graphics calls like implay and rectangle.

You need to modify imagek yourself. Use indexing to assign the desired values to the desired set of pixels that define a rectangular box.

imagek(top, left:right, 1) = 255;
imagek(top, left:right, 2) = 0;
imagek(top, left:right, 3) = 0;
...

Maxi84 replied on : 69 of 152

Hi Mr. Steve,

Thank you for your previous post regarding on how to create a grid on a picture.

Now I need your help to determine coordinate for each rectangular, is it possible because of the superimpose techniques.

Another thing is, can I manipulate the coordinate to do ray-tracing on the same picture.

Thank You,

Sincerely Yours,

Maxi84

Steve replied on : 70 of 152

Maxi84—Since you are drawing the grid on the picture, you must know the coordinates. Or am I misunderstanding your question? I can’t help you with ray tracing because I don’t know anything about that.

Maxi84 replied on : 71 of 152

Hello Mr. Steve,

Regarding to my last comment, yes i can have the coordinate for certain rectangular (I can’t have the coordinate for every rectangular that I pointed by using the data cursor)when i’m used the data cursor. Here I need your help to resize my picture because I got 501x430x3 uint8 when i run the ‘imread’ command for my bit.map picture.

Thank You,

Sincerely Yours,

Maxi84

Steve replied on : 72 of 152

Maxi84—Use imresize.

Francesco replied on : 73 of 152

I plot a surface (viewed in the XY plane), then I try to superimpose a 2-D scatter plot: the latter seems to be placed under the surface.
I would put the scatter plot over the surface.
How to deal with display order of such a two graphic objects (and for any graphic objects)?
Francesco

Steve replied on : 74 of 152

Francesco—Your question is getting pretty far off topic for an image processing blog. But when you plot objects in 2-D, the objects have an implicit z value of 0. So therefore your 2-D objects are “underneath” the surface. You could adjust this by adding the appropriate z values so your 2-D objects appear just above the surface.

Francesco replied on : 75 of 152

Thank you for your hint. Sorry for my off-topic question.
I still have the problem with a rectangle superimposing other objects (e.g. labels), but I will continue to browse the web for it (until now, very hard task), unless … you would be so kind to help me privately ;-)
Bye

Steve replied on : 76 of 152

Francesco—Try modifying the stacking order (order of children) of the axes. See uistack.

Francesco replied on : 77 of 152

Wonderful! It works!
You have taught me a very useful thing.
Thank you very much, Steve.
Best regards

Maxi84 replied on : 78 of 152

Hello Steve,

Is it possible to label each boxes with my own co-ordinate.

Thank You,

Sincerely Yours,

Maxi84

Steve replied on : 79 of 152

Maxi84—Sure, there are a lot of different things you could do. What exactly did you have in mind? You could use axes labels, or plot text strings in different locations yourself.

Maxi84 replied on : 80 of 152

Hello Steve,

When I’m load a picture by using imshow command,
I got a picture range for x=1:215 & y=1:250. Then I tried to make smaller the picture by using imresize command and it become smaller according to the resize value factor such as 0.5 & I got half range from the previous picture.

Below is my resize command:

B = imread (‘F:\SPACE DIVISION METHOD\FKEKK OUTDOORBMP.bmp’)
imshow (B)
B2 = imresize (RGB, 0.5)
imshow (B2)

So what I meant from my last post is, if I want to have a picture with my own co-ordinate such as for x axis range from 1:65 and y axis range from 1:40 with the co-ordinate (1,1) until (65,40). Is it possible Sir?

Then I want to superimpose grids according to the coordinates. Can you please guide me regarding to this topic Sir…

My grid to grid distance command:

for k = 1:1:M
x = [1 N];

when I changed the step to 1, the distance between rectangular grid become so small. So is there any other way for me to create the rectangular grid according to my own coordinate value such as from (1,1) until (65,40) with reasonable step.

Thank You,
Sincerely yours

Maxi84

Steve replied on : 81 of 152

Maxi84—Yes, you need to set your values for the XData and YData properties of the Handle Graphics image object. These properties control where the image pixels lie in the data space of the axes. See the image properties documentation and the imshow documentation.

Walther replied on : 82 of 152

If I am concerned with speed, and I want to display a particle swarm (thousands of moving dots) on top of a 2D image, what do you think would be the fastest way of doing this ?

Deleting handles after each iteration, textures and 3D rendering, direct openGL rendering, or another option ?

Steve replied on : 83 of 152

Walther—If the number of dots does not change (only their position), then I suggest that you create a single line object and reset its XData and YData properties with each iteration. Direct OpenGL rendering (bypassing MATLAB rendering) is not an option within MATLAB.

amina replied on : 84 of 152

Hello!
I am making a software for gps navigation system. I want to place a small icon at the current position of the client.
Can you kindly guide me how to place a small icon given the latitude and longitude.

Thanks a lot!

searching replied on : 86 of 152

Hey, I found this place extremely useful. I have a question though.

Although I manage to plot my points on an image. The two axes did not appear. How do I make them visible?

Here is my script

figure;

imshow(I);
hold on;
plot(B(:,2), B(:,4),’r.’);
ylim([0,B(2,5)]);
xlim([0,B(2,3)]);
set(gca,’YDir’,’reverse’);

xlabel(‘horizontal side’);
ylabel(‘vertical side’);
title(‘Locus of Hot Spot using Idle’);

hold off;

Steve replied on : 87 of 152

Searching—

axis on

Sanket replied on : 88 of 152

Hey Steve,
I will like to ask you 1 question.
I am using Matlab R2007B for my project i.e. motion detection and tracking.
In that I was trying to draw a line on an image which will is going to represent motion and that image is part of video film(as video film comprises of 30 images per scond).
I got co-ordinates to draw a 4 lines so that at the end it will become rectangle.
but i am not able to draw it on image…

Steve replied on : 89 of 152

Sanket—If you know the position of the rectangle and the rectangle is aligned with the horizontal and vertical axes, then you can just change the pixel values of the image yourself using ordinary subscripted assignment. If the rectangle isn’t aligned, then that’s harder. Try making your own copy of toolbox/images/images/private/intline.m; it will help you calculate the pixel locations from one rectangle vertex to the next.

Priscilla replied on : 90 of 152

Hello,
How do i use this grid to perform stereology(surface&length density). i have binary image(480×640), i superimpose the grid using your idea. but i need to find the number of intersection of the grid with the BW per unit lenth.
Priscilla

Steve replied on : 91 of 152

Priscilla—This example is about plotting; I don’t think it will help with your stereology problem. I’m sorry, but I know very little about stereology.

Sirisha replied on : 92 of 152

Hi Steve,

I have developed a GUI that displays 4 images on 4 axes (using imshow). I used ‘line’ to create a line object on one of the axes. But the line is not visible on the image when I run the code. I find that the code is executing correctly in debug mode. Repeating these steps outside the GUI in a new figure window displays the line perfectly.

I have also tried the plot command without any success. Am I missing something?

-Sirisha

Steve replied on : 93 of 152

Fabian Ojeda replied on : 94 of 152

Alternative grid (without loops)

Great blog Steve! Have found/learnt lots!

This is my alternative (not sure whether still of use to anyone) to the superimpossed grid. It doesn’t require loops!

clf
M = size(rgb,1);
N = size(rgb,2);
x = 1:25:N;
y = 1:25:M;
imshow(rgb)
hold on
plot([x' x'],[1 M],'Color','w','LineStyle','-')
plot([x' x'],[1 M],'Color','k','LineStyle',':')
plot([1 N],[y' y'],'Color','w','LineStyle','-')
plot([1 N],[y' y'],'Color','k','LineStyle',':')
hold off;


- Fabian

Dabhi replied on : 95 of 152

I have a circularly symmetric image and I want to superimpose a circle of radius (r) on top. I was given this code


function plotround

x0=390;
y0=423;
O=x0+i*y0;

d=20;
Z0=O+d;

thitar=0:10:360;  %degree

lr=length(rthitar);
for di=1:lr
Z(di)=O+(Z0-O)*exp(i*rthitar(di));
end

pZ=[Z,Z(1)];

hold on;plot(pZ,'ko-');

%figure;plot(pZ,'ko-');
%keyboard;


But it is only visible over half the range i.e. this page is the solution but I ma useless at coding so I have gotten all confused.

Any help appriciated.

Dave

Steve replied on : 96 of 152

Dabhi—Try something like this:

theta = linspace(0, 2*pi, 200);


and then use plot(x,y).

Till replied on : 97 of 152

Hi Steve,
thanks for sharing your advice in this forum. I know that this issue has been touched in previous postings, but I’d like to know whether there is more elegant way to superimpose a colored contourplot on a grayscale image other than using getframe to capture the contourplot. In another blog I found the recommendation to adjust the colormap of the grayscale image and the contour, so that both appear in the same figure in a useful way. I tried to modify the colormaps, but the results are not satisfying due to the color intensity in the original image.

Steve replied on : 98 of 152

Till—Convert the grayscale image to truecolor form by replicating it in the 3rd dimension:

rgb = cat(3, I, I, I);


Then you can use whatever colormap you want for the contours without affecting the colors in the image.

Till replied on : 99 of 152

Hi Steve,
thanks for the hint. It works fine. However, there is still a small visible difference in intensity between the gray scale image and the gray scale image which has been converted to rgb. I noted this also, when doing it the other way, i.e. I reduced a “false” rgb to one channel. I assume the “false” rgb image was created by some other image processing program in the same way from gray scale, since it is a transmission electron (TEM) image and TEM images are gray scale in general. Anyway, thanks again. The blog and the MATLAB community helped me quite a bit.

Steve replied on : 100 of 152

Till—There should be no difference in display. It’s hard to say what you might be seeing because you didn’t explain how you’re doing the different conversions. For example, how are you “reducing” your RGB image to one channel?

Miguel replied on : 101 of 152

Hello Steve,
Thanks for the PDF on image superimposed, it was very helpful. I’ve managed to superimpose an RGB image using(imshow)to a Pcolor plot using the values on the’Cdata’

My problem is that, in the superimposed figure i would like to display the values for the Cdata matrix(i.e.0-60)on a colorbar and scale them to their own colormap,i.e colormap(jet(60)).

What happens now is that the ‘Cdata’ values of pcolor are scaled to the colormap of the RGB image,so instead of the Cdata and a colorbar scaled from 0-60 i get a colorbar and Cdata scaled to a 0-255 colormap.

Is there anyway to separate the two, having a background picture and a pcolor plot on top scaled differently?

Some of the code i have :

<Xlessthan30 = X

Miguel replied on : 102 of 152

Hello Steve,
Thanks for the PDF on image superimposed, it was very helpful. I’ve managed to superimpose an RGB image using(imshow)to a Pcolor plot using the values on the’Cdata’
My problem is that, in the superimposed figure i would like to display the values for the Cdata matrix(i.e.0-60)on a colorbar and scale them to their own colormap,i.e colormap(jet(60)).
What happens now is that the ‘Cdata’ values of pcolor are scaled to the colormap of the RGB image,so instead of the Cdata and a colorbar scaled from 0-60 i get a colorbar and Cdata scaled to a 0-255 colormap.
Is there anyway to separate the two, having a background picture and a pcolor plot on top scaled differently?
Some of the code i have :

<Xlessthan30 = X

Miguel replied on : 103 of 152

Hello, I just sorted the problem, i managed to do it by only setting the clim property of the axis to the limits i wanted. thanks!

Priscilla replied on : 104 of 152

i have biary image and i also have aseparate grid. i was thinking of using the operation AND to obtain numbers of points interection of the grid and image

Priscilla replied on : 105 of 152

Steve, the image is a blood vessel that i have reduced to a line(sketetonized) by using bwmorph but also its a binary image. i want to find/marked the intersections. so i created a grid same as the image size and separated by 25. then i want to get the interection by ANDing. the problem is i can not asign the grid to be 0/1.my idea can be expressed as;

numberOf Intersection=find(image&grid=1);%if the grid=1 amd Image is binary

Steve replied on : 106 of 152

Priscilla—Can you be more specific? What code did you actually try, and why exactly were the results not satisfactory?

Priscilla replied on : 107 of 152

Hello Steve,
i used your codes above to overlay the grid over the image(binary). but i need to mark and count those points where the grid cuts7intesect the image features and not the background.

Priscilla replied on : 108 of 152

M = size(rgb,1);
N = size(rgb,2);

for k = 1:25:M
x = [1 N];
y = [k k];
plot(x,y,’Color’,’w’,’LineStyle’,’-‘);
plot(x,y,’Color’,’k’,’LineStyle’,':’);
end

for k = 1:25:N
x = [k k];
y = [1 M];
plot(x,y,’Color’,’w’,’LineStyle’,’-‘);
plot(x,y,’Color’,’k’,’LineStyle’,':’);
end

hold off

a grid is overlay on the image.
What i mean by intersection points, is that points were the onions,tomatoes and green papper cuts the gray grid. if the onions etc are binary image they will have a value [1 1 1]. the background(purple) is [o o o]. with infro, how can i mark the intersction og line point with image.

Hongying replied on : 109 of 152

Hello Steve,

I would like to know how can I plot a line with different colors associated to each points/step(like using colormap)?

data are like this:
line.xyz % the x y z coordinates, assuming the length is 50
line.color % in total 50, between 0 and 1, a variant used to character the color of each point/step, or use the multiplication of line.color(:) to character the color of the line in one color.

I also want to show this line(fiber) on some images(some slices of heart), I have no idea for this, can you give me some advice ?

Thanks.

megha bhatt replied on : 110 of 152

Hello,
I have plotted a line on an image and now I want to know this line’s pixel positions. How can I extract pixel positions?
Thanks.
Megha

Vivek Kaul replied on : 111 of 152

I am not able to increase the line-width for the plot using the commands you have suggested above. Even if I change linewidth from 2 to 100 the width stays the same. Why is that? I am facing difficulty in getting a printout with the color. Is it because the points are too closely spaced.

figure,
imshow(Image_ground)
hold on

[Y,X]=ind2sub(size(Image_ground'),detectedCurve);

for i=1:count

plot(Y(i),X(i),'c', 'Linewidth',10)
end

Steve replied on : 112 of 152

Vivek—It’s because you are calling plot many times with a single point each time. The LineWidth parameter doesn’t have much affect on a single point. :-)

There’s no need for your loop. Just call plot once:

plot(Y,X,'c','LineWidth',10)

Vivek Kaul replied on : 113 of 152

When you superimpose the plot over an image and you want to rotate the image along with the plot by 90 degrees what is the best way to do that?
Regards
Vivek

Steve replied on : 114 of 152

Vivek—Consider using hgtransform, although you’ll have to pay attention to the limitations of hgtransform with respect to image objects.

Jeremy replied on : 115 of 152

Steve,
I’ve got 2 different (1000,1000) 2D arrays, defined over the same locations according to meshgrid. I want to plot contours of one of these arrays on top of a scaled image of the other, but it doesn’t seem to work. Simply put, the code looks something like:

figure
imagesc(x1,x2,arr1)
hold on
contour(x1,x2,arr1)

After doing this, all I can see is the image without the overplotted contours. Any ideas?

Jeremy replied on : 116 of 152

oops – last line should read “contour(x1,x2,arr2)”. Thanks.

Steve replied on : 117 of 152

Jeremy—The X and Y inputs to the image function are not the same as the X and Y inputs to the contour function. You’ll need to read the doc for both functions carefully to determine how they should be called for your application.

Maximilien replied on : 118 of 152

Dear Steve,

Thanks a lot for the “image plot” explanation!
Thanks to it, i could plot my image (2048*1536 pixels), add some countours and lines on it (curves functions were defined based on the image matrix)….

but i would like now to export the resulting image with the pixel size and resolution (for further analyses in another software).
However the “export plot” tools either resized the picture to be “screen” sized or when i succeeded to get the size i want exported only a snapshot of the screen…
How could i get a new “processesd” picture which is the exact reproduction of the original with the curves i want to draw?

Maximilien

Steve replied on : 119 of 152

Maximilien—Use the print function with the “-r” option to control the desired output resolution. You might also want to look at the PaperPositionMode property of the figure.

Ramesh replied on : 120 of 152

Hi Steve,

Is there a function to draw a 2d grid for a user defined (irregular) region of interest with the gridlines lying only within the region?

I searched the documentation and ran into meshgrid. Is there some sort of a meshgrid for 2d?

Thanks

Steve replied on : 121 of 152

Ramesh;No. Also, I think meshgrid is unrelated to your question.

Kaushik replied on : 122 of 152

Hi, is it possible to turn the grids on (with a pre-set grid spacing) while using implay? I have a sequence of 45×45 matrices (each element in each matrix has R,G,B components) that I can scroll through, using implay. But what I also need, are grids seperating each cell of the matrix.

With a single image, I can do the following:
grid on;
set(gca,’xtick’,[0.5:1:45.5]);
set(gca,’ytick’,[0.5:1:45.5]);
set(gca,’XTickLabel’,[]);
set(gca,’YTickLabel’,[]);

The above commands work well on image() but not on implay().

Diogo Costa replied on : 123 of 152

I Steve,

First of all, congratulations for the blog, I found it very interesting and helpful.

I have a problem. I want to create a plot on top of an image. But my plot is a set of coordinates exported from another software, and I need to match the coordinates with the image. Is it possible to define the limits for the axis xy?

Best regards,
Diogo Costa

Steve replied on : 124 of 152

Diogo—Sure. Look in the graphics documentation for information about the XData and YData properties of an image object. Note that the Image Processing Toolbox function imshow supports setting these properties via the ‘XData’ and ‘YData’ name/value pairs.

Diogo Costa replied on : 125 of 152

Dear Steve,

Thank you very much for the help. I searched the documentation and I think that I have found the solution for my problem.

Many thanks,
Diogo

Hongying replied on : 126 of 152

Dear Steve,

I notice that you use the following to plot.
“plot(b{k}(:,2), b{k}(:,1), ‘r’, ‘Linewidth’, 3)”

-Why b{k}(:,2) comes first ?
-We should change “x” “y” components to align 2D curves with a figure or 3D curves with a volum data ?
-Or maybe we should change the image/3d volum data ?

Thanks.

Steve replied on : 127 of 152

Hongying—Because the second column contains the horizontal (X) coordinates, which should be supplied as the first input to plot.

I don’t understand your other two questions.

Hongying replied on : 128 of 152

Dear Steve,

Here is some details of my problem:

–Global description: I have some 3D curves. They are calculated from a 4D medical data set. (the 4D data is a matrix like 256*256*52*20, here we name it as “data4d”. So I have a object of size 256*256*52. And at each voxel of this object I have some data of size 20*1.

–Details: A curve is constructed step by step using a sequence of vectors. Each vector is calculated using the 20*1 data at each voxel.

Typically, say that, we are at voxel V1, whose index is [idx, idy, idz]. A vector [x, y, z] is obtained using data4d(idx, idy, idz, :)(that’s the 20*1 data at this voxel). Then we prolong the curve by adding this vector to the end of the curve. (If the end of the curve is [locX, locY, locZ], then the new curve end is [locX+x, locY+y, locZ+z], After that we find the new voxel(it’s index) where the new curve end falls, and calculate the vector for another time. )

–Problem: Sometimes I need to align the curve with the data, But I find there is some difference between showing a image and plotting a curve in the aspect of coordinate system. I have not found a good way to do this properly.

Thanks very much!

Steve replied on : 129 of 152

Hongying—Sounds like you might need some debugging assistance? This is not a good forum for it. You might try the MATLAB newsgroup or MATLAB Answers.

Steve replied on : 131 of 152

Hongying—I hope that means you solved your problem?

Khoa replied on : 132 of 152

Steve, how do I transform/pan a plot that is plotted over an image? When I call pan it transforms the axes as a whole, how do I do it separately just for the plot itself and not the image?

Steve replied on : 133 of 152

Khoa—This seems like a more general MATLAB interactive graphics programming question that I almost never try to answer. ;-)

All children of a single axes object share the same data-space coordinates. If you want to move a plot independently of an image that’s living in the same axes object, you’ll need to change the XData and YData of the plot. Or you’ll need to use separate, overlaid axes objects. Check out the File Exchange for code to implement draggable graphics objects.

Taylor replied on : 134 of 152

Hasnain replied on : 135 of 152

Hi Steve,

After plotting certain points on my image, I save the new image in some variable using getframe.

The issue is that getframe resizes the new image. I need the exact same image size.

Please suggest some way to do it.
Regards

Steve replied on : 136 of 152

Hasnain—There is not a straightforward way to do this using just MATLAB and Image Processing Toolbox. The Computer Vision System Toolbox has tools for “burning” lines into image pixel arrays. I’ll put this question on my someday/maybe list of blog topics.

Kyaw replied on : 137 of 152

Dear Steve,

I am looking for the actual X and Y coordinates in terms of pixels and axis using bwboundaries.
What I saw some of the boundary points
e.g
[B,L,N,A] = bwboundaries(bw5,8,’noholes’);
B{1}(:,2) has repititive values and is it because of closed loop?
My case is try to digitize the wave of image as an open wave signal and please advise me.

Thanks and best regards
Kyaw

Steve replied on : 138 of 152

Kyaw—Your expression B{1}(:,2) picks out the y-coordinates of the boundary. Why wouldn’t you expect repeated y-coordinate values?

Kyaw replied on : 139 of 152

Dear Steve,

Thank you for your prompt reply and I got the y and x coordinates from my detected boundary objects of image below
10 33
11 33
12 33
13 32
14 31
15 31
16 31
17 32
18 33
19 33
20 33
21 33
22 33
23 33
24 33
25 33
26 33
27 32
28 32
29 32
30 32
30 31
30 30
30 29
30 28
31 27
32 27
33 26
33 25
33 24
34 23
35 23
36 23
37 23
38 23
39 23
40 22
41 22
42 22
43 22
44 22
45 22
46 22
47 22
47 21
47 20
47 19
47 18
47 17
46 17
45 17
44 17
43 17
42 17
41 17
40 17
39 18
38 18
37 18
36 17
35 16
35 15
35 14
35 13
34 13
33 13
32 13
31 13
30 13
29 13
28 13
27 13
26 13
25 12
25 11
24 10
24 9
23 8
22 8
21 7
20 6
19 6
18 6
17 5
16 5
15 5
14 4
13 4
12 4
11 4
10 4

but I wish to rearrange depend on the actual x axis then I got it after sorting shown below

14 4
13 4
12 4
11 4
10 4
17 5
16 5
15 5
20 6
19 6
18 6
21 7
23 8
22 8
24 9
24 10
25 11
25 12
35 13
34 13
33 13
32 13
31 13
30 13
29 13
28 13
27 13
26 13
35 14
35 15
35 16
47 17
46 17
45 17
44 17
43 17
42 17
41 17
40 17
36 17
47 18
39 18
38 18
37 18
47 19
47 20
47 21
40 22
41 22
42 22
43 22
44 22
45 22
46 22
47 22
34 23
35 23
36 23
37 23
38 23
39 23
33 24
33 25
33 26
31 27
32 27
30 28
30 29
30 30
14 31
15 31
16 31
30 31
13 32
17 32
27 32
28 32
29 32
30 32
10 33
11 33
12 33
18 33
19 33
20 33
21 33
22 33
23 33
24 33
25 33
26 33

However, some of the pixel points
let say in the x axisof 4 has 5 repeated but different Y values.

In my understanding of bwboundaries will give extra X and Y coordinates since it is connected operations.
As for me,I would like to have only one X and Y coordinates since I want to get digitized information from boundary objects.

Even, I am optimazing some image processing techniques with Matlab programming but still there the results above shown.

Please advise me since I need to finish up by this week and I am looking forward to hearing from you good news.

Best regards
Kyaw

Steve replied on : 140 of 152

Kyaw—I plotted the output you showed from bwboundaries and it looks fine. Of course a contour around an object will have some points having the same x-coordinate and different y-coordinates. Consider a simple square: x = [0 1 1 0 0], y = [0 0 1 1 0]. I don’t understand why you would expect anything different.

Kyaw replied on : 141 of 152

Dear Steve,

It is right for image perspective but our application is different like playing reverse martial arts and I wish to get the single points of x and y data from the boundary points not the contour display.

My aim is to get digitized data utomatically from that coordinates of x and y(x is cm and y is cm/s scale). If I have one data point in x and y must be single coordinated pixels if not it will blur to the final output.
e.g
x1 = 4 not {4,4,4,4} mean location of cm = 4 pixels * 2.54 / dpi
y1 = 10 not {10, 11, 12, 13,14} mean location of cm/s = 10 pixels * 2.54 / dpi
In the last, I can save these particular-single data of x and y depend on the shape of object boundary as a text file.

I am looking forward to hearing form you good news soon.

Thanks and best regards
Kyaw

Steve replied on : 142 of 152

Kyaw—I really do not understand your explanation. For some reason, you want to rearrange the points on a boundary, and then for some other reason you apparently want to discard some of those points. You’ll have to write your own code to do that. Best of luck with your project.

Kyaw replied on : 143 of 152

Dear Steve,

Thank you for your encouragement and now I can manage to get the output I want from two dimensional arrays even the array manipulation is ticky and complex.

Yours sincerely
Kyaw

Kyaw replied on : 144 of 152

Dear Steve,

I think this topics seem like what I would like to do for additional requirement that is to put the plotted data of x and y on the image.

I tried to use the plot and imshow many ways and times but I couldn’t manage to solve the issue.

Pls advise me and I am looking forward to hearing from you good news.

Thanks and best regards
Kyaw

Steve replied on : 145 of 152

Kyaw—Use the techniques described in this blog post to superimpose x-y plots on an image. If you need more help, then I suggest that you post your question to MATLAB Answers.

Kyaw replied on : 146 of 152

Dear Steve,

Thank you for your prompt reply and I managed to have the x-y plot in the image except the scaling issue.

Yours sincerely
Kyaw

Mandeep Kaur replied on : 147 of 152

Hello Sir,

I want to superimpose a binary image on Grayscale image and to find corresponding regions in grayscale image where value in binary is 1.

Steve replied on : 148 of 152

Mandeep—See my imoverlay contribution on the MATLAB Central File Exchange, and see my post on logical indexing.

Kyaw replied on : 149 of 152

Dear Steve,

http://imageshack.us/photo/my-images/687/superimposingplotteddat.png/

I used under mentioned below and
min_x = 1,max_x = 172, min_y 10 and max-y = 157
grayImg = 236 x 172;
tmp1 and tmp2 is open loop data of red color on this link using bwboundaries(periImg,8,’noholes’);

% Draft Code
figure;
hImg = imagesc([min_x max_x], [min_y max_y], (grayImg));
colormap(gray);
hold on;
hPlot = plot(tmp1,tmp2, ‘r’, ‘linewidth’,2);

Please advise me since I was stuck this issue one week plus and I am looking forward to hearing from you good news.

Thanks and best regards
Kyaw

Steve replied on : 150 of 152

Kyaw—I approved your comment #149 because it is relevant to the topic of this post, but I would like for you to know that this blog is not a forum for obtaining technical support or personalized tutorials on the use of MATLAB. I would like to suggest that you use MATLAB Answers or the MATLAB newsgroup comp.soft-sys.matlab. When you use these forums, it will be helpful if you can formulate your questions more precisely. For example, I took a quick look at the image link you posted, but without a more specific explanation from you it isn’t at all obvious to me what you think is wrong with your result. I don’t have any idea what you mean by “scaling issue,” and you haven’t said why the image is wrong or what you expected to see instead.

joseph replied on : 151 of 152

i would like to know how to plot a point over an image….I found the max intensity pixel using [r,c]=max(max(I1)…from a image in freq domain i need to plot that point in the original image I( Spatial)….and how to draw a marker over it

Steve Eddins replied on : 152 of 152

Joseph—The techniques described in this post can be used to plot a single point. Just call plot with scalar instead of vector inputs. However, a single point in the frequency domain does not directly correspond to a single point in the spatial domain. A single point in the frequency domain derives from all points in the spatial domain, just as a single point in the spatial domain derives from all points in the frequency domain.

These postings are the author's and don't necessarily represent the opinions of MathWorks.