中国史之【周夷王执政】:
周夷王,姓姬,名燮(xie),周懿王之子。姬燮在位时期,周王室处于衰落阶段,因此诸侯有的不来朝贡,而且互相攻伐。周夷王生性多疑曾听信谗言,烹杀齐哀公,此为西周历史上君臣之间最惨烈的一次交锋。
——来源:全历史APP
【路漫漫其修远兮,吾将上下而求索】
今天介绍图像的几何操作实践(1)。本内容参考自《实用MATLAB图像和视频处理》第7章。
- 对于matlab2021的安装,可以参考公众号【CV之道】的文章:【matlab安装】手把手图文并茂安装matlab2021(win10版)
1、放大、缩小和调整大小
最通用的几何操作之一是调整大小。在matlab的图像处理工具箱中,用于调整图像大小的函数是imresize。它允许用户指定插值方式,如最近邻、双线性或默认的双立方插值。
我们先试一下使用imresize函数来放大图像,以1.5倍为例子。代码如下:
I = imread('cat.jpg');
% 放大1.5倍图像
I_big1 = imresize(I, 1.5);
figure, imshow(I), title('原图');
figure, imshow(I_big1), title('放大1.5倍');
从可视化效果和工作区图像的维度中,也可以明显看到,图像已经按1.5倍尺寸进行了放大操作。
我们接着使用最近邻插值和双线性插值的方法进行放大,对比一下效果:
左上角的是最近邻插值,可以明显看到放大后,图片变得粗糙,网格痕迹明显,而双线性插值和默认的双立方插值则效果差不多,平滑自然。
图像缩小也是同样的操作,这里就不展示了。值得注意的是,在收缩的情况下,无论是双线性插值还是双立方插值,函数imresize都自动地对图像使用一个低通滤波器(默认尺寸11x11),先将图像稍微模糊一下再进行插值,这有助于在重采样时减少混叠效应。
2、平移
平移在仿射变换中也介绍过,对一幅输入图像f(x,y)相对于它的坐标原点的平移,会产生一幅输出图像g(x’,y’),其中每个像素都移动了一个相对位移。
可以使用maketform和imtransform函数执行平移。具体参考推送:映射和仿射变换。
3、旋转
对一幅图像旋转,也是一种仿射变换,所以同样可以使用函数maketform和imtransform来实现。
在图像处理工具包中,还有专门用于旋转的函数imrotate,这个函数和imresize类似,允许用户指定插值方法,默认是最近邻。它还允许指定输出图像的尺寸。
我们对一幅图像旋转30度看看。
%%本代码用于学习如何对图像进行旋转操作
I = imread('cat.jpg');
% 旋转30度
I_rot1 = imrotate(I, 30);
% 双线性插值旋转30度
I_rot2 = imrotate(I, 30, 'bilinear');
%裁剪输出
I_rot3 = imrotate(I, 30, 'bilinear', 'crop');
figure,
subplot(2,2,1), imshow(I), title('原图');
subplot(2,2,2), imshow(I_rot1), title('旋转30度');
subplot(2,2,3), imshow(I_rot2), title('双线性插值旋转30度');
subplot(2,2,4), imshow(I_rot3), title('旋转30度裁剪输出');
从上面可以看到,旋转30度是逆时针旋转,想要顺时针旋转,只需要参数写-30。另外,旋转后图片尺寸都变了,但是使用裁剪参数,则会保证输出尺寸和原图尺寸一致。
4、裁剪
裁剪应该不用介绍了,在matlab图像处理工具包中,有一个用来裁剪图像的函数imcrop,它将图像裁剪成特定的矩阵。裁剪矩阵可以交互地指定(使用鼠标)或它的坐标可以作为参数传给函数。
%%本代码用于学习如何对图像进行裁剪操作
I = imread('cat.jpg');
% 交互式裁剪
I_crop1 = imcrop(I);
% 定义坐标区域进行裁剪[xmin, ymin, width, height]
I_crop2 = imcrop(I, [100, 50, 100, 100]);
figure,
subplot(1,3,1), imshow(I), title('原图');
subplot(1,3,2), imshow(I_crop1), title('交互式裁剪');
subplot(1,3,3), imshow(I_crop2), title('定义坐标参数裁剪');
注意交互式裁剪的时候,先弹出一个原图,然后需要用鼠标左键选择裁剪的区域,然后双击选中的区域,便可裁剪出来。而参数式裁剪需要传进去的参数是【左上角x位置,左上角y位置,宽,高】,最终的结果如下:
5、翻转
翻转包括水平翻转和垂直翻转,也就是上下翻和左右翻,在图像处理工具包中,所对应的函数有flipud(将图像上下翻转)和fliplr(将图像左右翻转),我们试一下。
%%本代码用于学习如何对图像进行翻转操作
I = imread('cat.jpg');
% 上下翻转
I_flipud = flipud(I);
% 左右翻转
I_fliplr = fliplr(I);
figure,
subplot(1,3,1), imshow(I), title('原图');
subplot(1,3,2), imshow(I_flipud), title('上下翻转');
subplot(1,3,3), imshow(I_fliplr), title('左右翻转');
以上是本期内容,建议自己动手来实践一下。如果需要图片和代码,可以关注公众号,回复关键字【matlab代码】即可获得。我会上传到云盘。
【声明】:学习笔记基于互联网上各种学习资源的个人整理。
以上是本期内容,下期介绍图像处理的几何操作实践(2)。
我叫小保,一名计算机视觉爱好者、学习者、追随者,欢迎关注我【CV之道】一起学习。