注意注意注意敲重点了,代码及注释在后面….
编程题
用手机或是数码照相机拍一张自己的肩部以上的彩色免冠照片,照片内容包括双肩、面部和头部,要求照片要清晰,拍摄背景要不同。利用MATLAB软件和刚刚拍摄好的个人图像依次完成下列要求:顺时针旋转20°,做水平镜像,设kx=0.3 ky=0.5做错切变换,设kx=ky=0.6缩小图像。若需要插值运算,采用双线性插值方法;要求输出显示原图、中间结果和最后结果,并对结果进行说明。
所用函数介绍:
★ 旋转函数 imrotate(I, J, ‘bilinear’)
I 表示操作的图像
J 表示选转的读书,负数表示顺时针旋转,正数表示逆时针旋转
‘bilinear’ 表示差值运算方式,记得带单引号
★ 镜像函数 flipdim(I, J)
I 表示操作的图像
J 表示镜像方式,J = 1 垂直镜像,J = 2 水平镜像
★ 缩放函数 imresize(I , J, ‘bilinear’)
I 表示操作的图像
J 表示缩放的倍数
‘bilinear’ 表示插值方式
程序设计:
Image = imread('myself.jpg'); % 读取原图
New_Image_1 = imrotate(Image, -20, 'bilinear'); % 顺时针旋转 20°,并且采用双线性插值法
figure
subplot(231),imshow(Image),title('原图');
subplot(232),imshow(New_Image_1),title('顺时针旋转20°');
New_Image_2 = flipdim(New_Image_1, 2);
subplot(233),imshow(New_Image_2),title('水平镜像');
tform = maketform('affine', [1 0.5 0;0.3 1 0;0 0 1]);
New_Image_3 = imtransform(New_Image_2, tform); % 对图像进行错切,kx=0.3,ky=0.5
subplot(2,3,5),imshow(New_Image_3)
title('错切--kx=0.3,ky=0.5')
New_Image_4 = imresize(New_Image_3,0.6,'bilinear'); % 将图像进行缩放处理,缩小为原图像的0.5倍
subplot(2,3,6),imshow(New_Image_4);
title('缩放0.6倍') % kx=0.6,ky=0.6--即缩放0.6倍
程序运行结果如下:
插值方法:
插值的作用:当我们对图像进行一些相应操作后(例如旋转操作),其对应像素点的坐标有可能会变为小数,而实际上像素点的坐标都是整数,那么此时经过变换后的输出图像就有可能出现图像缺失或者是马赛克的情况,为了弥补这样的情况发生,我们就需要在相应的位置上补充对应的像素点。
(上面图像缩放也有提到相关知识概念)
nearest一一最邻近点插值。它根据已知两点间的插值点和这两已知点间位置的远近来进行插值, 取较近已知插值点处的函数值作为未知插值点处的函数值。
linear 一一 线性插值。它将相邻的数据点用直线相连,按所生成的直线进行插值。
spline 一一 三次样条插值。它利用已知数据求出样条函数后,按样条函数进行插值。
cubic 一一 三次插值。它利用已知数据求出三次多项式函数后,按三次多项式函数进行插值。
★★★★★ 感谢阅读!!!