手写签名转化成可以插入word的图片matlab实现
目录
问题背景与思路
问题背景
word中插入手写签名有很多种方法,既然学了图像处理就用学的东西弄一个简单的小程序,matlab代码实现。有一种方法就是在白纸上写上自己的名字,然后通过处理过后使签名背景色与word背景色一致。
解决思路
- 通过二值化处理将手写签名和背景颜色区分
- 通过旋转操作调整签名位置
- 可以采用腐蚀或膨胀操作来进一步调整手写签名的清晰程度
- 定位手写签名在图中的位置,只保存包含签名的部分图片
以下是matlab实现的代码 我用的是实施编辑器/实时脚本/.mlx
。
clc
clear
close
手写签名转化成图片,实时脚本
i = imread("C:\Users\含笑韭泉\Desktop\手写签名.jpg"); %白纸黑字的图片地址
imshow(i);
title('原图');
i_gray = im2gray(i);
i_bin = imbinarize(i_gray,0.39); %0.39(阈值)可以根据情况修改
imshow(i_bin);
title('原图二值化');
i_rot = imrotate(i_bin,-90); %如果图片正常,就不用旋转了
imshow(i_rot);
title('原图二值化旋转后');
B = [1 1 0;1 1 1;0 1 1]; %这里可以根据情况进行修改,控制膨胀和腐蚀精度与程度
i_dil = imdilate(i_rot,B); %膨胀,白色区域扩张
imshow(i_dil);
title('膨胀后的二值图');
i_ero = imerode(i_dil,B); %腐蚀,黑色区域扩张
imshow(i_ero);
title('腐蚀后的二值图');
%% 确定手写签名的位置信息
[~,s_y1] = find(~i_rot, 1);
[~,s_y2] = find(~i_rot, 1, "last");
[~,s_x1] = find(~i_rot', 1);
[~,s_x2] = find(~i_rot', 1, "last");
%% 个人感觉腐蚀后效果好点
i_fin = i_ero(s_x1:s_x2,s_y1:s_y2);
%% 这个是最终得到的图,因为要直接用,不要加标题了
imshow(i_fin);
mkdir('C:\Users\含笑韭泉\Desktop\image');
imwrite(i_fin,'C:\Users\含笑韭泉\Desktop\image\test1_handwrite.jpg');
运行结果
需要处理的原图
手写的汉字,看效果,不要看字@~@:
原图二值化并旋转
先进行二值化处理,注意阈值的把握,之后顺时针旋转90°得到下图:
进行形态学处理
先对其进行膨胀处理,有助于剔除没必要的小细节,之后再进行腐蚀处理,增加视觉效果(加粗):
剪裁后的要保存的图
二值图像就两种灰度,所以只要判断黑色像素出现的“行和列”上的最大的范围(如:123行到321行,123列到321列),之后通过保存像素矩阵就可以实现剪裁了:
桌面新建的image文件夹
通过imwrite将图片写入文件得到可以粘贴在word上的手写签名:
虽然使用价值不高,但是还是可以拿过来玩一下的~
学习总结
- imbinarize()函数中后一个参数是阈值,即从哪个灰度开始分层(大于阈值设置255,小于阈值设置0)的意思,0-1取值,代表0-255的灰度
- find()函数可以用来找到黑色像素(0)的具体位置,在这里用来定位我们所要截取的矩形区域,要注意matlab中的检索是优先按列检索,代码中用到了图像的转置也是这个原因
- mkdir()函数可以用来创建新的文件夹以便于输出数据的管理,imwrite()函数则可以将图片数据保存到刚才新建的文件夹中,也可以保存在已有目录下,注意地址书写