1、图像即矩阵。
一幅图像在计算机中是以矩阵的形式存储。 如下图所示:矩阵中的值对应图像中对应像素的亮度,值越大越亮(最亮为白色),值越小越暗(最暗为黑色)。下图搞反了,当然此目的只是为了大家看的直观。
2、图像的分类: 彩色图、灰度图和二值图。体会如何在计算机中存储。
注意:不同类型的图像数据类型不同,占用的存储空间不同。以上图为例:原图为296X395 的图像,存储彩色图像需要3个296X395 的矩阵,存储灰度图和二值图只需要1个296X395 的矩阵。彩色图像和灰度图中每个像素的数据类型是整数,二值图像的数据类型是布尔值(因为二值图像只有黑白呀)。
clear,clc,close all;
I=imread('flower.jpg'); % 读入原图像 彩色图像
GrayI = rgb2gray(I); %彩色图转灰度图
BwI = im2bw(GrayI); %灰度图转二值图
figure,imshow(I),title("彩色图像") % 显示图像
figure,imshow(GrayI),title("灰度图像")
figure,imshow(BwI),title("二值图像")
3、获取图像的基本信息。whos 、imfinfo
clear,clc,close all;
I=imread('flower.jpg'); % 读入原图像
whos I
clear,clc,close all;
fileinfo=imfinfo('flower.jpg');
W=fileinfo.Width
H=fileinfo.Height
F=fileinfo.Format %显示文件格式
注意:两个命令都可以查询图像的信息,imfinfo感觉可以查更多的信息,除了宽高之外,还有许多属性可以查。
4、图像的读取和显示
(1)图像读取。比较简单,只需要在imread(‘ ’),引号中输入路径即可,绝对路径和相对路径都可以,使用相对路径时要注意图片是放在当前工作目录下的。
(2)图像显示。imshow() 显示图像, 注意在括号里面放的是图像对应的矩阵名。显示时,分多窗口和单窗口。figure表示新建一个窗口的意思,若打开三个窗口,则需要使用三次figure。很多时候,我们需要在一个窗口上显示多幅图像,以方便比较不同操作处理后的效果差异,因此需要用到subplot()函数,这个函数用来控制窗口布局,以subplot(1,3,1)为例,三个参数的含义依次是,布局为1行3列,当前图片所处的位置是第1个。
可参考下面的代码理解上述内容。
clear,clc,close all;
I=imread('flower.jpg'); % 读入原图像
GrayI = rgb2gray(I);
BwI = im2bw(GrayI);
% 三幅图像显示在三个窗口
figure,imshow(I),title("彩色图像") % 显示图像
figure,imshow(GrayI),title("灰度图像")
figure,imshow(BwI),title("二值图像")
% 三幅图像显示在一个窗口
figure;
subplot(1,3,1),imshow(I),title("彩色图像") % 显示图像
subplot(1,3,2),imshow(GrayI),title("灰度图像")
subplot(1,3,3),imshow(BwI),title("二值图像")
5、永远放在代码开头的clear,clc,close all;
在上面的所有示例代码开头,都有上述命令,或者说必须有上述命令。
clear 清除工作空间中的变量,有时候,我们会在matlab中运行多个代码文件,如果两个代码文件中有同名变量,那么会造成干扰,但如果在运行时,清除掉之前运行的变量,就不会有这种干扰存在。
clc 清除命令行窗口的输入。
close all 关闭所有的窗口。
总之,上面的命令是为了给即将运行的代码一个干净的环境。
6、图像的加减乘除。
图像即矩阵,所以将图像加减乘除是有数学解释的。
在这里常常会出现问题,原因在于参与运算的两图像可能大小不一致,比如:宽高不一致,或者是数据类型不一致(彩色图和灰度图)。大家想一下,不同大小的矩阵肯定是不能加减乘除的呀!所以在报错时,先自查一下是否参与运算的两幅图像是否选择的过于随意了。
(1)图像加法
图像加法常用于图像合成。比如将一个目标放到想要的背景上。如让小车行驶在沙漠上。
注意:彩色图像或灰度图每一个像素点的取值范围是0-255,两幅图相加,可能会超过255,因此,需要减去一个标量,让小车相加后,仍然是绿色。
Back=imread('desert.jpg');
Foreground=imread('car.jpg');
result1=imadd(Foreground,-100);
result2=imadd(Back,Foreground);
result3=imadd(Back,result1);
imwrite(result1,'jiabiaoliang.jpg');
imwrite(result2,'jiabeijing.jpg');
imwrite(result3,'jiabiaoliangjiabeijing.jpg');
subplot(221),imshow(Foreground),title('原目标图');
subplot(222),imshow(result1),title('原目标图加标量');
subplot(223),imshow(result2),title('原目标图加背景');
subplot(224),imshow(result3),title('加标量图叠加背景');
(2)图像减法
图像相减主要用于目标检测。比如:监控图像中,视频中的相邻两帧相减,可以得到两幅图像的差异,即运动目标。
Back=imread('hallback.bmp');
Foreground=imread('hallforeground.bmp');
result=imabsdiff(Foreground,Back);
imwrite(result,'xiangjian.jpg');
subplot(131),imshow(Back),title('背景');
subplot(132),imshow(Foreground),title('前景图');
subplot(133),imshow(result),title('图像相减');
(3)图像乘法
图像乘法主要用于从原始图像中提取目标图像。比如:在一副图像上,我们将图像中的鸟分割出来了,分割结果是一个二值图像,那如何利用二值图像提取鸟呢,将原始图像和二值图像相乘就可以达到这个目标。
Back=im2double(imread('bird.jpg'));
Templet=im2double(imread('birdtemplet.bmp'));
result=immultiply(Templet,Back);
imwrite(result,'xiangcheng.jpg');
% imwrite(result2,'jianbeijing.jpg');
% imwrite(result3,'jianbiaoliangjiabeijing.jpg');
subplot(131),imshow(Back),title('背景');
subplot(132),imshow(Templet),title('模板(分割结果)');
subplot(133),imshow(result),title('图像相乘');
(4)图像除法
除法运算可用于校正成像设备的非线性影响,这在特殊形态的图像(如断层扫描等医学图像)处理中常常用到。图像除法也可以用来检测两幅图像间的区别,但是除法操作给出的是相应像素值的变化比率,而不是每个像素的绝对差异,因而图像除法也称为比率变换。
注意:imdivide 的参数必须是double类型,如果是整数,那么相除的结果就为0,全黑。
clear,clc,close all;
I=imread('flower.jpg'); % 读入原图像
J= I * 0.43 + 90
Ip = imdivide(double(I), double(J))
subplot(131),imshow(I),title("原图像")
subplot(132),imshow(J),title("变换后图像")
subplot(133),imshow(Ip),title("图像相除")