使用Matlab生成ASCII码图片

     在学校的BBS中,ASCII格式的图片重要性是不言而喻的。要得到这些图片也有很多现成的软件。作为Matlab的使用者,我们其实可以使用Matlab的函数来完成这件事。原理就是把图片的各个点的灰度映射成ASCII字符。这些操作对Matlab来说都是小事一桩,我在网上还看到了一个中国人写的生成中文字组成的图片的函数




%
%  格式: picci = matscii(im, width, gamma, filename)
%
%  其中
%   im    - 源文件,可以是彩色或者灰度的图片。
%   width – 要得到的图片宽度。
%   gamma    - 对比度设定,
%              gamma > 1  加强对比, < 1 降低对比。
%   filename – 存储生成的图片的文件名。
%
%   picci – 生成的ASCII格式图片


function picci = matscii(im, width, gamma, filename)

% ASCII 灰度值
g = ‘$@B%8&WM#*oahkbdpqwmZO0QLCJ
    UYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,”^`”. ‘;

g = ‘#8XOHLTI)i=+;:,. ‘; %较少的字符集,灰度效果更好

gmax = length(g);

charAspect = 0.55;           

if nargin <=2
gamma = 1;            % 默认gamma值

im = double(im);

if ndims(im) == 3  %当输入的是彩色图片
 im = (im(:,:,1) + im(:,:,2) + im(:,:,2))/3;  
% 灰度值= (R+G+B)/3
end

[rows, cols] = size(im);
scale = width/cols;

rows = round(charAspect * scale * rows);  
%行列的灰度重标度
cols = round(scale * cols);

im = imresize(im, [rows, cols]);      
%im = myrescale(im, [rows, cols]);
% 使用这个函数如果你的matlab没有安装图像处理工具箱

% 按1到gmax标度图像的灰度。

im = im – min(min(im)); % 归0
im = (im/max(max(im))).^gamma;%标度化.
im = round(im*(gmax-1) + 1);       

picci = char(zeros(rows,cols));
%在工作空间中新建为生成图像预留的内存空间

for r = 1: rows
 for c = 1:cols
   picci(r,c) = g(im(r,c));
 end
end

if nargin == 4    %设定了文件名
 [fid, msg] = fopen(filename,’wt’);
 error(msg);
 for r = 1: rows
  fprintf(fid,’%s\n’,picci(r,);
 end
 fclose(fid);
end



%————————————————
% 完整的函数,当没有安装图像处理工具箱时保证函数正常运行
%————————————————

function newim = myrescale(im,  newRowsCols)

[rows,cols] = size(im);
newrows = newRowsCols(1);
newcols = newRowsCols(2);

rowScale = (newrows-1)/(rows-1); % arrays是从1而不是0开始
colScale = (newcols-1)/(cols-1);

newim = zeros(newrows, newcols);



for r = 1: newrows
 for c = 1: newcols

  sourceRow = round((r-1)/rowScale + 1);
  sourceCol = round((c-1)/colScale + 1);

  newim(r,c) = im(sourceRow, sourceCol);

 end
end


    注意笑脸的地方是Frog表情,是脚本看到:)后做的自动转换,就像qq表情打开了快捷键一样,比qq表情更糟糕的是我不知道在哪里可以关掉。

    用来玩了一下,生成了一个五一照片的ASCII码,又从另外一个方面见识了阿枯的淫荡和傻泱的清纯,可惜小歪对行宽的限制,贴不上来。


主写代码,偶尔写字。没有知识分子的知识,却有知识分子的毛病。-查看简介
144 readers
subscribe via RSS
397 followers
follow on sina


About this entry