手写签名转化成可以插入word的图片matlab实现


目录

  • ==手写签名转化成可以插入word的图片matlab实现==
  • 问题背景与思路
  • 问题背景
  • 解决思路
  • 运行结果
  • 需要处理的原图
  • 原图二值化并旋转
  • 进行形态学处理
  • 剪裁后的要保存的图
  • 桌面新建的image文件夹
  • 学习总结


问题背景与思路

问题背景

word中插入手写签名有很多种方法,既然学了图像处理就用学的东西弄一个简单的小程序,matlab代码实现。有一种方法就是在白纸上写上自己的名字,然后通过处理过后使签名背景色与word背景色一致。

解决思路

  1. 通过二值化处理将手写签名和背景颜色区分
  2. 通过旋转操作调整签名位置
  3. 可以采用腐蚀或膨胀操作来进一步调整手写签名的清晰程度
  4. 定位手写签名在图中的位置,只保存包含签名的部分图片

以下是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');

运行结果

需要处理的原图

手写的汉字,看效果,不要看字@~@:

java上传手写签名 java实现手写签名图片保存_java上传手写签名

原图二值化并旋转

先进行二值化处理,注意阈值的把握,之后顺时针旋转90°得到下图:

java上传手写签名 java实现手写签名图片保存_二值化_02

进行形态学处理

先对其进行膨胀处理,有助于剔除没必要的小细节,之后再进行腐蚀处理,增加视觉效果(加粗):

java上传手写签名 java实现手写签名图片保存_java上传手写签名_03

剪裁后的要保存的图

二值图像就两种灰度,所以只要判断黑色像素出现的“行和列”上的最大的范围(如:123行到321行,123列到321列),之后通过保存像素矩阵就可以实现剪裁了:

java上传手写签名 java实现手写签名图片保存_图像处理_04

桌面新建的image文件夹

通过imwrite将图片写入文件得到可以粘贴在word上的手写签名:

java上传手写签名 java实现手写签名图片保存_图像处理_05


虽然使用价值不高,但是还是可以拿过来玩一下的~

学习总结

  1. imbinarize()函数中后一个参数是阈值,即从哪个灰度开始分层(大于阈值设置255,小于阈值设置0)的意思,0-1取值,代表0-255的灰度
  2. find()函数可以用来找到黑色像素(0)的具体位置,在这里用来定位我们所要截取的矩形区域,要注意matlab中的检索是优先按列检索,代码中用到了图像的转置也是这个原因
  3. mkdir()函数可以用来创建新的文件夹以便于输出数据的管理,imwrite()函数则可以将图片数据保存到刚才新建的文件夹中,也可以保存在已有目录下,注意地址书写