author:zox
实验环境:Matlab2019a
图像处理基本操作
一、实验目的
- 熟悉并掌握Matlab工具的使用;
- 实现图像的读取、显示、代数运算和简单变换。
二、实验题目
- 读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分成三个子窗口来分别显示RGB图像和灰度图像,注上文字标题,并将结果以文件形式存到磁盘上。
- 对两幅不同图像执行加、减、乘、除操作,在同一个窗口内分成6个子窗口来分别显示,注上文字标题。
三、实验内容
3.1 相关知识
1.图像分类
(1)二值图像
:只有0、1两个值,0是黑色,1是白色,在matlab中存为logic值
(2)灰度图像
:对于8位和16位图像数据可表示的灰度级别不同,通常我们选用的都是uint8的即256级灰度级的图像数据来表示灰度图像。
(3)索引图像
:包括一个数据矩阵X,一个颜色映像矩阵Map。其中Map是一个包含三列、若干行的数据阵列,其中每个元素的值均为[0, 1]之间的双精度浮点型数据。Map矩阵的每一行分别表示红色、绿色和蓝色的颜色值。在MATLAB中,索引图像是从像素值到颜色映射表值的“直接映射”。
(4)RGB图像
:有红、绿、蓝三个颜色通道,每个通道取值范围0~255。
2.RGB图像如何转换为灰度图像
RGB图像是有3个通道,也就是一个3维的矩阵,而灰度图只有一个通道,我们要做的就是将一个3通道的事物转为1通道的事物。这其中是有一个转换公式的,简单来说,就是把RGB的3个通道的分量按照一定的比例计算到灰度图像中。即通过在网上查阅资料找到线性转换公式如下:
G
r
a
y
=
R
∗
0.299
+
G
∗
0.587
+
B
∗
0.114
Gray = R*0.299 + G*0.587 + B*0.114
Gray=R∗0.299+G∗0.587+B∗0.114
通过对RGB图像的所有像素点像素值进行公式计算得到新的图像即为灰度图像。
3.RGB图像如何转换为黑白图像
RGB图像要想转换为黑白图像首先要按照步骤先将其转换为灰度图像,然后根据选择的阈值,大于阈值的置白(255),小于阈值的置黑(0),再通过函数logical()将灰度值转换为逻辑值0/1,即将RGB图像转换为二值图像。
其中阈值的选择通过查阅资料找到原系统函数是使用了最大类间方差法graythresh()来选择的阈值,所以我也选取了这个函数来获取阈值,没有对该函数重新编写。
4.代数运算
代数运算是指对两幅或两幅以上输入图像进行点对点的加、减、乘、除运算而得到目标图像的运算。图像处理代数运算的 4 种基本形式分别如下。
①
C
(
x
,
y
)
=
a
∗
A
(
x
,
y
)
+
b
∗
B
(
x
,
y
)
C(x,y)=a*A(x,y)+b*B(x,y)
C(x,y)=a∗A(x,y)+b∗B(x,y)
②
C
(
x
,
y
)
=
a
∗
A
(
x
,
y
)
-
b
∗
B
(
x
,
y
)
C(x,y)=a*A(x,y)-b*B(x,y)
C(x,y)=a∗A(x,y)-b∗B(x,y)
③
C
(
x
,
y
)
=
a
∗
A
(
x
,
y
)
×
b
∗
B
(
x
,
y
)
C(x,y)=a*A(x,y)×b*B(x,y)
C(x,y)=a∗A(x,y)×b∗B(x,y)
④
C
(
x
,
y
)
=
a
∗
A
(
x
,
y
)
÷
b
∗
B
(
x
,
y
)
C(x,y)=a*A(x,y)÷b*B(x,y)
C(x,y)=a∗A(x,y)÷b∗B(x,y)
式中,
A
(
x
,
y
)
A(x,y)
A(x,y)和
B
(
x
,
y
)
B(x,y)
B(x,y)为输入图像表达式;
C
(
x
,
y
)
C(x,y)
C(x,y)为输出图像表达式;a、b为系数。
为对图像数据进行操作,首先将像素值转换为0-1之间的double类型数据再进行线性运算。
5.实验中直接使用的函数
(1)imread(path)函数
从图像所在路径读取图像的数据信息存为矩阵。
(2)imshow(image)函数
将读取到的图像显示到figure中。
(3)imwrite(image,path)函数
将图像以某种格式存储到磁盘的某路径下。
(4)subplot(m,n,p)函数
subplot函数是将多个图画到一个平面上的工具。其中m、n表示一个m行n列的大画框,可显示 mn个图 ,p表示图所在位置。
(5)构造函数
function[输出形参]=函数名([输入形参])
函数体
(6)size()函数
[m,n] = size(X)
返回矩阵X的尺寸信息, 并存储在m、n中。其中m中存储的是行数,n中存储的是列数。
(7)zeros(m,n)函数
产生mn的double类型零矩阵。
(8)double(x)
增加数据的精度,使计算更加准确。
(9)im2double(A)
将图像转换为 double 类型、且范围在0-1之间。
(10)graythresh(image)
使用最大类间方差法找到图片的一个合适的阈值。利用这个阈值通常比人为设定的阈值能更好地把一张灰度图像转换为二值图像。
3.2 实验代码
【主函数:sy1.m】
clear all;close all;clc;
%% 1、读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分成三个子窗口来分别显示RGB图像和灰度图像,注上文字标题,并将结果以文件形式存到磁盘上。
RGB=imread('V.jpg'); %图像读入
I=myrgb2gray(RGB); %把 RGB 图像转换成灰度图像
J=myim2bw(RGB); %把 RGB 图像转换成二值图像
figure,suptitle('图像类型转换'); %Figure 1
subplot(131);imshow(RGB),axis on,title("RGB图像");
subplot(132);imshow(I),axis on,title("灰度图像");
imwrite(I,'D:\Project_All_Apps\DIP_project\zuoye\SY1\灰度图像.bmp');
subplot(133);imshow(J),axis on,title("二值图像");
imwrite(J,'D:\Project_All_Apps\DIP_project\zuoye\SY1\二值图像.bmp');
%% 2、对两幅不同图像执行加、减、乘、除操作,在同一个窗口内分成6个子窗口来分别显示,注上文字标题。
A=imread('scenery.jpg');
B=imread('person.jpg'); %读取图像
A=im2double(A); %将图像转换为 double 型、且范围在0-1之间
B=im2double(B);
C=0.5*A+0.5*B; %两幅图像相加
D=A-0.7*B; %两幅图像相减
E=A.*B; %两幅图像相乘
F=A./B; %两幅图像相除
figure,suptitle('代数运算'); %Figure 2
subplot(231);imshow(A),axis on,title('背景图');
subplot(232);imshow(B),axis on,title('人物图');
subplot(233);imshow(C),axis on,title('加');
imwrite(C,'D:\Project_All_Apps\DIP_project\zuoye\SY1\加.bmp');
subplot(234);imshow(D),axis on,title('减');
imwrite(D,'D:\Project_All_Apps\DIP_project\zuoye\SY1\减.bmp');
subplot(235);imshow(E),axis on,title('乘');
imwrite(E,'D:\Project_All_Apps\DIP_project\zuoye\SY1\乘.bmp');
subplot(236);imshow(F),axis on,title('除');
imwrite(F,'D:\Project_All_Apps\DIP_project\zuoye\SY1\除.bmp');
【myrgb2gray.m】
% 函数myrgb2gray:把 RGB 图像转换成灰度图像
% 输入参数:image:原图像
% 输出参数:灰度图像gray
% 使用函数:size(x):求矩阵大小
% double(x):增加精度
% zeros():为矩阵分配空间
function gray=myrgb2gray(image)
[x,y,h]=size(image);%获取原图像的大小
image=double(image);%运算的时候用double,为了保持运算精度
if h==1
gray=image;%如果只有一个通道说明是灰度图像,不需要做变换
else
gray=zeros(x,y);%为输出图像分配空间
for i = 1:x
for j = 1:y
gray(i,j)=image(i,j,1)*0.299+image(i,j,2)*0.587+image(i,j,3)*0.114;%根据公式计算
end
end
end
gray=uint8(gray);%存储的时候的一般存储为uint8类型,节省存储空间,显示的时候用uint8
【myim2bw.m】
% 函数myim2bw:把 RGB 图像转换成二值图像
% 输入参数:image:原图像
% 输出参数:二值图像bw
% 使用函数:size(x):求矩阵大小
% double(x):增加精度
% zeros():为矩阵分配空间
% graythresh(image):获取阈值
function bw=myim2bw(image)
image=myrgb2gray(image);%先将RGB图像转换为灰度图像
threshold = graythresh(image);%自动确定二值化阈值
image=im2double(image);
[x,y]=size(image);%获取原图像的大小
bw=zeros(x,y);%为输出图像分配空间
for i = 1:x
for j = 1:y
if image(i,j)<threshold
bw(i,j)=0;
else
bw(i,j)=255;
end
end
end
bw=logical(uint8(bw));
3.3 实验结果
图一为对RGB图像进行的类型转换,在实验过程中通过与原系统函数的输出效果对比发现,自编写的函数效果很好。
四、实验心得
- 通过自编写Matlab的系统函数了解了函数内部的具体实现,对图像类型转换、代数原运算的原理加深理解;
- 后通过查阅资料发现代数运算还能够达到去除背景、降噪,图像增强等效果,不过在实验过程中没有去实现。所以实验原理虽然不是很复杂,但如果从其他角度来思考,简单的运算可以实现的功能可以有很多,还需要在之后的实验中加强思考能力。