avatar

目录
Matlab课程实践一

Matlab课程实践一:

一 、设计内容
自学 Matlab GUI 编程,设计并实现一个图像空间变换系统。
要求:

  1. 能对图像进行平移、旋转、缩放、剪切、投影、仿射变换以
    及各种复合变换(复合变换指融合前面两种及以上的变换,比如既有
    平移又有旋转);
  2. 能将各种变换后结果保存为图像文件;
  3. 各种变换可以采用按钮或者菜单的方式进行;
  4. 变换时的用户可以自行设置简单的变换参数。

GwX2Q0.gif

打开图像:

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[ReadImageFileName,ReadImagePathName,ReadImageFilterIndex] = uigetfile({'*.jpg;*.png;*.tif','ImageFile(*.jpg;*.png;*.tif)';...  
'*.jpg','JPEGImageFile(*.jpg)';'*.*','AllFile(*.*)'},'ReadImage',...
'MultiSelect','off',...
'C:\Program Files\MATLAB\R2016a\toolbox\images\imdata');
FirstImageFullPath = fullfile(ReadImagePathName,ReadImageFileName);
InputImage=imread(FirstImageFullPath);
axes(findobj('tag', 'axes1'));
InputImage=imread(FirstImageFullPath);
imshow(InputImage);
axes(findobj('tag', 'axes2'));
InputImage=imread(FirstImageFullPath);
imshow(InputImage);
msgbox('图片显示成功!');
handles.myimage=InputImage;
guidata(hObject,handles);

保存图像:

Code
1
2
3
4
5
6
7
8
9
10
11
[FileName,PathName] = uiputfile({'*.jpg','JPEG(*.jpg)';...
'*.bmp','Bitmap(*.bmp)';...
'*.gif','GIF(*.gif)';...
'*.*', 'All Files (*.*)'},...
'Save Picture','Untitled');
if FileName==0
return;
else
h=getframe(handles.axes2);
imwrite(h.cdata,[PathName,FileName]);
end;

平移:

matlab
1
2
3
4
5
6
7
8
9
10
11
12
I=handles.myimage;
[m,n]=size(I);
I2=zeros(m,n);%初始化的是double类型的
defaulta={'20'};
defaultb={'50'};
tmpx=inputdlg('请输入x轴平移距离:','',1,defaulta);
tmpy=inputdlg('请输入y轴平移距离:','',1,defaultb);
dx=str2double(tmpx);
dy=str2double(tmpy);
I2(dx+1:m,dy+1:n)=I(1:m-dx,1:n-dy);
axes(findobj('tag','axes2'));
imshow(uint8(I2));

旋转:

matlab
1
2
3
4
5
6
7
8
I=handles.myimage;
[m n]=size(I);
defaulta={'45'};
tmpa=inputdlg('请输入旋转角度:','',1,defaulta);
angle=str2double(tmpa);
I2=imrotate(I,angle);
axes(findobj('tag','axes2'));
imshow(I2);

缩放:

matlab
1
2
3
4
5
6
7
I=handles.myimage;
defaulta={'0.5'};
times=inputdlg('请输入放大倍数:','',1,defaulta);
time=str2double(times);
res=imresize(I,time);
axes(findobj('tag','axes2'));
imshow(res);

剪切:

matlab
1
2
3
4
5
6
now =get(hObject,'String');
if ( strcmp('剪切',now))
set(hObject,'String','确定');
else
set(hObject,'String','剪切');
end

投影:

matlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
button = questdlg('请选择投影方式','请选择','垂直','水平','垂直水平','垂直');
switch button
case '垂直'
i=handles.myimage;
[m,n]=size(i);
i2(1:m,1:n)=i(m:-1:1,1:n);
axes(findobj('tag','axes2'));
imshow(i2);
case '水平'
i=handles.myimage;
[m,n]=size(i);
i2(1:m,1:n)=i(1:m,n:-1:1);
axes(findobj('tag','axes2'));
imshow(i2);
case '垂直水平'
i=handles.myimage;
[m,n]=size(i);
i2(1:m,1:n)=i(m:-1:1,n:-1:1);
axes(findobj('tag','axes2'));
imshow(i2);
end

仿射

