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

2 views (last 30 days)
Sonoma Rich on 6 Apr 2011
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;

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 CommentsShowHide 1 older comment
Jan on 8 Apr 2011
Improvement: Pre-allocation, e.g. by starting with my_image(:, :, 3).

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