EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
我们来做一些有意思的事情,通过外界的扫描仪或者照相机之类的,获取你写在纸上的签名,图片一般保存为jpg格式。然后用matlab把图片中的签名通过某种采样方法来采取尽可能少的点来用贝塞尔曲线把你的签名勾勒出来并保存为pdf格式。这个东西感觉起来好像很高大上,我们不妨把这个任务分而治之。现在我们需要做的是采集图片->采集样本点->用贝塞尔曲线画出->保存为pdf格式。
/ m0 Y/ W# f0 v0 v( j! O高级做法:应用图像切割。 step1: 用照相机或者扫描仪获取的图片可以对图像进行操作。 法一: 使用imread命令读取图片。 I = imread('文件名.格式后缀'); 图片是以矩阵方式存储的,被读取出来就是一个矩阵。 所以I是一个矩阵,一般为三维的,如果是灰度图就是二维的。 法二: function pushbutton1_Callback(hObject, eventdata, handles)
+ t, B' ? g! H: ][fname, pname, index] = uigetfile({'*.jpg'; '*.bmp'}, '选择图片');%读取图片
0 l/ J9 `8 ? E( L& H, Z+ H' C str3 = [pname fname];
5 g& O5 R( {6 _" v axes(handles.axes1);
5 G6 ^! c ^8 S! l imshow(str3); & _/ i4 E( H2 d: u" k2 m5 ^5 e& {7 M; Y) }
handles.img = str3 %将图片赋值于句柄
9 J" s7 z3 _# \' _5 Y: x! p guidata(hObject, handles);%更新句柄
9 ~2 [0 H" V) g: W$ ?7 D4 s5 Mfunction pushbutton2_Callback(hObject, eventdata, handles)
+ o$ H P: x$ kimg1 = handles.img; %将图片赋给img1,就可以对img1进行操作了。 参考函数:使用imshow命令显示图片。 imshow(I); step2:
4 V. `0 N8 G! L! i 采集样本点,这就是技术的核心了,怎么采点呢?这就的看你的了。 step3: 用贝塞尔曲线画出图形这一块其实是你的点已经取得相当的好,然后用贝塞尔曲线画出就ok了,在这里,我贴上用鼠标获取端点与控制点的函数画出贝塞尔曲线的代码。其实稍微修改一下就可以变成给你一堆点,照着点画贝塞尔曲线的代码。 画图这一块有一个要提醒大家,一定要有hold on;不然hold不住啊!这是为了让每次画的图保留在那里,这比用一个数组存每次的结果好多了。 % project2+ j3 d% Y) W- P& Y% n
% draw a picture of A
! T4 ?2 K) `# C" m$ n% name :Chen Yu
3 p# r- F: a7 z% student ID :12353032. |- V. q( n% L; q* W
% class&grade:class 2,grade 12+ s- m5 J' ^% K3 P# }
function draw8 G0 g% O8 Z3 I: E3 H3 a
hold off
& A; n4 s# d8 \plot([-1 1],[0 0],'k',[0 0],[-1 1],'k');
9 z4 B" e, T$ m( I6 w; E' Nhold on;! Z, N* E: J/ r1 W
xlist = [];. o. |. R" F; c, D
ylist = [];
) ?% p$ o/ u6 y4 L! \0 ^) x+ O# wt = 0:.001:1;* J6 K. |/ f" s( S ?
button= 1;
* y0 r7 z* F7 Q/ ck = 0;% f1 R3 x' O! b6 Y& A, L) `: S
while(button ~= 3). g9 X3 E# j3 K+ O
[xnew,ynew,button] = ginput(1); %get one mouse click
) H6 v1 Y0 t5 x7 W* K) Y3 k if button == 1
6 Y$ @3 y0 Y# Y1 ` k = k+1;
0 i0 R" L, {5 x: T xlist(k) = xnew;
: f. r& p! f0 s( `6 i ylist(k) = ynew; % add new point to the list
+ [" V" @% A6 j, e% b if k > 1
) }5 L% M8 V; R9 V if mod(k,3) == 1
, ~7 M) L. H$ H, [ for i = 1:4
' S! z7 n0 E/ X0 J) i) o x(i) = xlist(k-i+1);
8 ]2 ]+ y8 M- \6 n y(i) = ylist(k-i+1);
; Q& Z! r2 R5 d; u" y8 x4 B: j end %plot spline points and control pts ~4 f) t8 [$ O9 o
plot([x(1) x(2)],[y(1) y(2)],'o:',x(2),y(2),'o');
' T; |& j& f4 v5 m- f. { plot([x(3) x(4)],[y(3) y(4)],'c:',x(3),y(3),'cs');8 v8 X4 t% F# j% {9 ~6 x' y) @
plot(x(1),y(1),'bo',x(4),y(4),'bo');2 m4 y6 m' N+ k* @' }
bx = 3*(x(2) - x(1));
/ e+ W( i3 z$ L7 {8 w by = 3*(y(2) - y(1));
1 [+ h# V/ B- y. D cx = 3*(x(3) - x(2));
3 S& \% x1 d/ S4 f e# b$ \0 Z cy = 3*(y(3) - y(2));
# |# x- v( V$ ?8 O" B dx = x(4) - x(1) - bx - cx;
* M j* K) w! |) }( a8 i s. n dy = y(4) - y(1) - by - cy;
" L' P2 T$ h- S: S xp = x(1) + t.*(bx + t.*(cx + t*dx));
9 j' g+ b1 O$ @7 T yp = y(1) + t.*(by + t.*(cy + t*dy));
' R6 P4 @6 D9 m: r4 O plot(xp,yp); % plot spline curve7 j4 H0 s% a, {- D3 ^
end
, `3 |; R9 x* K8 Q/ l& T9 o end0 z- M/ L" ^7 @- W/ S' G7 l" g4 G
end
' k& b% [8 U2 L+ Zend
9 j) k H# t+ h* G# t, ]* N step4: 保存为pdf格式其实就是你用plot函数画出来之后点save,里面就有pdf格式哦!不过有点小提示,如果你发现你的图片怎么只有一点点,还有一部分那里去了。别着急,你在save的时候把图片的窗口缩小就可以了,这好像有点变态,没办法,设定就是这样的。最后就大功告成,神功已成。
5 }. p: S+ Q& e0 j3 \" c; x3 x* G
低级做法: step1:显示图像。获取图像矩阵I。提示:在这里图像要hold on。 step2:在上面描点并保存下来。接着把保存下来的点作为贝赛尔曲线的输入,用上面代码稍微改一下就可以得出答案。提示:在这里显示图像可以用figure(2),显示第二张图。还有一个point就是你会发现图像显示会倒过来,你只要把纵坐标画图的时候从大到小倒过来既可。
" J+ Z0 `1 Q# i1 T |