matlab
1
2
3
4
5
6
7
8
9
10
11
I=handles.myimage;
defaulta={'40'};
defaultb={'40'};
tmpa=inputdlg('请输入仿射变换矩阵的值一:','',1,defaulta);
tmpb=inputdlg('请输入仿射变换矩阵的值二:','',1,defaultb);
x1=str2double(tmpa);
y1=str2double(tmpb);
xform=[1,0,0;0,1,0;x1,y1,1];
tform_translate=maketform('affine',xform);
res = imtransform(I, tform_translate,'XData', [1 (size(I,2)+ xform(3,1))],'YData', [1 (size(I,1)+ xform(3,2))]);
imshow(res);

复合变换:

java
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
I=handles.myimage;
button = questdlg('请选择复合变换方式第一步','请选择','平移','旋转','平移');
switch button
case '平移'
[m,n]=size(I);
size1=size(I);
dimension=numel(size1)
if dimension==3
I=rgb2gray(I);
end
I2=zeros(m,n);%初始化的是double类型的
defaulta={'20'};
defaultb={'50'};
tmpx=inputdlg('请输入x轴平移距离:','',1,defaulta);
tmpy=inputdlg('请输入y轴平移距离:','',1,defaultb);
dx=str2double(tmpx);
dy=str2double(tmpy);
I2(dx+1:m,dy+1:n)=I(1:m-dx,1:n-dy);
axes(findobj('tag','axes2'));
imshow(uint8(I2));
I2=uint8(I2);
button1 = questdlg('请选择复合变换方式第二步','请选择','仿射','旋转','缩放','仿射');
switch button1
case '旋转'
[m n]=size(I2);
defaulta={'45'};
tmpa=inputdlg('请输入旋转角度:','',1,defaulta);
angle=str2double(tmpa);
I3=imrotate(I2,angle);
imshow(I3);
case '仿射'
I=I2;
defaulta={'40'};
defaultb={'40'};
tmpa=inputdlg('请输入仿射变换矩阵的值一:','',1,defaulta);
tmpb=inputdlg('请输入仿射变换矩阵的值二:','',1,defaultb);
x1=str2double(tmpa);
y1=str2double(tmpb);
xform=[1,0,0;0,1,0;x1,y1,1];
tform_translate=maketform('affine',xform);
res = imtransform(I, tform_translate,'XData', [1 (size(I,2)+ xform(3,1))],'YData', [1 (size(I,1)+ xform(3,2))]);
axes(findobj('tag','axes2'));
imshow(res);
case '缩放'
I=I2;
defaulta={'0.05'};
times=inputdlg('请输入缩放倍数:','',1,defaulta);
time=str2double(times);
res=imresize(I,time);
axes(findobj('tag','axes2'));
imshow(res);
end
case '旋转'
[m n]=size(I);
defaulta={'45'};
tmpa=inputdlg('请输入旋转角度:','',1,defaulta);
angle=str2double(tmpa);
I2=imrotate(I,angle);
axes(findobj('tag','axes2'));
imshow(I2);
button2 = questdlg('请选择复合变换方式第二步','请选择','仿射','投影','仿射');
switch button2
case '仿射'
I=I2;
defaulta={'40'};
defaultb={'40'};
tmpa=inputdlg('请输入仿射变换矩阵的值一:','',1,defaulta);
tmpb=inputdlg('请输入仿射变换矩阵的值二:','',1,defaultb);
x1=str2double(tmpa);
y1=str2double(tmpb);
xform=[1,0,0;0,1,0;x1,y1,1];
tform_translate=maketform('affine',xform);
res = imtransform(I, tform_translate,'XData', [1 (size(I,2)+ xform(3,1))],'YData', [1 (size(I,1)+ xform(3,2))]);
axes(findobj('tag','axes2'));
imshow(res);
case '投影'
a=I2;
button3 = questdlg('请选择投影方式','请选择','垂直','水平','垂直水平','垂直');
switch button3
case '垂直'
[m,n]=size(a);
i2(1:m,1:n)=a(m:-1:1,1:n);
axes(findobj('tag','axes2'));
imshow(i2);
case '水平'
[m,n]=size(a);
i2(1:m,1:n)=a(1:m,n:-1:1);
axes(findobj('tag','axes2'));
imshow(i2);
case '垂直水平'
[m,n]=size(a);
i2(1:m,1:n)=a(m:-1:1,n:-1:1);
axes(findobj('tag','axes2'));
imshow(i2);
end
end
end
文章作者: Liang Shuo
文章链接: http://yoursite.com/2020/04/04/matlab%E8%AF%BE%E7%A8%8B%E5%AE%9E%E8%B7%B5%E4%B8%80/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 L·S
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论