【书法字识别】基于matlab余弦形状相似度书法字识别【含Matlab源码 1356期】

举报
海神之光 发表于 2022/05/29 00:48:22 2022/05/29
【摘要】 一、余弦形状相似度书法字识别简介 1 实验原理 以下理论来自于《根据形状相似性的书法内容检索》(中图分类号TP39) 1.1 轮廓点的形状属性 只判断轮廓的特征信息较判断所有像素信息计算量少,因此统计轮...

一、余弦形状相似度书法字识别简介

1 实验原理
以下理论来自于《根据形状相似性的书法内容检索》(中图分类号TP39)
1.1 轮廓点的形状属性
只判断轮廓的特征信息较判断所有像素信息计算量少,因此统计轮廓点。
对于轮廓上的像素点p,以其为中心做极坐标系,以r = 4、r = 8、r = 16 、r = 32和每个区间pi/4的角度,将周围区域分为32个区域,类似雷达,如图。
通过统计各区域内的轮廓点数,获得一个32*1的矩阵,这就是该像素的形状属性。区域越靠外r越大,因为越远的点,对于两图中匹配点选取的其重要性越低。
在这里插入图片描述

1.2 轮廓点的匹配度
对于样本字m中的某一点mi,其对待匹配字n中的某一个点nj的匹配度Cij由下式确定,其中w为形状属性中的分量。
如果满足前提条件:(某点的匹配点有一定绝对范围,不会出现从一个角落到另一个角落的情况)
在这里插入图片描述
则可以计算两点的相似度:
在这里插入图片描述
因为匹配度C一定存在一个最小值,其对应的n中的像素就是m所对应的最佳匹配点。
在这里插入图片描述
在两字完全相同的情况下,每一点的最小匹配度PMC都为0;
1.3 单字的匹配度
计算样本字中各个点对相应点的匹配度之和加上与对应点的欧氏距离之和(乘上a,经验系数),匹配度越高该值越低,通过对该值排序可得形状相似度的排序。
在这里插入图片描述
2 预处理
Batch 批处理函数
通过Uigetdir用户窗口获取数据集的地址(点击“数据集”作为根目录)。并通过字符串连接为*.gif为结尾,以此,可用dir读取数据集中所有(可选择kai楷书cao草书界定二级目录从而只读取其中一种字体)gif的文件信息存为im_path_list.,使用该结构中的name与folder获取图片具体地址,imread读入图像,存在元胞数组set中。
输出:
1.将图片通过im2bw转为二值图像(graythresh自动获取灰度阈值)存在set的第1行。
2.将文件名存在set的第6行。

data_read 函数:读取文件以及获取轮廓特征属性并存储。
(1)将set中图像缩放为32*32的二值图像,去除一些不必要信息以及减少运算量。(但可能会造成重要细节丢失,降低查准率)存储为第1行
(2)catch_shape 函数通过判断像素与周围像素的差值(上下左右只要有一个方向差为1即为轮廓点),获取轮廓信息,存在第2行。
(3)character函数计算轮廓的属性值,存在第4行。
(4)第3行存储该字的属性矩阵长度。
在这里插入图片描述
3 样本读取、检索
run_test 测试函数:
载入预处理后的数据集,ui界面获取test样本文件,按照预处理的方法处理之。
用compare_c依次计算test对于数据集中每一个字的匹配度(公式见前),返回匹配度与其坐标。
对各点匹配度进行升序排序,返回[B L]排序结果以及标签。

用户输入参数num threshold trial
由于对于不同样本字,其对数据集的匹配度序列不一样,且难以找到一个算法得到满意的匹配度的阈值,使得展示的字中查准率和查全率的组合比较理想,所以本次实验采用用户输入所需最大展示字数、搜索区间、尝试次数来确定展示的字。
Num:最大展示字数,暂时设定窗口是6*6个图形的空间,因此num不能大于35(第一个位置展示样本)
Threshold:由于相似度算法一定能够找到匹配度最高的一个字,若样本在数据集中选取,则该算法能保证一定就是原图。而数据集的读入具有顺序,所以在原图前后寻找匹配字则可以找到与原图相同的字。(草书和楷书交错存储)(如果不需要则可将threshold设为一个大数)一般设定为数据集中该字的数目
Trial:尝试次数,代表了在排序后的匹配值序列中的前trial个字中,寻找满足threshold设定区间的字。一般要设定相对较大。

实验结果与分析:
通过设定检索区间,以匹配度最高的为基准在周围进行检索,保证了查准率,而查全率可以通过提高尝试次数来提高:
若不设定检索区间,匹配度排序确定的序列中,前n个字有m个是正确字,应该匹配到的总字数是a,则查全率为m/a,查准率为m/n。
设定检索区间,将范围缩小到范围为2*threshold的区间,跳过了序列前部存储位置差距巨大的字,而存储时草书文件夹和楷书文件夹互相交错,很大程度上减少了错字的发现。因此要提高查全率只需提高trial,即在序列的前trial个字中搜索。
此方法的弊端是:若匹配度最高的字为错字,则之后所查全为错字。
本次检索,目的是在楷书中检索楷书,在草书中检索草书,但由于形状匹配也会造成草书和楷书的匹配,所以会出现混杂。若需要混合检索,只需调高threshold即可。
总之,本文提供了一个用户自定义参数来检索相似书法字的MATLAB程序,用户使用上包括ui界面批处理数据,ui界面读取测试图,输出匹配图案以及名称等功能。
内部实现了图像归一化处理、形状属性提取、图像匹配的功能。
理论来源为:《根据形状相似性的书法内容检索》(中图分类号TP39)《计算机辅助设计与图形学学报》第17卷 第11期

