#1 图像平移,由于课程使用的是自己编写的函数,库里没有,所以使用matlab中的函数进行实验
%图像平移函数,这里使用matlab自带的来做实验,课程中的move.m是老师自己编写的,库中没有
A=imread('corn.bmp');
se=translate(strel(1),[50 50]);%strel对象表示一个平面形态学结构元素
%向右向下平移50,50像素坐标
B=imdilate(A,se);%形态学膨胀
figure;
subplot(1,2,1),imshow(A),title('原图像');
subplot(1,2,2),imshow(B),title('图像平移');
由于画布尺寸等于图像尺寸,所以只要对图像进行平移,就一定会有一部分超出画布。
代码中使用了三个新函数,分别是strel(),translate(),imdilate()。
首先是strel(),全称structure element,运用各种形状和大小构造元素,单独运行se=strel(1),结果如下
se=strel(1)
一般来说,strel()函数中,需要指明两个参数,一个是形状,一个是大小,该例中没有规定形状,直接规定了大小,即默认的任意形状,大小为1。后续再学习另外两个函数,因为存在更简便的平移函数imtranslate()
%图像平移函数,相对更简单的imtranslate()
A=imread('corn.bmp');
B=imtranslate(A,[50,50]);
subplot(1,2,1),imshow(A),title('原图像');
subplot(1,2,2),imshow(B),title('图像平移');
只需填入平移的r,c方向距离即可。
#2 使用imrotate()函数对图像进行旋转,可以选择插值方式
%图像旋转,matlab库函数版 https://blog.csdn.net/qq_35888055/article/details/105297547
A=imread('tax.png');
B=imrotate(A,30); %旋转30°
C=imrotate(A,30,'crop'); %旋转30°,并剪切图像,使得到的图像和原图像大小一致
%若不说明插值方法,默认为最近邻插值
D=imrotate(A,30,'bilinear','crop');
%双线性插值法旋转30°,并剪切图像,使得到的图像和原图像大小一致
figure;
subplot(2,2,1),imshow(A);
title('原图像')
subplot(2,2,2),imshow(B);
title('图像旋转(保留全部图像信息)')
subplot(2,2,3),imshow(C);
title('图像旋转(大小不变)')
subplot(2,2,4),imshow(D);
title('图像旋转(双线性插值)')
#3 使用imresize()函数对图像进行缩放
A = imread('1.jpg');
a = 2;
aa = 0.5;
B=imresize(A,a,'nearest');
C=imresize(A,aa,'nearest');
figure;
imshow(A);
title('原图像')
figure;
imshow(B);
title('放大2倍图像')
figure;
imshow(C);
title('放大0.5倍图像')
![](https://i-blog.csdnimg.cn/blog_migrate/c6b1ad904afb36a89df6ffa81904f9bf.png)
#4 使用imcrop()函数进行图像剪裁
%使用imcrop()函数进行图像剪裁
A=imread('tax.png'); %读入图像
rect = [300 20 400 150];%设置一个用于确定剪切起始坐标和长、宽的数组
B=imcrop(A,rect);%进行图像剪切
subplot(121),imshow(A);
title('原图像')
rectangle('Position',rect,'LineWidth',2,'EdgeColor','r') %显示图像剪切区域
%rectangle函数可以在图片中显示一个框,可以定义框的形状、颜色、位置、线宽等参数
%最基础的参数就是pos,也就是rectangle('Positon',pos),pos是一个四元素的向量,
%[x y w h],用于确定位置和宽高
subplot(122),imshow(B);
title('裁剪图像')
#5 对RGB三通道分别提取的实验
%使用imsplit()函数来分离RGB三个通道的图像
A=imread('tax.png'); %读入图像
[R,G,B]=imsplit(A);
figure,
subplot(1,3,1),imshow(R),title('Red')
subplot(1,3,2),imshow(G),title('Green')
subplot(1,3,3),imshow(B),title('Blue')
%使用这个方法,RGB三个通道最终显示的都是灰度图像,因为这个函数相当于把有RGB三个
%通道的24位图像变成了只有8位的图像,只具有灰度特征
Real_R=A;
Real_R(:,:,2)=0;Real_R(:,:,3)=0;%使用这种方法将GB通道信息变为0,但是仍然保留GB
%两个通道,这样原图就变成了只有R通道8位有效信息的24位图像,显示时就是彩色图片,
%但是只能显示出红色
Real_G=A;
Real_G(:,:,1)=0;Real_G(:,:,3)=0;
Real_B=A;
Real_B(:,:,1)=0;Real_B(:,:,2)=0;
figure,
subplot(1,3,1),imshow(Real_R),title('Red')
subplot(1,3,2),imshow(Real_G),title('Green')
subplot(1,3,3),imshow(Real_B),title('Blue')
如果使用imsplit()函数来分别提取RGB三个通道,那么会得到三幅灰度图像,如下图所示
原因是imsplit()函数相当于将原本24位三通道的彩色图像单独提取其中的一个通道,也就是8位,这就使得图像变成了8位灰度图像,无论哪一个通道,得到的都是灰度图像,如果希望得到单独显示RGB三个通道中一个通道的彩色图像,则需要使用下半部分的代码,其原理是仍然保留原本图像24位的特点,只是将除了目标通道以外的16位,两个通道中的数据变成0,这样最终得到的就是只有一个通道有效信息的24位彩色图像,运行效果如下图所示。