Here I wrote a function to save image/matrix into PPM format. I tried to simplify the saving process by using the matlab function ‘dlmwrite’ such that I only need to write the header for this PPM format. However, before streaming the image data, different channels of the input image must be interleaved. I experimented two ways to do this. Both work just fine, and the use of matlab function ‘cat’ (or ‘permute’) make the implementation very simple.
function write_ppm(im, fname, xval) [height, width, c] = size(im); assert(c == 3); fid = fopen( fname, 'w' ); %% write headers fprintf( fid, 'P3\n' ); fprintf( fid, '%d %d\n', width, height); fprintf( fid, '%d \n', xval); %maximum values fclose( fid ); %% interleave image channels before streaming c1 = im(:, :, 1)'; c2 = im(:, :, 2)'; c3 = im(:, :, 3)'; im1 = cat(2, c1(:), c2(:), c3(:)); %% data streaming, could be slow if the image is large dlmwrite(fname, int32(im1), '-append', 'delimiter', '\n')
The implementation in Python is even simpler. ‘f.write()’ is capable of writing the entire image in one function call with the help of ‘\n’.join().
def write_ppm(fname, im, xval):
height, width, nc = im.shape
assert nc == 3
f = open(fname, 'w')
f.write('P3\n')
f.write(str(width)+' '+str(height)+'\n')
f.write(str(xval)+'\n')
# interleave image channels before streaming
c1 = np.reshape(im[:, :, 0], (width*height, 1))
c2 = np.reshape(im[:, :, 1], (width*height, 1))
c3 = np.reshape(im[:, :, 2], (width*height, 1))
im1 = np.hstack([c1, c2, c3])
im2 = im1.reshape(width*height*3)
f.write('\n'.join(im2.astype('str')))
f.write('\n')
f.close()