matlab利用字符作画(汉字绘画)
1 算法实现原理
算法的原理比较简单,就是利用不同字符具有不同的密度,比如字符“一”具有较低的密度,字符“曩”具有较高的密度。对于白底黑字来说,密度越高意味着该点附近具有较高的灰度值,这样文字就与图像的灰度值建立了一一对应的关系。
所以算法主要包括两个部分,一个是建立一个字符库,包含字符与其密度之间的关系;一个是实现字符密度和图像灰度值之间转换的方法。
2 实现
这里我使用的字符库为常用汉字5000个,图像采用cameraman作为要转换的图像。
常用汉字5000个地址:https://my.oschina.net/u/2510243/blog/716652
之后将5000个汉字输出在一个文字框中,统计汉字图像中的黑色部分的比例。
具体代码如下,其中str5000为之间保存的5000汉字,strH_gray为每个字符的密度值:
%字符转密度值
clear
load('str5000.mat')
strH=str5000;
N=length(strH);
strH_gray=zeros(N,1);
figure('color',[1 1 1])%白色背景
%循环5000个字
for j=1:N
%绘制文字
text(0,0,strH(j),'FontUnits','normalized','FontSize',0.9,'verticalAlignment','bottom');
xlim([0,0.5]);ylim([0,0.5]);
set(gcf,'Position',[488 342 375 420]);
set(gca,'Position',[0.0 0.0 1 1]);
axis off
%获取文字图像信息
F = getframe;
strdata=F.cdata;
imshow(F.cdata)
%计算文字所占密度
strdata1=strdata(:,:,1);
strdata1=uint8((strdata1~=255));
n=length(strdata1(:));
s=sum(strdata1(:));
strH_gray(j)=s/n;
clf%清空图像
end
%最后保存文字密度表strH_gray
之后拥有文字表和对应的文字密度表后,就可以创建文字密度和图像灰度值之间一一对应的关系了。具体代码如下:
clear
load('str5000_gray.mat')%文字密度表
load('str5000.mat')%文字表
strH=[str5000];
strH_gray=[str5000_gray];
x=imread('camera.jpg');
x=imresize(x,[32,32]);
x=double(x);%uint8格式不能表示0-1小数
strid=zeros(size(x(:,:,1)));
%将RGB转换为灰度。可以用rgb2gray简化处理
im_gray = ((x(:,:,1)).^2.2 * 0.2973 + (x(:,:,2)).^2.2 * 0.6274 + (x(:,:,3)).^2.2 * 0.0753).^(1/2.2);
im_gray=1-im_gray/255;
%由于文字最大密度也不能到100%,而图像却可以很暗,所以需要对文字的密度值进行一定缩放
enlarge=max(im_gray(:))/max(strH_gray(:));
%对每一个像素点的灰度值与文字密度进行匹配,记录下对应的文字编码
for j=1:length(im_gray(:))
im_g_j=im_gray(j);
[~,minid]=min(abs(im_g_j-strH_gray*enlarge));