二、部分源代码

clear all;
close all;
clc;
l = load('Processed.mat');
set = l.set;
test = get_test;
tmp = zeros(length(set),1);
 for n = 1:length(set)
     [min,min_cor] =compare_c(test{2,1},set{2,n},test{4,1},set{4,n});
     dis = 0;
     for m = 1:length(test{2,1})
         dis = dis+(norm(test{2,1}(m,:)-min_cor(m,:)))^2;
     end
     alpha = 0.1;
     tmp(n,1) = sum(min)+alpha*dis;

 end
[B,L] = sort(tmp);

num = input('type in num:');
threshold = input('type in threshold:');
trial = input('type in try times:');
subplot(6,6,1)
imshow(test{5,1});

j =2;
for i = 1:trial
    if j<=num
        if abs(L(i)-L(1))<threshold %在检索区间内才展示
        subplot(5,6,j);
        
        imshow(set{5,L(i)});
        title(set{6,L(i)});
        j = j+1;
        end
    end
end
function [a] = my_area(i,j,S)
dx = S(j,1)-S(i,1);
dy = S(j,2)-S(i,2);
distance = sqrt(dx^2+dy^2);
co = dx/distance;
si = dy/distance;
ang2 = acos(co);
ang1 = asin(si);
a = 1;
if( ang1>=0 && ang1<pi/4 && ang2>=0 && ang2<pi/4)%1
            if(distance>=2&&distance<=4)
                a = 1;end
            if(distance>=4&&distance<=8)
                a = 2;end
            if(distance>=8&&distance<=16)
                a = 3;end
            if(distance>=16&&distance<=32)
                a = 4;end
            end
if( ang1>=pi/4 && ang1<pi/2 && ang2>=pi/4 && ang2<pi/2)%2
            if(distance>=2&&distance<=4)
                a = 5;end
            if(distance>=4&&distance<=8)
                a = 6;end
            if(distance>=8&&distance<=16)
                a = 7;end
            if(distance>=16&&distance<=32)                
                a = 8;end
            end
if( ang1>=pi/4 && ang1<=pi/2 && ang2>=pi/2 && ang2<=pi*0.75)%3
            if(distance>=2&&distance<=4)
                a = 9;end
            if(distance>=4&&distance<=8)
                a = 10;end
            if(distance>=8&&distance<=16)
                a = 11;end
            if(distance>=16&&distance<=32)  
                a = 12;end
            end
if( ang1>=0 && ang1<pi/4 && ang2>0.75*pi && ang2<=pi)%4
            if(distance>=2&&distance<=4)
                a = 13;end
            if(distance>=4&&distance<=8)
                a = 14;end
            if(distance>=8&&distance<=16)
                a = 15;end
            if(distance>=16&&distance<=32)                
                a = 16;end
            end
if( ang1>=-pi/4 && ang1<0 && ang2>=0.75*pi && ang2<pi)%5
            if(distance>=2&&distance<=4)
                a = 17;end
            if(distance>=4&&distance<=8)
                a = 18;end
            if(distance>=8&&distance<=16)
                a = 19;end
            if(distance>=16&&distance<=32)    
                a = 20;end
            end
if( ang1>=-pi/2 && ang1<-pi/4 && ang2>= pi/2&& ang2<pi*0.75)%6
            if(distance>=2&&distance<=4)
                a = 21;end
            if(distance>=4&&distance<=8)
                a = 22;end
            if(distance>=8&&distance<=16)
                a = 23;end
            if(distance>=16&&distance<=32)      
                a = 24;end
            end
if( ang1>-pi/2 && ang1<=-pi/4 && ang2>= pi/4&& ang2<pi/2)%7
            if(distance>=2&&distance<=4)
                a = 25;end
            if(distance>=4&&distance<=8)
                a = 26;end
            if(distance>=8&&distance<=16)
                a = 27;end
            if(distance>=16&&distance<=32)   
                a = 28;end
end
if( ang1>-pi/4 && ang1<=0 && ang2>= 0&& ang2<pi/4)%8
            if(distance>=2&&distance<=4)
                a = 29;end
            if(distance>=4&&distance<=8)
                a = 30;end
            if(distance>=8&&distance<=16)
                a = 31;end
            if(distance>=16&&distance<=32)   
                a = 32;end
end
function adjust_try(num,thresh,trial,L)
j =2;
for i = 1:trial
    if j< num
        if abs(L(i)-L(1))<thresh
        subplot(5,6,j);
        imshow(set{5,L(i)});
        j = j+1;
        end
    end
end

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137

三、运行结果

在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/120603675

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。