Converting gif to mif
11 views (last 30 days)
Show older comments
blueprint
on 22 Nov 2014
Commented: Olawale Akinwale
on 5 Nov 2019
Hello:
I have obtained a .m file which converts a .gif file to .mif (memory initialization file for FPGAs). I am more on the hardware side of things so I only need matlab for this conversion. The code is as follows:
%%read the image and show it
name = 'leia';
img = imread(strcat(name,'.gif'));
g = im2double(img);
g = g/max(max(g));
rgb = cat(3,g,g,g);
imshow(rgb);
%%insert into 640 x 480 region
out = ones(480,640);
out(10+(1:480),90+(1:480)) = img;
imshow(out);
%%pack pixels
x = out';
x = uint8(x(:));
n = length(x);
y = reshape(x,8,n/8)';
z = y(:,8);
for i=1:7
z = bitor(z,bitshift(y(:,i),8-i));
end
%%count runs
m = 0;
n = 1;
v = z(1);
for i=2:length(z)
if (z(i)~=v)
m = m + 1;
value(m) = v;
runlen(m) = n;
n = 1;
v = z(i);
else
n = n + 1;
end
end
m = m + 1;
value(m) = v;
runlen(m) = n;
%%information
fprintf('total runs %d\n',sum(runlen));
fprintf('number of runs %d\n',length(runlen));
nz = length(find(value==0));
nf = length(find(value==255));
fprintf('zeros %d all ones %d\n',nz,nf);
%%create mif file
dfv = 255;
fid = fopen(strcat(name,'.mif'),'w');
str = 'WIDTH=8;\nDEPTH=38400;\n\nADDRESS_RADIX=HEX;\nDATA_RADIX=HEX;\n\n';
fprintf(fid,str);
str = 'CONTENT BEGIN\n [0000..%04X] : %X;\n';
fprintf(fid,str,sum(runlen)-1,dfv);
n = 0;
for k=1:length(runlen)
if (runlen(k)==1)
str = sprintf(' %04X : %X;\n', n, value(k));
else
str = sprintf(' [%04X..%04X] : %X;\n', n, n+runlen(k)-1, value(k));
end
if (value(k) ~= dfv)
fprintf(fid,str);
end
n = n + runlen(k);
end
fprintf(fid,'END;\n');
fclose(fid);
I get an error as follows:
Subscripted assignment dimension mismatch. Error in xxxxxx (line 15) out(10+(1:480),90+(1:480)) = img;
The image I am using is a 640x480 gif attached to this post. I tried other gifs of the same size with no luck.
Any help would be much appreciated. Thanks!
1 Comment
Olawale Akinwale
on 5 Nov 2019
The problem comes from the fact that img has three dimensions (one for r, one for g and one for b) but your variable "out" has just two dimensions! Maybe you might want to convert the image first to Y,cr,cb and then resize / use the two-dimensional Y array,
Accepted Answer
Image Analyst
on 23 Nov 2014
Edited: Image Analyst
on 23 Nov 2014
1:480 is a 480 element long vector. You need a two element long vector, [row1, row2]:
out(10+[1, size(img, 1)-1], 90 + [1, size(img, 2)-1]) = img;
in order to paste img into out. Or more readable and maintainable is this
row1 = 10;
row2 = row1 + size(img, 1) - 1;
col1 = 90;
col2 = col1 + size(img, 2) - 1;
out(row1 : row2, col1 : col2) = img;
2 Comments
Image Analyst
on 23 Nov 2014
Edited: Image Analyst
on 23 Nov 2014
You're welcome. Please mark the answer as Accepted since it worked.
What is n? It's probably not a multiple of 8. And is 8 rows times (n/8) columns going to equal rows*columns of your original image? If not, then you're changing the number of elements, which you can't do. If your original image has a million pixels, then when it's reshaped it must also have a million pixels, not any other number.
More Answers (0)
See Also
Categories
Find more on Convert Image Type in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!