基于Matlab的不变矩算法实现数字验证码识别过程及其GUI界面构建
基于matlab不变矩算法实现数字验证码 过程先对验证图像进行去噪、定位、归一化等预处理然后计算待识别数字的不变矩再进行特征匹配得到识别结果。 以Matlab软件为开发平台来进行设计实现及仿真并构建相应的GUI界面。 实验结果表明利用不变矩在识别数字验证码方面具有可行性。数字验证码识别一直是挺有意思的挑战最近用Matlab折腾了个基于不变矩的识别方案效果还不错和大家分享一下实现过程。咱们先来搞定预处理环节毕竟原始验证码质量参差不齐。先上个图像二值化的代码片段gray_img rgb2gray(orig_img); thresh graythresh(gray_img)*0.8; % 适当降低阈值 bin_img imbinarize(gray_img, thresh); bin_img bwareaopen(bin_img, 15); % 去除小面积噪点这里有个小技巧直接使用Otsu算法得到的阈值有时会把粘连数字切分不好适当乘个系数调整阈值效果更稳。bwareaopen这个函数特别实用专门消灭那些孤立的噪点。定位分割这块儿最头疼的是字符粘连问题试过好几种方法最后用投影法连通域结合的方式% 垂直投影找列分割点 vertical_proj sum(~bin_img, 1); split_pos find(diff(vertical_proj 0.3*max(vertical_proj)) 1);这里要注意设置合理的阈值比例0.3这个参数对不同字体可能需要微调。分割完成后记得做归一化处理把各个数字缩放到统一尺寸我用的32x32方便后续特征计算。基于matlab不变矩算法实现数字验证码 过程先对验证图像进行去噪、定位、归一化等预处理然后计算待识别数字的不变矩再进行特征匹配得到识别结果。 以Matlab软件为开发平台来进行设计实现及仿真并构建相应的GUI界面。 实验结果表明利用不变矩在识别数字验证码方面具有可行性。重头戏是不变矩计算直接上核心代码function moments calc_moments(roi) [y, x] find(roi); m00 length(x); m10 sum(x); m01 sum(y); x_bar m10/m00; y_bar m01/m00; % 中心矩计算 u20 sum((x - x_bar).^2)/m00^2; u02 sum((y - y_bar).^2)/m00^2; u11 sum((x - x_bar).*(y - y_bar))/m00^2; % 7个不变矩公式 phi1 u20 u02; phi2 (u20 - u02)^2 4*u11^2; ... % 其他不变矩计算 end这里注意中心矩的计算需要做归一化处理指数部分的分母是m00的平方。实际测试发现前三个不变矩对数字区分度最好后面的容易受噪声影响。做个简单的特征匹配用余弦相似度比欧氏距离更适合[~, idx] max(database * test_feature ./ (vecnorm(database,2,2)*norm(test_feature))); result num_labels(idx);这里用向量内积代替余弦计算实测速度更快。特征库建议做标准化处理避免某些维度量纲差异过大。最后整个GUI用GUIDE拖控件实现重点在回调函数里串联整个流程function recognizeBtn_Callback() img preprocess(handles.img); digits segment(img); for k 1:length(digits) feat(:,k) calc_moments(digits{k}); end set(handles.resultText, String, match_feature(feat)); end测试时发现验证码倾斜超过15度会影响识别率后来在预处理加了简单的旋转校正。最终在自建数据集上达到86%的准确率特别要注意数字5和6容易混淆可能需要结合其他特征优化。整个项目下来感觉不变矩在抗形变方面确实有优势不过对字符断裂的情况比较敏感。代码仓库里还留了个TODO尝试加入投影特征做多特征融合有兴趣的朋友可以接着完善。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2409216.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!