Improve Speed to Convert an RGB Image Stored as a Linear Array to a Matrix

3 views (last 30 days)
I have an RGB image stored as a vector 921,000 bytes long (640x480x3 uint8) in a sequence as follows:
[B(1,1) G(1,1) R(1,1) B(1,2) G(1,2) R(1,2) B(1,3) G(1,3) R(1,3) ... B(480,640) G(480,640) R(480,640)]
I used a FOR loop to convert it to a matrix as shown below. I would like to speed-up this conversion. Any suggestions?
r = zeros(480,640,'uint8');
g = r;
b = r;
a = my_image_obj.Bytes.uint8;
for y = 1:480
f = 1920*(y-1);
for x = 1:640
s = 3*x-2+f;
b(y,x) = a(s);
g(y,x) = a(s+1);
r(y,x) = a(s+2);
end
end
my_image(:,:,1) = r;
my_image(:,:,2) = g;
my_image(:,:,3) = b;

Answers (2)

Tim Zaman
Tim Zaman on 6 Apr 2011
to reshape to [B(11) G(11) B(11) ; ... ] so that it is now [3x307000] the first column is now B, second G, third B.
Now, use reshape again to reshape to a square size. (almost) never use for loops!
  2 Comments
Sonoma Rich
Sonoma Rich on 6 Apr 2011
I tried the following and it works. Any further suggestions to improve it?
a = my_image_obj.Bytes.uint8;
b = reshape(a,3,length(a)/3);
my_image(:,:,1) = reshape(b(3,:),640,480)';
my_image(:,:,2) = reshape(b(2,:),640,480)';
my_image(:,:,3) = reshape(b(1,:),640,480)';
Jan
Jan on 8 Apr 2011
Improvement: Pre-allocation, e.g. by starting with my_image(:, :, 3).

Sign in to comment.


Sean de Wolski
Sean de Wolski on 6 Apr 2011
A one-liner
my_image = reshape(fliplr(reshape(a,3,numel(a)/3).'),[640 480 3])
  3 Comments

Sign in to comment.

Tags

Community Treasure Hunt

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

Start Hunting!