3 views (last 30 days)

Show older comments

Guillaume
on 3 Sep 2014

To do what you want without a loop:

[~, down] = min(abs(bsxfun(@minus, X, mean(X))));

bsxfun just subtract the column mean from every value in X, and then you take the index of the minimum of the absolute value of that difference.

Michael Haderlein
on 2 Sep 2014

Actually, I believe he just gave exactly contradicting answers on Guillaume's question. As I get it, this is what the result should look like:

I did it with the following code, however, I have no idea why a more straight-forward way didn't work (maybe someone can tell me?):

img=imread('grayscaleexample.bmp');

figure, imshow(img)

ha=axes('color','none','position',get(gca,'position'));

tf=figure;

hp=plot(1:size(img,2),mean(img));

set(hp,'parent',ha)

set(ha,'xlim',[1,size(img,2)])

delete(tf)

So the idea is to create another axes above the ones showing the image and plot the mean of the grayscale there. For some reason (please help) I have to draw the plot somewhere else first and then copy it to the axes where it's shown finally. When I plot directly in the axes on top of the ones with the image, the image axes will be deleted - I have no idea why.

What I mean is the following:

>> figure, imshow(img)

>> axes('position',get(gca,'position'))

>> get(gcf,'children')

ans =

1.0e+03 *

1.4420

1.4370

>> plot(1:size(img,2),mean(img));

>> get(gcf,'children')

ans =

1.4370e+03

Guillaume
on 2 Sep 2014

Edited: Guillaume
on 2 Sep 2014

If you do indeed want to plot the mean on the graph (i.e. the other option I offered) then:

imshow(img);

hold on

plot(1:size(img, 2), mean(img), 'r');

I'm not sure what you mean by having two portions of the image though.

Michael Haderlein
on 2 Sep 2014

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

Start Hunting!