”一“的客观形态与主观感受之间的关联性研究
特征描述
书法骨架
笔画长度
平均笔画宽度
笔力
走势(斜率)
十二个“一”
1、
2、
3、
4、
5、
6、
7、
8、
9、
10、
11、
12、
算法实现
逻辑上而言,每个”一“的感受都来源于其形态,那么我们不禁要问,各个”一“带来的不同感受与它们的形态有何关联呢?为了探索”形态-感受“的关联性,需要对每个”一“的客观造型进行描述,提取特征,这里就需要用到图像处理的技术了。
通过对上述图片的观察可以发现有些图片的噪声多,不易于骨架的提取。所以要选对图片进行预处理。
matlab函数bwareaopen──删除小面积对象
格式:BW2 = bwareaopen(BW,P,conn)
作用:删除二值图像BW中面积小于P的对象,默认情况下使用8邻域。
通过bwareaopen函数对图像进行处理后可以得到比较整洁的图片。
预处理前的图片
预处理后的图片
预处理代码:
global pic;
global pic1;
pic11 = ~pic;
%删除二值图像BW中面积小于P的对象,默认情况下使用8邻域。
pic1=bwareaopen(pic11,200,8);
%进行填充
pic1=imfill(pic1,'holes');
特征提取代码:
function [ pic_skel,strokelen,averStrokeWdith,writingPower,trend ] = skeleton( pic )
%传入的二值图为黑底白字
%对横笔画的一进行骨架提取
%pic:输入的待处理的二值图像
%pic_skel:处理后的骨架
%strokelen:笔画长度
%averStrokeWdith:平均笔画宽度
%writingPower:笔力
%trend:z走势
[m,n]=size(pic);
disp(m);
disp(n);
pic1=zeros(m,n);
strokelen=0;
averStrokeWdith = 0;
%记录每一列中第一个‘1’出现的位置
first = 0;
%记录每一列中最后一个‘1’出现的位置
last = 0;
%点集数
pointnum = 0;
%点集数组
point = []
%起始点
start.x=0;start.y=0;
%结束点
finish.x=0;finish.y=0;
for i = 1:n
flag=pic(:,i);
for j=1:m
if(~(pic(j,i)==0))
if(first==0)
first=j;
last=j;
else
last=j;
end
end
end
if(~(first==0))
pointnum = pointnum+1;
num = floor((first+last)/2);
pic1(num,i)=1;
%笔画长度
strokelen = strokelen + 1;
%平均笔画宽度
averStrokeWdith = averStrokeWdith + (last-first);
%记录点集的宽度
point = [point,last-first];
%记录起始点
if(start.x==0)
start.y=num;
start.x=i;
else%记录结束点
finish.y=num;
finish.x=i;
end
end
first = 0;
last = 0;
end
%平均笔画宽度
averStrokeWdith = averStrokeWdith/pointnum;
%骨架
pic_skel = pic1;
%笔力
writingPower = 0;
[m,n]=size(point);
for f=1:n
writingPower = writingPower + (point(1,f)- averStrokeWdith)*(point(1,f)- averStrokeWdith);
end
writingPower = sqrt(writingPower)/pointnum;
%走势
trend = -(finish.y-start.y)/(finish.x-start.x);
end
matlab进行实现
界面设计
对12个“一”进行特征测量
1、算法测量
手工测量(PS进行测量)
2、算法测量
手工测量(PS进行测量)
3、算法测量
手工测量(PS进行测量)
4、算法测量
手工测量(PS进行测量)
5、算法测量
手工测量(PS进行测量)
6、算法测量
手工测量(PS进行测量)
7、算法测量
手工测量(PS进行测量)
8、算法测量
手工测量(PS进行测量)
9、算法测量
手工测量(PS进行测量)
10、算法测量
手工测量(PS进行测量)
11、算法测量
手工测量(PS进行测量)
12、算法测量
手工测量(PS进行测量)