【matlab图像处理】几何操作实践(1)

中国史之【周夷王执政】:
周夷王,姓姬,名燮(xie),周懿王之子。姬燮在位时期,周王室处于衰落阶段,因此诸侯有的不来朝贡,而且互相攻伐。周夷王生性多疑曾听信谗言,烹杀齐哀公,此为西周历史上君臣之间最惨烈的一次交锋。
——来源:全历史APP

【路漫漫其修远兮,吾将上下而求索】

今天介绍图像的几何操作实践(1)。本内容参考自《实用MATLAB图像和视频处理》第7章。

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之道】一起学习。

猜你喜欢

转载自blog.csdn.net/ling_xiobai/article/details/124499600