how can I plot a graph over an image in Matlab?

 採用された回答

Kevin Holly
Kevin Holly 2022 年 6 月 30 日

0 投票

Load Example Image
exampleimage = imread('peppers.png');
Flip the image vertically (y-axis direction will be flipped vertically later)
exampleimage = flipud(exampleimage);
Display image
imshow(exampleimage)
Use hold on so more children can be added to the axes
hold on
Create scatter plot
x=1:20:300;
y=x;
scatter(x,y,'filled','w')
Change y-dir to normal (Note, y-dir is upside down when images are displayed by default)
set(gca,'YDir','normal') %gca stand for get current axes

7 件のコメント

DARSHAN KUMAR BISWAS
DARSHAN KUMAR BISWAS 2022 年 6 月 30 日
I can't understand what is happening in the last line.please explain.
Kevin Holly
Kevin Holly 2022 年 6 月 30 日
When you display an image. The y-axis is in the reverse direction by default. If one were to create a scatterplot ontop of the image, it would be at the wrong coordinates. To fix this, I flipped the image and then made the y-axis direction normal. Please see below. I have turn on the axes so the coordinates would be visible.
exampleimage = imread('peppers.png');
imshow(exampleimage)
axis on
figure
imshow(flipud(exampleimage))
axis on
figure
x=1:20:300;
y=x;
scatter(x,y,'filled','k')
figure
imshow(flipud(exampleimage))
hold on
scatter(x,y,'filled','w')
axis on
figure
imshow(flipud(exampleimage))
hold on
scatter(x,y,'filled','w')
set(gca,'YDir','normal')
axis on
DARSHAN KUMAR BISWAS
DARSHAN KUMAR BISWAS 2022 年 7 月 1 日
Thank you for explaining and giving a straight forward answer.
DARSHAN KUMAR BISWAS
DARSHAN KUMAR BISWAS 2022 年 7 月 4 日
Suppose there are multiple numbers of such images and I have to plot graph over each one of them and display all of them together. How can I do it?
Rik
Rik 2022 年 7 月 5 日
Do you want to put them in subplots, or do you want to put all images in the same axes?
Adam Danz
Adam Danz 2022 年 7 月 5 日
Vaughan Clarkson
Vaughan Clarkson 2024 年 10 月 20 日
I have a slight variation on the original question which has bugged me for years.
What if (a) the image you're wanting to plot over the top of is larger than your screen and (b) you afterwards want to retrieve the modified pixel data in the original image size?
The problem I run into with Kevin's otherwise excellent solution is that, if the image is larger than the screen size, the imshow command will resize it to fit the screen.

サインインしてコメントする。

その他の回答 (2 件)

Adam Danz
Adam Danz 2022 年 6 月 30 日

2 投票

Plot the image using image or imagesc or some other image function that allows you to specify the x and y values of the image. That way you set the image coordinates to the data coordinates.
Then just hold on and plot the data into the same axes.
Note that image functions flip the y axis so you may need to flip it back to normal using set(gca, 'YDir','Normal') or flip your data when you plot it.
If you have additional questions, share the code you've got so far and let us know specificially where you're stuck.

2 件のコメント

DARSHAN KUMAR BISWAS
DARSHAN KUMAR BISWAS 2022 年 6 月 30 日
a=imread('F:\Google drive\6.Internship\surge\Core Internship\IMG_0.jpg');
b=imread('F:\Google drive\6.Internship\surge\Core Internship\IMG_20.jpg');
c=a(:,:,3)-b(:,:,3);
imadjust(c);
H=fspecial("average",10);
cAvg=imfilter(c,H);
max(max(c));
min(min(c));
no_row=size(c,1);
no_col=size(c,2);
Xbox=50;
P=floor(no_col/Xbox);
k=zeros(1,4857);
x=linspace(1,Xbox,Xbox);
q=zeros(453,4857);
y=linspace(1,Xbox,Xbox);
for i=1:453
for j=1:4857
if cAvg(i,j)>10
q(i,j)=cAvg(i,j);
else
q(i,j)=5;
end
end
end
l=zeros(45,Xbox);
for m=1:45
for n=1:Xbox
l(m,n)=mean(mean(q(((m-1)*10+1):10*m,((n-1)*24+1):P*n)));
end
end
for i=1:Xbox
p=l(:,i);
for j=1:45
if p(j)>=10
o(i)=j;
break
else o(i)=45;
end
end
end
for i=1:Xbox
v=((45-o)*20)/45;
end
plot(y,v,'Bx')
DARSHAN KUMAR BISWAS
DARSHAN KUMAR BISWAS 2022 年 6 月 30 日
For the graph and the image, the y-axis values are opposite to each other.

サインインしてコメントする。

Rik
Rik 2022 年 6 月 30 日

1 投票

You need to use the same axes. The easiest solution is to use hold, probably the line below will already do what you need:
hold(gca,'on')

1 件のコメント

DARSHAN KUMAR BISWAS
DARSHAN KUMAR BISWAS 2022 年 6 月 30 日
a=imread('F:\Google drive\6.Internship\surge\Core Internship\IMG_0.jpg');
b=imread('F:\Google drive\6.Internship\surge\Core Internship\IMG_20.jpg');
c=a(:,:,3)-b(:,:,3);
imadjust(c);
H=fspecial("average",10);
cAvg=imfilter(c,H);
max(max(c));
min(min(c));
no_row=size(c,1);
no_col=size(c,2);
Xbox=50;
P=floor(no_col/Xbox);
k=zeros(1,4857);
x=linspace(1,Xbox,Xbox);
q=zeros(453,4857);
y=linspace(1,Xbox,Xbox);
for i=1:453
for j=1:4857
if cAvg(i,j)>10
q(i,j)=cAvg(i,j);
else
q(i,j)=5;
end
end
end
l=zeros(45,Xbox);
for m=1:45
for n=1:Xbox
l(m,n)=mean(mean(q(((m-1)*10+1):10*m,((n-1)*24+1):P*n)));
end
end
for i=1:Xbox
p=l(:,i);
for j=1:45
if p(j)>=10
o(i)=j;
break
else o(i)=45;
end
end
end
for i=1:Xbox
v=((45-o)*20)/45;
end
plot(y,v,'Bx')

サインインしてコメントする。

カテゴリ

ヘルプ センター および File ExchangeImages についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by