user2093190
user2093190

Reputation: 59

Plotting over displayed image in GNU Octave

I am developing some routines in Octave and need to display an image, then plot a curve on top which will hopefully overlay some image features.

However, I cannot work out how to match the origin/scale of the image and the plot. For example, given a 1024x1024 pixel image I can do:

a=imread('image.png');
x=linspace(1,1024,100);
y=x;
imshow(a);
hold on;
plot(x,y);

But the line is not scaled to the image and does not start at a corner. (I know that the image and plot should have origins in different corners). When I examine the graphic coordinates from the cursor position, the image is clearly not at the origin, so I guess this is the basis of the problem.

Upvotes: 2

Views: 8859

Answers (3)

RB29
RB29

Reputation: 1

The problem with image is that it puts (0,0) (rather (min_x,min_y)) at upper-left while we usually expect (0,0) to be at bottom-left.

Also it only uses max and min values of the x and y vectors so doing y(end:-1:1) doesn't work.

im = imread('file.png'); %read the file
image([xmin xmax],[ymin ymax],im(end:-1:1,:,:)); %put the image on the screen upside down
axis('xy'); % flip the image by putting (0,0) at bottom left. Image now right side up
axis('square'); if you want to aspect ratio of the image to be 1:1
hold on;
plot([xmin xmax],[ymin ymax]) % this should draw a diagonal from bottom left to upper right.
% plot whatever you want to overlay

Upvotes: 0

Eric Leschinski
Eric Leschinski

Reputation: 154101

You can plot functions over images this way:

  1. Create an image called stuff.jpg like this, any size is possible but I made mine roughly 6x6 pixels so I could test:

plot functions over an image in gnu octave

You can plot functions over other functions this way:

octave> x = 0:1:5;
octave> plot(x, (3/2).^x, "linewidth", 2, "color", "blue");
octave> hold on
octave> plot(x, 2.^x, "linewidth", 2, "color", "red");
octave> plot(x, factorial(x), "linewidth", 2, "color", "green");
octave> plot(x, x.^3, "linewidth", 2, "color", "black");
octave> 

For me it shows this:

octave, gnu octave plot multiple lines

Found that here, it has a walkthrough:

http://ericleschinski.com/c/algorithm_complexity_big_o_notation/

Which plots my power level given my age. It's already over nine thousand.

Upvotes: 0

carandraug
carandraug

Reputation: 13091

Use image() instead of imshow() in this case

a = imread ('image.png');
x = linspace (1, 1024, 100);
y = x;
image (a);
hold on
plot (x, y);
axis square

Upvotes: 2

Related Questions