can you plot a image? (line by line or pixel by pixel)

Asked by Fatemeh Parvari on 17 Jul 2012
Latest activity Commented on by Fatemeh Parvari on 27 Jul 2012
for this matrix:
>> A=rand(10,7)
>> A=im2bw(A)

Can you write a code like this? And with this method to write an image of the matrix A?(This is a simple form of what is going)

>> for i=1:10
>>     for j=1:7
>>         imshow(A(i,j))
>>     end
>> end

And finally the results are similar to this picture?

>> imshow(A)

Products

No products are associated with this question.

Answer by Walter Roberson on 17 Jul 2012

Yes, it is possible, just very very inefficient. You can create one patch object per pixel, with the edge turned off, and the facecolor set to the pixel color. This is the closest thing MATLAB has to a pixel object.

It might take a few hours to render a single image this way: MATLAB is not designed for efficiency when it comes to having thousands of graphics objects on a single figure.

Fatemeh Parvari on 17 Jul 2012

yes but i need to display a image with delay.

Walter Roberson on 17 Jul 2012

You would certainly get delays if you used this mechanism ;-)

Fatemeh Parvari on 17 Jul 2012

I write this code, but I can not see where I'm going to put every pixel

A=rand(10,7)
A=im2bw(A)
s=size(A);s=s/2;
for i=1:10
for j=1:7
x=[((-1/7)*s(2))+.5*i (s(2)./7)+.5*i];
y=[((-.1)*s(1))+.5*j (s(1)./10)+.5*j];
image(A(i,j),'XData',x,'YData',y), axis image,
hold on
end
end
Answer by Teja Muppirala on 17 Jul 2012
Edited by Teja Muppirala on 17 Jul 2012

One idea would be to use the AlphaData property. This sets the transparency of each pixel:

A = im2bw(rand(10,7));
M = zeros(size(A'));
h = imshow(A, 'InitialMagnification' ,2000);
for n = 1:numel(M);
M(n) = 1;
drawnow;
end

Walter Roberson on 19 Jul 2012

You can turn on groups of pixels at the same time. For example,

A = im2bw(rand(10,7));
M = zeros(size(A'));
h = imshow(A, 'InitialMagnification' ,2000);
for n = 1:size(A,1);
M(n,:) = 1;
drawnow;
end
Fatemeh Parvari on 20 Jul 2012

this code has a error :

Warning: Dimensions of AlphaData must be 1x1, or must match CData..

what mean?

Walter Roberson on 20 Jul 2012

It means that for no good reason that I can see, Teja transposed M when building it, and transposed again when using it, but that I did not take that into account when I adjusted Teja's code.

A = im2bw(rand(10,7));
M = zeros(size(A'));
h = imshow(A, 'InitialMagnification' ,2000);
for n = 1:size(A,1);
M(:,n) = 1;    %corrected line
drawnow;
end

I would not have written the code this way myself, but you did specifically ask for the speed up to be against Teja's code.

Answer by Fatemeh Parvari on 22 Jul 2012

in a image :Can I change data of a pixel ? without drawing all of picture again, and re show only one pixel?

1 Comment

Walter Roberson on 22 Jul 2012

Normally, if you change the CData property of the image, all of the changes show up simultaneously (unless possibly the figure has many many objects in it.)

This behavior can be changed by altering the "erasemode" property of individual graphic objects; see for example the description of erasemode for lines

Images also have erasemode but note that there is no provided method to change only individual pixels, no way to say "change the pixel at (172,48) to green": one can only set the entire CData at once. The erasemode properties of images is more about what should happen if you move or resize or delete the image as a whole.

MATLAB's graphics model is not pixel-oriented. There is no (documented) user-accessible frame buffer.

Answer by Image Analyst on 22 Jul 2012

Why do you want to do this? Plot one pixel at a time? Your code shows one pixel only, not a whole image with just one pixel in the image changing. Maybe you'd be interested in the FAQ about making a movie of your data: http://matlab.wikia.com/wiki/FAQ#How_can_I_create_a_movie_from_my_MATLAB_figures.3F