目录
什么是数字图像处理?即利用计算机对数字图像进行处理。
数字图像处理:digital image processing
2月27号(数字图像处理相关概念)
1、数字图像处理:
(1)数字图像处理概论
(2)图像变换
(3)图像增强
(4)图像复原
(5)彩色图像处理
(6)形态学处理
(7)图像分割
2、数字图像处理又称为计算机图像处理,是指将模拟的图像信号转换成离散的数字信号并利用计算机对其进行处理的过程,其输入是原始图像,输出则是改善后的图像或者是从图像中提取出的一些特征,以提高图像的实用性,从而达到人们所要求的预期结果。
3、数字图像的基本类型:
(1)黑白图像(二值图像):是指图像的每个像素只能是黑或者白,没有过渡,故又称为二值图像。二值图像的像素值为0,1。
(2)灰度图像:灰度图像是指各像素信息由一个量化的灰度级来描述的图像,没有彩色信息。灰度取值范围为[0,255],“0”表示纯黑色,“255”表示纯白色,中间的数字表示黑白之间的过渡色。
(3)彩色图像:彩色图像是指每个像素的信息由RGB三原色构成的图像,其中RGB是由不同的灰度级来描述的。
4、数字图像处理的主要研究内容
(1)图像变换
(2)图像增强和复原—改善图像质量
(3)图像编码压缩
(4)图像分割
5、数字图像处理的应用非常广泛
如山林防火(通过颜色信息来判断;视觉监视、公安;工业检测与测量;医疗诊断;通讯;影视业等等;
3月5号(数字图像处理应用简介)
3月12号(Matlab基础入门)
3、变量的定义及特殊变量及常量
3.1变量的定义
变量不需要定义就可以使用,但必须赋值;
变量名区分大小写;
变量名的第一个字符必须为英文字母,并且变量名不超过31个字符;
变量名可以包含下连字符、数字,但不能为空格符、标点;
变量名不要和函数名重复;
基本数据类型为矩阵;
3.2 特殊变量及常量
ans : 最近生成的无名结果;
eps :浮点数的相对误差;
pi :3.1415926
i :虚数单位
j :虚数单位
Inf :无穷大
Nan :非数值型变量
Realmin :最小的正浮点数,Realmax :最大的浮点数
4、基本运算
4.1 算术运算符
加(+)
减(-)
乘():包括标量乘、矩阵乘、标量与矩阵乘
除(/):包括标量除、矩阵除标量、数组除标量
^ :矩阵求幂(矩阵必须为方阵)
点乘(.):矩阵对应元素相乘
点除(./):矩阵对应元素相除
.^ :矩阵每个元素求幂
4.2 关系运算符
<(小于) <= (小于等于) > (大于) >=(大于等于) ==(相等) ~=(不相等)
4.3 逻辑运算符
&(与)、|(或)、~(非)
运算法则:若逻辑为真,结果为1;若逻辑为假,结果为0
4.4 特殊运算符
= :变量赋值
% :注释符
… :换行符
‘ :矩阵转置符
::冒号运算符
n:s:m :产生n~m,步长为s的序列,s可以为正或负或者小数,默认值为1
5、矩阵操作
5.1 矩阵生成
(1)矩阵的直接输入
按元素排列顺序直接输入,所有元素用方括号“[ ]”括住;同行元素用逗号或者空格分隔,不同行元素用分号或回车分开;
A = [1,2,3;4,5,6]或A = [1 2 3;4 5 6]
输出结果:
A =
1 2 3
4 5 6
注:若不指定输出变量,则系统默认ans为变量名;
利用下标,比如A(i,j)可以访问矩阵元素;
如:a = A(2,1)
输出为:
a = 4
(2)矩阵的函数生成
[ ] 空矩阵;
zeros(m,n) 零矩阵;
ones(m,n) 1矩阵;
eye(m,n) 单位矩阵;
rand(m,n) (0,1)区间内的均匀分布随机矩阵;
例:
eye(3,4)
ans =
1 0 0 0
0 1 0 0
0 0 1 0
rand(2,3)
ans =
0.8147 0.1270 0.6324
0.9058 0.9134 0.0975
5.2 向量(数组)的输入
(1)作为矩阵输入
A = [1,2,3]; %行向量
B = [1;2;3]; %列向量
C = rand(1,4); %利用矩阵生成函数
(2)行向量的特殊输入方式
由冒号a:d:b生成等差数组:从a到b公差为d(默认为1)的等差数组;
由函数**linspace(a,b,n)**生成等差数组:从a到b共n(默认100)个数值;
linspace(1,2,4)
ans =
1.0000 1.3333 1.6667 2.0000
2:3:4
ans =
2
2:2:8
ans =
2 4 6 8
5.3 矩阵的裁剪、拼接与修改
(1)矩阵的裁剪
在MATLABA中,矩阵的元素可用其行标、列标表示。从一个矩阵中取出若干行(列)构成新矩阵称为裁剪,其中冒号“:”的使用非常重要;
A = [1,2,3,4;5,6,7,8;9,10,11,12];%定义矩阵A
A(3,:) %提取第三行
ans =
9 10 11 12
A(:,2) %提取第2列
ans =
2
6
10
X = A(2:3, [1,3,4]) %提取2,3行,1,3,4列
X =
5 7 8
9 11 12
(2)矩阵的拼接
在MATLAB中,可按照分块矩阵思想,由小矩阵拼接组合成大矩阵,但应注意所有小矩阵维数应当相容;
A = [1,2,3,4;5,6,7,8;9,10,11,12];%定义矩阵A
E = [A(2,:);zeros(2,1),eye(2,3)]%由A的第2行,2行1列零向量及2行3列单位阵拼接成3行4列矩阵E
输出结果:
E =
5 6 7 8
0 1 0 0
0 0 1 0
(3)矩阵的编辑修改
在MATLAB中,通过对矩阵的部分元素(子矩阵)重新赋值,可以实现对矩阵元素的编辑和修改;
A = [1,2,3,4;5,6,7,8;9,10,11,12];%定义矩阵A
A(3,1)=0; %将A的第3行1列元素修改为0
A(1:2,3:4)=eye(2) %将A的第1,2行,3,4列子矩阵改为2阶单位阵
输出结果:
A =
1 2 1 0
5 6 0 1
0 10 11 12
5.4 矩阵运算
(1)矩阵的基本运算
A±B (A,B同维数,对应元素相加减)
A*B (A列数=B列数,通常矩阵乘法)
A\B (左除,A,B同行数,方程AX = B解)
B/A (右除,A,B同行数,方程B = AX解)
A’ (共轭转置)
A^p (矩阵乘幂,A为方阵)
(2)常数与矩阵的运算
b±A、b*A、b\A、A/b(b与A各元素做相应运算,对于除法b只能做除数)
(3)矩阵的特殊运算(点运算)
A.\b、b./A、A.b、b.A(b与A各元素做相应运算)
例:
A = [1 2 3;3 1 2];
B = [2 1 0;3 0 2];
C = [1 2;3 0];
X1 = A+B
X2=C*B
X3=A\B
X1 =
3 3 3
6 1 4
X2 =
8 1 4
6 3 0
X3 =
0.7143 -0.2857 0.8571
0 0 0
0.4286 0.4286 -0.2857
5.5 常用矩阵操作函数
sum 矩阵求和
prod 矩阵相乘
size 矩阵大小
length 矩阵长度
sort 矩阵排序
max/min 矩阵最大值/最小值
reshape 矩阵变形函数
repmat 矩阵堆叠
find 矩阵查询
6、M文件的创建
6.1 脚本文件( 亦称命令M-文件)
脚本文件的结构比较简单,它没有输入参数和输出参数,只是一些MATLABA命令行的组合。脚本文件中定义的变量都是全局变量;
6.2 函数文件(亦称函数M-文件)
通常函数文件包含以下几个部分:
(1)函数定义行:位于文件首行,以function开头;
(2)帮助信息:紧跟函数定义行后,以%开头注释行;
(3)函数体:函数的执行语句部分;
(4)注释部分:命令行中以“%”开始直到该行结束;
语句的一般形式:
[变量]=表达式
注:①若缺省“变量=”,则系统默认ans为变量名;
②若语句末尾以分号“;”结束,则命令执行后不显示计算结果;
③若语句太长可以使用续行符“…”将其延续到下一行;
④一行中可书写多个语句,各语句之间要用逗号(显示计算结果)或分号(不显示计算结果)分开;
3月20号(1.Matlab数据操作及语法;2.掌握Matlab矩阵操作)
3月26号(学习Matlab基础知识)
重点:掌握三维数组的建立方法,为以后对彩色图像的操作建立基础;
重点掌握二维数组(矩阵)的算术运算、关系运算、数据分析及统计函数;
了解函数曲线的绘制方法,掌握plot函数功能;
注意:plot函数有很多参数,包括点、线的颜色和形状等。变量个数尽可能取多个,及变量生成间隔小些,这样拟合的曲线较光滑;
1、Matlab简介
1.1 命令窗口
常见通用命令:
clc 清除命令窗口显示的内容
clear 清除Matlab工作空间中保存的变量
who或whos 显示Matlab工作空间中的变量信息
dir 显示当前工作目录的文件和子目录清单
cd 显示或设置当前工作目录
type 显示指定m文件的内容
help 获取在线帮助
quit或exit 关闭/退出MATLAB
2、Matlab数据及其运算
2.1数组的概念
一维数组,也称为向量(行向量,列向量)
二维数组(矩阵)
多维数组
2.2 创建一维数组变量
第一种方法:使用方括号“[]"操作符
第二种方法:使用冒号“;”操作符
a = [1 3 5]
a =
1 3 5
b=1:10
b =
1 2 3 4 5 6 7 8 9 10
c = 1:2:10
c =
1 3 5 7 9
d = 1:2:9
d =
1 3 5 7 9
利用":"操作符创建行向量的基本语法格式 : x = start:Increment:End
2.3 创建二维数组变量
第一种方法:使用方括号“[ ]”操作符
a = [1 2 3;4 5 6]
a =
1 2 3
4 5 6
第二种方法:函数方法
ones(3,4) %全1矩阵
ans =
1 1 1 1
1 1 1 1
1 1 1 1
zeros(3,4) %生成全0矩阵
ans =
0 0 0 0
0 0 0 0
0 0 0 0
reshape(a,2,3) %重排矩阵,要求元素总数不变
ans =
1 2 3
4 5 6
size(a) %size函数返回变量的大小,即变量数组的行列数
ans =
2 3
2.4 多维数组的定义
在MATLAB的数据类型中,向量可视为一维数组;矩阵可视为二维数组,对于维数超过2的数组均可视为多维数组
三维数组元素的寻址:可以(行,列,页)来确定;
A(:,:,1) 代表第一页的二维数组;
A(:,:,2) 代表第二页的二维数组;
2.5 数组的算术运算
加 + 相应元素相加
减 - 相应元素相减
*乘 *** 矩阵乘法
点乘 . 相应元素相乘
幂 ^ 矩阵幂运算
点幂 .^相应元素进行幂运算
左除或右除 \或/ 矩阵左除或右除
左点除或右点除 .\或./ A的元素被B的对应元素除
对于右除式A/B,相当于A*inv(B),对于左除式A\B,则相当于inv(A)*B
例:画出y=1/(x+1)的函数曲线,x€[0,100]
x = 0:100;
y = 1./(x+1);
plot(x,y)
例:建立5阶矩阵A,判断其元素是否能被3整除
A = [24,78,89,92,29;378,39,27,29,90;17,12,34,5,6;2,3,4,5,6;3,4,54,56,3435];
B = rem(A,3)==0 %被3除,求余输出结果:
B =
5×5 logical 数组
1 1 0 0 0
1 1 1 0 1
0 1 0 0 1
0 1 0 0 1
1 0 1 0 1
例:在[0,3π]区间,求y = sinx的值。要求消去负半波,即[π,2π]区间内的函数值置零
x = 0:pi/100:3*pi;
y = sin(x);
y1 = (y>=0).*y;%消去负半波
plot(x,y1)
例:建立矩阵A,找出在[10,20]区间的元素的位置
A = [4,15,9;9,2,3];
find(A>=10&A<=20)%找到非零元素的位置输出结果:
ans =
3注:索引从第一列开始,由上到下,由左到右的原则
2.6 数据分析与统计
2.6.1 最大值和最小值
(1)求向量(行向量或列向量)的最大值和最小值
x = [-43,72,9,16,23,47]
y = max(x)
[y,i]=max(x) %求向量x中的最大值及其该元素的位置
输出结果:
x =
-43 72 9 16 23 47y =
72y =
72i =
2
(2)求矩阵的最大值和最小值
x = [-43,72,9;16,23,47]
y = max(x)%求矩阵x中每列的最大值
[y,i]=max(x)%求矩阵x中每列的最大值以及该元素的位置
max(x,[],1)%求矩阵中每列的最大值
max(x,[],2)%求矩阵中每行的最大值
输出结果:
x =
-43 72 9
16 23 47y =
16 72 47y =
16 72 47i =
2 1 2ans =
16 72 47ans =
72
2.6.2 求和和求积
(1)向量(行向量或列向量)
sum(X) 返回向量X各元素的和
prod(X) 返回向量X各元素的积
A = [1 2 3]
A =
1 2 3
sum(A)
ans =
6
prod(A)
ans =
6
(2)矩阵的和与积
A = [1 2 3;4 5 6]
sum(A)%返回一个行向量,其第i个元素是A的第i列的元素和
sum(A,1)%返回一个行向量,其第i个元素是A的第i列的元素和
sum(A,2)%返回一个列向量,其第i个元素是A的第i行的各元素的和
prod(A)%返回一个行向量,其第i个元素是A的第i列的元素积
prod(A,1)
prod(A,2)%返回一个列向量,其第i个元素是A的第i行的各元素的积
2.6.3 平均值和中值
(1)向量
A = [ 1 2 3]
mean(A) 返回向量A的算术平均值
median(A) 返回向量A的中值
(2)矩阵
A = [1 2 3;4 5 6]
mean(A)%返回一个行向量,其第i个元素是A的第i列的算术平均值
mean(A,1)%返回一个行向量,其第i个元素是A的第i列的算术平均值
mean(A,2)%返回一个行向量,其第i个元素是A的第i行的算术平均值
median(A)%返回一个行向量,其第i个元素是A的第i列的中值
median(A,1)%返回一个行向量,其第i个元素是A的第i列的中值
median(A,2)%返回一个行向量,其第i个元素是A的第i行的中值
2.6.4 习题:
(1)计算矩阵[ 5 3 5;3 7 4;7 9 8]和 [ 2 4 2;6 7 9;8 3 6]之和;
答:
A = [5 3 5;3 7 4;7 9 8];
B = [2 4 2;6 7 9;8 3 6];
C = A + B
输出结果:
C =
7 7 7
9 14 13
15 12 14
(2)计算a = [6 9 3;2 7 5]与b = [2 4 1;4 6 8]的数组乘积;%即对应元素相乘
a = [6 9 3;2 7 5];
b = [2 4 1;4 6 8];
c = a.*b
输出结果:
c =
12 36 3
8 42 40
(3)已知:a = [1 2 3;4 5 6;7 8 9],分别计算a的数组平方和矩阵平方,并观察其结果;
a = [1 2 3;4 5 6;7 8 9]
a =
1 2 3
4 5 6
7 8 9
输出结果:
a.^2
ans =
1 4 9
16 25 36
49 64 81a^2
ans =
30 36 42
66 81 96
102 126 150
(4)先构造矩阵A = [1,3,5;8,6,3;7,1,0;5,0,1],显示矩阵的第3行第1列的元素,再显示该矩阵的第1,4行第2,3列的元素;该矩阵第3行第2列元素改成8;添加1行1列使得第5行第4列的元素为9,其他元素为0;求矩阵A的最大值、最小值、均值和中值
A = [1 3 5;8 6 3;7 1 0;5 0 1]
A =
1 3 5
8 6 3
7 1 0
5 0 1
A(3,1) %显示矩阵的第3行第1列的元素
ans =
7
A([1,4],2:3) %显示该矩阵的第1,4行第2,3列的元素
ans =
3 5
0 1
A(3,2)=8 %矩阵第3行第2列元素改成8
A =
1 3 5
8 6 3
7 8 0
5 0 1
B = zeros(5,4); %添加1行1列使得第5行第4列的元素为9,其他元素为0
B(1:4,1:3) = A
B =
1 3 5 0
8 6 3 0
7 8 0 0
5 0 1 0
0 0 0 0
B(5,4) = 9
B =
1 3 5 0
8 6 3 0
7 8 0 0
5 0 1 0
0 0 0 9
A_max = max(A(: )) %矩阵的最大值(注意一下这里)
A_max =
8
A_min = min(A(: )) %矩阵的最小值
A_min =
0
A_mean = mean(A(: )) %矩阵的均值
A_mean =
3.9167
A_median = median(A(: )) %矩阵的中值
A_median =
4
(5)画图练习:利萨如图形,可用下面参数式来表示:
x = cos(mt);
y = sin(nt);
画出在不同m,n值下的利萨如图形:
a.m=n=1;
b.m=3,n=2;
c. m=2,n=7;
d. m=10,n=11
t = 1:0.1:100;
m=3;n=2;
x = cos(mt);
y = sin(nt);
plot(x,y)
4月2号(图像读取、显示与保存)
1、基本知识点
读取图像:imread() %将图像加载并存成array格式备用
size()%图像信息 宽、高
whos %display information about an image
imshow()%开启一个窗口显示影像
figure,imshow(I)%开启一个新窗口显示影像
%读取图像
f = imread(‘kids.tif’)
imshow(f)%显示灰度图像
[f,map] = imread(‘kids.tif’)
figure,imshow(f,map)%显示的是彩色图像
%保存图像
imwrite(I,filename.format)
%图像二值化
**g = im2bw(I,t)%第一个参数是图片路径,第二个参数是阈值(0~1;阈值越大,黑色像素点越大)**
I = imread(‘1.jpg’)%灰度图像二值化
g = im2bw(I,0.4)
%彩色转灰阶
rgb2gray()
I = imread(‘F:\2020春学习\Web程序设计\第三周作业\3.jpg’)
g = rgb2gray(I)
%在一个窗口显示多幅图像
subplot(r,c,l)%其中,r代表行,c代表列,I代表显示的第i图像
f = imread(‘F:\2020春学习\Web程序设计\第三周作业\3.jpg’)
I = imread(‘grayImage.jpg’)
subplot(1,2,1);imshow(f);
subplot(1,2,2);imshow(I)
%读取以及显示彩色图像
f = imread(‘F:\2020春学习\Web程序设计\第三周作业\3.jpg’)
figure,imshow(f)
[M,N,K] = size(f)
R = f(:,:,1)
G = f(:,:,2)
B = f(:,:,3)
2、练习题
(1)彩色图像是否可以直接用im2bw函数呢?其结果与先将彩色图像灰度化再进行二值化结果相同吗?在同一窗口显示两幅结果图像进行对比。
A = imread(‘3.jpg’);
B = im2bw(A);
B1 = rgb2gray(A);
C = im2bw(B1);
subplot(1,2,1),imshow(B);subplot(1,2,2),imshow©e = sum(sum(B-C)) %即用矩阵的差查看两个矩阵是否相同
e =
0
(2)计算一幅彩色图像三个通道的均值,即一幅灰度图像,对比该幅图像与采用rgb2gray函数得到的图像是否相同?在同一窗口显示两幅结果图像进行对比。(这个题暂定)
4月9号(图像剪切、旋转与缩放)
1、图像剪切
方法一:由于数字图像的表现形式是矩阵,所以可以通过截取矩阵的某些行和某些列来实现图像剪切
I = imread(‘1.jpg’);
I1 = I(100:200,100:200);
subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(I1)
方法二:有函数imcrop() 用法:I2 = imcrop(I,RECT)
I = imread(‘1.jpg’);
I2 = imcrop(I,[0,0,100,100]);
subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(I2)
2、图像旋转
函数:imrotate(A,ANGLE)
A = imread(‘3.jpg’);
B = imrotate(A,45);
subplot(1,2,1),imshow(A);subplot(1,2,2),imshow(B)
imrotate(A,ANGLE,METHOD) nearest,bilinear(双线性差值),bicubic(双三次差值)
A = imread(‘3.jpg’);
B = imrotate(A,45,‘nearest’);
C = imrotate(A,45,‘bilinear’);
D = imrotate(A,45,‘bicubic’);
subplot(2,2,1),imshow(A);subplot(2,2,2),imshow(B);subplot(2,2,3),imshow©;subplot(2,2,4),imshow(D)
A = imread(“3.jpg”);
B = imrotate(A,45,‘bilinear’,‘crop’);%旋转45度(注意一下这里)
subplot(1,2,1),imshow(A);
subplot(1,2,2),imshow(B)
3、图像镜像
水平镜像:左右部分以垂直中线为中心轴对换
A = imread(‘1.jpg’);
C = A(:,end: -1:1,:);
subplot(1,2,1),imshow(A);subplot(1,2,2),imshow©
垂直镜像:上下部分以水平中轴线为中心轴对换
A = imread(‘1.jpg’);
B = A(end: -1:1,:,: );
subplot(1,2,1),imshow(A);subplot(1,2,2),imshow(B)
4、图像缩放
函数imresize(A,scale) 参数scale等比缩放
A = imread(‘1.jpg’);
B = imresize(A,0.5);
subplot(1,2,1),imshow(A);subplot(1,2,2),imshow(B)
函数imresize(A,[NUMROWS NUMCOLS])
A = imread(‘1.jpg’);
B = imresize(A,[100,200]);%缩放成任意大小
subplot(1,2,1),imshow(A);subplot(1,2,2),imshow(B)
函数imresize(A,[NUMROWS NUMCOLS],METHOD)
nearest,bilinear(双线性差值),bicubic(双三次差值)
A = imread(‘1.jpg’);
B = imresize(A,[100,200],‘nearest’);
subplot(1,2,1),imshow(A);subplot(1,2,2),imshow(B)
5、习题
(1)分别显示图像的奇数行和奇数列,偶数行和偶数列;将图像(灰度和彩色)的右上角和左下角(图像的四分之一)置黑;
A = imread(‘2.jpg’)
B = A(1:2:end,1:2:end,:)%%%奇数行奇数列,注意,彩色图像还有第三维
figure,imshow(B)
A = imread(‘g4.jpg’);
B = A(2:2:end,2:2:end);%%%偶数行偶数列
imshow(B)
灰度图像,直接对图像赋值
A = imread(“g1.jpg”)
[m,n]=size(A)
A(1:m/2,n/2+1:end)=0;
A(m/2+1:end,1:n/2)=0;
figure,imshow(A)
彩色图像,直接对图像赋值(对彩色图像处理千万不要忘记第三维)
A = imread(“2.jpg”)
[m,n,k] = size(A)
A(1:m/2,n/2+1:end,:)=0
A(m/2+1:end,1:n/2,:)=0
figure,imshow(A)
4月16日 (练习课)
(1)分别将彩色图像RGB某个通道置黑,观察结果,并在一个窗口显示各结果;
A = imread(‘1.jpg’);
A1 = A;
A2 = A;
A3 = A;
A1(:,:,1)=0;
A2(:,:,2)=0;
A3(:,:,3)=0;
subplot(2,2,1),imshow(A); subplot(2,2,2),imshow(A1); subplot(2,2,3),imshow(A2); subplot(2,2,4),imshow(A3);
(2)将一幅灰度图像的每个像素分别乘以2和0.5,观察结果;
A = imread(‘g4.jpg’);
A1 = A2;
A2 = A0.5;
subplot(1,3,1),imshow(A);subplot(1,3,2),imshow(A1);subplot(1,3,3),imshow(A2);
(3)将一幅图像的高和宽缩放到原来的0.5倍,再变为二值图像,最后将二值图像顺时针旋转45度并显示为原来图像大小,在一个窗口显示各步结果图像;
A = imread(‘2.jpg’);
B = imresize(A,0.5);
B1= im2bw(B);
B2 = imrotate(B1,-45,‘crop’);
subplot(2,2,1),imshow(A);subplot(2,2,2),imshow(B);subplot(2,2,3),imshow(B1);subplot(2,2,4),imshow(B2);
(4)生成一幅200*200的彩色图像,要求左上角(四分之一)是黄色,右下角是品红,其他是黑色;
A = zeros(200,200,3);
[m,n,k] = size(A);
A(1:m/2,1:n/2,1) = 255;
A(1:m/2,1:n/2,2) = 255;
A(1:m/2,1:n/2,3) = 0;
A(m/2+1:end,n/2+1:end,1)=255;
imshow(A)
(5)对彩色图像‘onion.png’(系统自带,可直接读取)分别进行水平和垂直镜像,并在一个窗口显示原图、水平镜像图像和垂直镜像图像。(提示:不要忘记第三维哦)
A = imread(‘onion.png’);
A1 = A(:,end: -1:1,:);%水平镜像
A2 = A(end: -1:1,:, : );%垂直镜像
subplot(1,3,1),imshow(A);subplot(1,3,2),imshow(A1);subplot(1,3,3),imshow(A2);
4月23号(图像增强-亮度变化和直方图)
1、亮度变换
图像增强方法:空域方法(基于像素点的处理、基于模板的空域滤波);频率方法;
函数imadjust是对灰度图像进行亮度变换的基本工具,语法为:J=imadjust(I),将图像的最小值映射成0,最大值映射成255
subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);
J = imread(‘pout.tif’);
I = imadjust(J);
subplot(1,2,1),imshow(J);subplot(1,2,2),imshow(I);
J = imadjust(I,[LOW_IN HIGH_IN],[LOW_OUT HIGH_OUT])
将一个范围[LOW_IN HIGH_IN]的灰度值映射成另一个范围[LOW_OUT HIGH_OUT]的灰度值,将小于LOW_IN的值映射成LOW_OUT,将大于HIGH_IN的值都映射成HIGH_OUT;
I = imread(‘g4.jpg’);
J = imadjust(I,[0.3 0.7],[0 1]);
subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);
J = imadjust(I,[LOW_IN HIGH_IN],[LOW_OUTHIGH_OUT],GAMMA)
GAMMA这个参数加上,可以有非线性变化,GAMMA这个参数不写,默认为线性变换;GAMMA=1,线性变换;GAMMA>1,图像整体变暗;GAMMA<1,增亮减暗
I = imread(‘g4.jpg’);
J = imadjust(I, [],[]);
J1 = imadjust(I, [],[],0.3);
J2 = imadjust(I, [],[],2);
subplot(2,2,1),imshow(I);subplot(2,2,2),imshow(J);subplot(2,2,3),imshow(J1);subplot(2,2,4),imshow(J2);
I = imread(“3.jpg”);
J = imadjust(I,[0.3,0.7],[0,1]);
J1 = imadjust(I,[],[],0.5);
J2 = imadjust(I,[],[],2);
subplot(2,2,1),imshow(I);
subplot(2,2,2),imshow(J);
subplot(2,2,3),imshow(J1);
subplot(2,2,4),imshow(J2)
2、直方图
灰度级的直方图是反应一幅图像中的灰度级与出现这种灰度的概率之间的图形:imhist()
I = imread(‘g4.jpg’);
imhist(I)
直方图均衡化:增大图像的对比度 J =histeq(I,HGRAM)
默认情况下HGRAM=64;
注:imhist和histeq只能作用在灰度或二值图像上
I = imread(‘g4.jpg’);
J = histeq(I,100);
subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J)
3、习题
(1)用两种图像增强方法增强图像(即基于像素点和直方图两种方法),分别显示原始图像和增强后的图像的直方图;
I = imread(‘g4.jpg’);
I1 = imadjust(I);
I2 = histeq(I,100);
subplot(1,3,1),imshow(I);
subplot(1,3,2),imshow(I1);
subplot(1,3,3),imshow(I2);
(2)对彩色图像增强(对各个通道操作进行直方图均值化),分别显示原始图像和增强后的图像;
I = imread(‘3.jpg’);
J = I;
J(:,:,1) = histeq(J(:,:,1));
J(:,:,2) = histeq(J(:,:,2));
J(:,:,3) = histeq(J(:,:,3));
subplot(1,2,1),imshow(I);
subplot(1,2,2),imshow(J)
5月7号(图像增强-空间滤波)
1、空间域滤波
空间域滤波是基于邻域处理的增强方法。
使用空间模板进行的图像处理,被称为空域滤波。模板本身被称为空域滤波器
空域滤波
(1)平滑滤波器(模糊处理和减少噪声);
①线性平滑滤波器;②中值滤波器;
(2)锐化滤波器(使边缘和轮廓线模糊的图像变清晰,使细节更清晰)
①梯度算子法;②拉普拉斯算子法;
平滑滤波:
(1)邻域平均法(均值滤波-线性):就是将当前像素领域内各像素的灰度平均值作为其输出值的去噪方法;
(2)中值滤波法(非线性):中值滤波是用一个有奇数点的滑动窗口,将窗口中心点的值用窗口各点的中值代替
最大值滤波主要用途:寻找最亮点 ;最小值滤波主要用途:寻找最暗点
2、图像噪声
(1)图像的加噪
噪声模型主要有两种:一种是空间域的噪声,一般用噪声概率密度函数来描述;另一种是频域的噪声,一般用噪声的各种傅里叶特性来描述;
在matlab中,使用imnoise()函数来污染一幅图像,从而达到退化的目的; 参数:gaussian poisson salt & pepper speckle
%加入高斯参数
I = imread(‘1.jpg’);
J = imnoise(I,‘gaussian’,0.0,0.2);%0.0均值,0.2方差
subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J)
加入椒盐噪声,,把某些像素点去黑或去白
I = imread(‘1.jpg’);
J = imnoise(I,‘salt & pepper’,0.001);
subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J)
3、图像去噪(平滑)
图像去噪(平滑) :
(1)生成模板函数:fspecial()函数
可用的参数有:
‘average’、‘disk’、‘gaussian’、‘laplacian’、‘log’、‘motion’、‘prewitt’、‘sobel’、‘unsharp’
(2)imfilter(A,H) A要处理的,H模板
边界选项: X, ‘symmetric’, ‘replicate’, ‘circular’
大小选项:same,full
%均值滤波
I = imread(‘1.jpg’);
J = imnoise(I,‘gaussian’,0.0,0.001);
w = fspecial(‘average’,3);%生成模板
I1 = imfilter(J,w);%去噪
subplot(1,3,1),imshow(I);subplot(1,3,2),imshow(J);subplot(1,3,3),imshow(I1)
%中值滤波 medfilt2() 模板默认3*3
I = imread(‘g4.jpg’);
J = imnoise(I,‘salt & pepper’,0.02);
K = medfilt2(J); %I需要是灰度图像或者二值图像
subplot(1,3,1),imshow(I);
subplot(1,3,2),imshow(J);
subplot(1,3,3),imshow(K)
4、习题
(1)对图像进行不同程度的平滑(模糊);
%均值
I = imread(‘g4.jpg’)
%J = imnoise(I,‘gaussian’,0.0,0.001)
w = fspecial(‘average’,3)
w1 = fspecial(‘average’,5)
w2 = fspecial(‘average’,90)
K = imfilter(I,w)
K1 = imfilter(I,w1)
K2 = imfilter(I,w2)
subplot(2,2,1),imshow(I);
subplot(2,2,2),imshow(K);
subplot(2,2,3),imshow(K1);
subplot(2,2,4),imshow(K2)
%中值
I = imread(‘g4.jpg’)
%J = imnoise(I,‘gaussian’,0.0,0.001)
K = medfilt2(I,[3,3])
K1 = medfilt2(I,[5,5])
K2 = medfilt2(I,[90,90])
subplot(2,2,1),imshow(I);
subplot(2,2,2),imshow(K);
subplot(2,2,3),imshow(K1);
subplot(2,2,4),imshow(K2)
(2)对图像添加不同种类的噪声,调节函数参数值观察结果;
I = imread(‘g4.jpg’)
J = imnoise(I,‘gaussian’)
J1 = imnoise(I,‘poisson’)
J2 = imnoise(I,‘salt & pepper’)
J3 = imnoise(I,‘speckle’)
subplot(2,3,1),imshow(I);
subplot(2,3,2),imshow(J);
subplot(2,3,3),imshow(J1);
subplot(2,3,4),imshow(J2);
subplot(2,3,5),imshow(J3)
(3)对图像分别添加高斯噪声和椒盐噪声,对比均值滤波和中值滤波效果;
I = imread(‘g4.jpg’);
J1 = imnoise(I,‘gaussian’);%加入高斯噪声
J2 = imnoise(I,‘salt & pepper’);%加入椒盐噪声
I1 = imfilter(J1,H);%加入高斯噪声,均值滤波
I2 = imfilter(J2,H);%加入椒盐噪声,均值滤波
I3 = medfilt2(J1,[5,5]);%加入高斯噪声,中值滤波
I4 = medfilt2(J2,[5,5]);%加入椒盐噪声,中值滤波
subplot(2,2,1),imshow(I1);
subplot(2,2,2),imshow(I3);
subplot(2,2,3),imshow(I2);
subplot(2,2,4),imshow(I4)
(4)观察imfilter中滤波类型,边界选项和大小选项对结果的影响;
%练习4:观察imfilter中滤波类型,边界选项和大小选项对结果的影响
I = imread(‘g4.jpg’)
J = imnoise(I,‘gaussian’)
w = fspecial(‘average’,9)
%大小选项
K = imfilter(J,w,‘same’)
K1 = imfilter(J,w,‘full’)
%滤波类型
K2 = imfilter(J,w,‘corr’)
K3 = imfilter(J,w,‘conv’)
%边界选项
K4 = imfilter(J,w,‘symmetric’)
K5 = imfilter(J,w,‘replicate’)
K6 = imfilter(J,w,‘circular’)
subplot(3,3,1),imshow(I);
subplot(3,3,2),imshow(J);
subplot(3,3,3),imshow(K);
subplot(3,3,4),imshow(K1);
subplot(3,3,5),imshow(K2);
subplot(3,3,6),imshow(K3);
subplot(3,3,7),imshow(K4);
subplot(3,3,8),imshow(K5);
subplot(3,3,9),imshow(K6)
(5)观察用最大值滤波,最小值滤波和中值滤波的对比结果;
I = imread(‘g4.jpg’);
J = imnoise(I,‘gaussian’);
I1 = medfilt2(J);%中值滤波(注意一下,这里只能用于二维),模板默认33
I2 = ordfilt2(I1,1,true(3));%排序滤波时取最小值,模板采用33
I3 = ordfilt2(I1,9,true(3));%排序滤波时取最大值
subplot(2,2,1),imshow(I);
subplot(2,2,2),imshow(I1);
subplot(2,2,3),imshow(I2);
subplot(2,2,4),imshow(I3)
5月14号(图像增强-锐化滤波)
1、锐化滤波器(是边缘和轮廓模糊的图像变清晰,使细节更清晰)
(1)梯度算子法;
(2)拉普拉斯算子法
图像模糊实质是图像受到平均或者积分运算的影响,对其进行逆运算就可使图像清晰
I = imread(‘moon.tif’);
H = fspecial(‘laplacian’,0);%生成拉普拉斯模板
I1 = im2double(I);
J = imfilter(I1,H);
I2 = I1 - J;
subplot(2,2,1),imshow(I);
subplot(2,2,2),imshow(J);
subplot(2,2,3),imshow(J,[]);
subplot(2,2,4),imshow(I2)
I = imread(‘moon.tif’);
H = fspecial(‘sobel’); %sobel算子
J = imfilter(I,H);
I2 = I - J;
subplot(1,3,1),imshow(I);
subplot(1,3,2),imshow(J);
subplot(1,3,3),imshow(I2)
5月22号(测试题)
第一道题:
I = imread(‘fabric.png’);
R = I(:,:,1);
G = I(:,:,2);
B = I(:,:,3);
subplot(1,3,1),imhist®;subplot(1,3,2),imhist(G);subplot(1,3,3),imhist(B)
第二道题:
I = imread(‘pout.tif’);
J = histeq(I);
subplot(2,2,1),imshow(I);
subplot(2,2,2),imhist(I);
subplot(2,2,3),imshow(J);
subplot(2,2,4),imhist(J);
第三道题:(此题待定)
I = imread(‘football.jpg’);
I1 = I;
H = fspecial(‘average’,7);
imfilter(I(:,:,1),H);imfilter(I(:,:,2),H);imfilter(I(:,:,3),H);
subplot(1,2,1),imshow(I1);subplot(1,2,2),imshow(I)
%第四道题:
I = imread(‘coins.png’);
J = imnoise(I,‘gaussian’,0.0,0.005);%添加高斯噪声
J1 = imnoise(I,‘salt & pepper’,0.03);%添加椒盐噪声
H = fspecial(‘average’,3);
I1 = imfilter(J,H);
I2 = medfilt2(J1);
subplot(2,2,1),imshow(J); subplot(2,2,2),imshow(J1); subplot(2,2,3),imshow(I1); subplot(2,2,4),imshow(I2);
%第五道题:
I = imread(‘eight.tif’);
H = fspecial(‘sobel’);
J = imfilter(I,H);
I1 = I - J;
H2 = fspecial(‘laplacian’);
J2 = imfilter(I,H2);
I2 = I- J2;
subplot(1,3,1),imshow(I);
subplot(1,3,2),imshow(I1);
subplot(1,3,3),imshow(I2);
%第六道题:
x = [0:pi/100:2pi];
y = 2exp(-0.5.*x).sin(2pi.*x);
plot(x,y);
%第七道题:
for x = 100:200
if mod(x,3)==0&&mod(x,7)==0
disp(x)
end
end
输出结果:
105
126
147
168
189
5月28号(条件语句与循环语句)
1、条件语句
(1)单条件语句
a = 1;b=2; c= 0;
if a+b==3
c = 3;
end
输出结果:
c
c =
3
(2)多条件语句
a=1;b=2;
if a>2
c=3;
else
c=0;
end
输出结果:
c
c =
0
2、循环语句
(1)for-end循环
(2)while-end循环
(3)break语句和continue语句
(4)循环的嵌套
3、习题
(1)求[10,20]之间第一个被3整除的整数;
for i =10:20
if rem(i,3)~=0
continue
else
break
end
end
i
输出结果:
i =
12
(2)将图像中最亮点找出来,并记录其位置及灰度值
f = imread(‘g4.jpg’)
[m,n] = size(f)
s = 0;
for i = 1:m
for j = 1:n
if f(i,j)>s
s = f(i,j);
m_pos = i;
n_pos = j;
end
end
end
输出结果:
m =
1292
n =
883
统计函数:统计函数更能优化函数
f = imread(‘g4.jpg’)
i_max = max(f(: ))
[i, j] = find(f == i_max)
练习题:
第一道题:
I = imread(‘g4.jpg’);
[m,n] = size(I);
s = 0;
for i = 1:m
for j = 1:n
if I(i,j)>200
s = s+1;
end
end
end输出结果:(根据图像不同结果不同)
s
s =
0
%第二道题
f = imread(‘grayImage.jpg’);
f1 = f;
[m,n] = size(f);
for i = 1:m
for j = 1:n
if f(i,j)> 200
f(i,j) = 255;
else f(i,j)<50
f(i,j) = 0;
end
end
end
%第三道题:
f = imread(‘grayImage.jpg’)
[m,n] = size(f);
sum = 0;
for i = 1:m
for j = 1:n
if f(i,j)>= 200
sum = sum+1;
end
end
end输出结果:
sum
sum =
625872
%第四道题:
f = imread(‘g4.jpg’)
[m,n] = size(f)
s = 0;
for i = 1:m
for j = 1:n
if f(i,j)>s
s = f(i,j);
m_pos = i;
n_pos = j;
end
end
end输出结果:
m_pos
m_pos =
635n_pos
n_pos =
408s
s =
uint8
199
%第五道题
f = imread(‘g4.jpg’);
[m,n] =size(f);
f = im2double(f);
for i=1:m
for j=1:n
if f(i,j)<0.35
f(i,j)=0.3f(i,j);
elseif f(i,j)>=0.35 &f(i,j)<=0.65
f(i,j)= 0.105+2.6333(f(i,j)-0.35);
else
f(i,j)=1+0.3*(f(i,j)-1);
end
end
end
课堂测试:
解答课堂测试:
f = zeros(200,200,3);
for i = 1:200
for j = 1:i
f(i,j,1)=255;
end
for m = i:200
f(i,m,2)=255;
end
end
imshow(f)
6月4号+6月11号(数字图像处理-形态学处理)
一、基本形态学运算
(1)概念部分
形态学:通常指生物学中对动植物的形状和结果进行处理的一个分支;
数学形态学:是根据形态学概念发展而来的具有严格数学理论基础的科学,并在图像处理和模式识别领域得到了成功应用。
基本思想是:
用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的
形态学图像处理表现为一种领域运算形式:
一种特殊定义的邻域称之为“结构元素”,在每个像素位置上它与二值图像对应的区域进行特定的逻辑运算,逻辑运算的结果为输出图像的相应像素
形态学运算的效果取决于结构元素的大小,内容以及逻辑运算的性质
用途是:
简化图像数据,保持它们基本的形状特性,并出去不相干的结构
基本运算包括:
二值腐蚀和膨胀,二值开闭运算
二值图像中的基本逻辑操作:与、或、非(补);尽管逻辑操作与集合操作存在一一对应关系,但逻辑操作只是针对二值图像
二值形态学基本运算:膨胀、腐蚀、开和闭
开操作opening:B对A进行的开操作就是先用B对A腐蚀,然后用B对结果进行膨胀;开运算平滑了对象的轮廓,断开了狭窄的连接,去掉了细小的突出部分和噪声
闭操作closing:B对A进行的闭操纵就是先用B对A膨胀,然后用B对结果进行腐蚀;闭运算使物体的轮廓线变得光滑, 将狭窄的缺口连接起来,并填充比结构元素小的洞口
开操作的作用:
使轮廓平滑,抑制A物体边界的小的离散点或尖峰,用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不改变其面积
闭操作的作用:
用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积
函数Strel用来构造各种形状和大小的结构元素 Se = strel(shape, parameters)
Se = strel(‘diamond’, R)创建一个平坦的菱形结构元素,其中R是从结构元素原点到菱形的最远点距离
Se = strel(‘diamond’,5)
Se = strel(‘disk’,R)创建一个平坦的圆盘形结构的元素,其中半径是R
Se = strel(‘disk’, 5)
Se = strel(‘line’,LEN,DEG)创建一个平坦的线性元素,其中LEN表示长度,DEG表示线的角度
Se = strel(‘line’,9,0)
(2)实验代码部分
%练习:创建图像并进行膨胀操作
bw = zeros(9,9);
bw(3:5, 4:6)=1;%置白
se = strel(‘square’,3)%矩形结构元素
bw2 = imdilate(bw,se)%进行膨胀操作
subplot(1,2,1),imshow(bw);
subplot(1,2,2),imshow(bw2);
%练习:对二值图像进行膨胀
bw = imread(‘text.png’);%读入图像
se = strel(‘line’,11,90);%线性结构元素
bw2 = imdilate(bw, se);
subplot(1,2,1),imshow(bw);
subplot(1,2,2),imshow(bw2)
%练习:对灰度图像进行膨胀
bw = imread(‘cameraman.tif’);
se = strel(‘ball’,5,5);%球形结构元素
bw2 = imdilate(bw,se);
subplot(1,2,1),imshow(bw);
subplot(1,2,2),imshow(bw2);
%练习:对灰度图像进行腐蚀
bw = imread(‘circles.png’);
se = strel(‘disk’,11)%盘型结构元素
bw2 = imerode(bw,se);
subplot(1,2,1),imshow(bw);
subplot(1,2,2),imshow(bw2);
%练习:对图像进行腐蚀和膨胀操作
se = strel(‘rectangle’,[40,30])%矩形结构元素
bw = imread(‘circbw.tif’);
bw1 = imerode(bw,se);
bw2 = imdilate(bw1,se);
subplot(1,3,1),imshow(bw);
subplot(1,3,2),imshow(bw1);
subplot(1,3,3),imshow(bw2);
%练习:对图像进行开运算(先腐蚀再膨胀)
I = imread(‘snowflakes.png’)%读入图像
se = strel(‘disk’,5);%盘型结构元素
I1 = imopen(I,se);
subplot(1,2,1),imshow(I);
subplot(1,2,2),imshow(I1,[]);
%练习:对图像进行闭运算(先膨胀再腐蚀)
I = imread(‘circles.png’)%读入图像
se = strel(‘disk’,10);%盘型结构元素
I1 = imclose(I,se);
subplot(1,2,1),imshow(I);
subplot(1,2,2),imshow(I1,[]);
二、组合形态学运算
(1)图像的边界测定
对于灰度图像可以通过形态学的膨胀和腐蚀来获取图像的边缘;利用形态学获取灰度图像边缘的优点是对边缘的方向性依赖比较小;
%练习:通过膨胀和腐蚀获取灰度图像的边缘
I = imread(‘rice.png’);
se = strel(‘disk’,2)%结构元素
J = imdilate(I,se)%膨胀
K = imerode(I,se);%腐蚀
L = J - K;%相减
subplot(1,2,1),imshow(I);
subplot(1,2,2),imshow(L);
(2)二值图像的形态学操作
通过函数bwmorph()可以进行二值图像的大量形态学操作,例如图像的骨骼化、图像的细化,以及开操作和闭操作等;
语法格式:
(1)BW2 = bwmorph(BW,operation) 对二值图像进行指定的形态学处理(2)BW2 = bwmorph(BW,operation,n) 对二值图像进行n次指定的形态学处理
operation 可以为以下值:
(1)‘bothat’:进行"bottom hat"形态学运算,即返回闭运算减去源图像的图像;
(2)‘branchpoints’:找到骨架中的分支点;
(3)‘bridge’:进行像素连接操作(连接由单个像素缝隙分隔的像素);
(4)‘clean’:去除图像中孤立的亮点,比如,一个像素点,像素值为1,其周围像素的像素值全为0,则这个孤立的亮点将被去除;
(5)‘close’:进行形态学闭运算(即先膨胀后腐蚀);
(6)‘diag’:采用对角线填充,去除八邻域的背景;
(7)‘dilate’:使用结构元素*ones(3)对图像进行膨胀运算;
(8)‘endpoints’:找到骨架中的结束点;
(9)‘erode’:使用结构元素ones(3)对图像进行腐蚀运算;
(10)‘fill’:填充孤立的黑点,比如33的矩阵,除了中间元素为0外,其余元素全部为1,则这个0将被填充为1;
(11)‘hbreak’:断开图像中的H型连接;
(12)‘majority’:如果一个像素的8邻域中有等于或超过5个像素点的像素值为1,则将该点像素值置1;
(13)‘open’:进行形态学开运算(即先腐蚀后膨胀);
(14)‘remove’:如果一个像素点的4邻域都为1,则该像素点将被置0;该选项将导致边界像素点上的1被保留下来;
(15)‘skef’:在这里n = Inf,骨架提取但保持图像中物体不发生断裂;
(16)‘spur’:去除小的分支,或引用电学术语“毛刺”;
(17)‘thicken’:在这里**n = Inf,**通过在边界上添加像素达到加粗物体轮廓的目的;
(18)‘thin’:在这里n=Inf,进行细化操作;
%练习:二值图像的细化
I = imread(‘text.png’);
J = bwmorph(I,‘thin’,Inf);%细化
subplot(1,2,1),imshow(I);
subplot(1,2,2),imshow(J);
%二值图像的骨架化
I = imread(‘circbw.tif’);%读入图像
J = bwmorph(I,‘skel’,Inf);%骨架化
subplot(1,2,1),imshow(I);
subplot(1,2,2),imshow(J);
%移除二值图像的内部像素点
I = imread(‘circles.png’);
J = bwmorph(I,‘remove’);
subplot(1,2,1),imshow(I);
subplot(1,2,2),imshow(J);
如果某个像素点的4个邻域都为1,则该像素值设置为0,只剩下图像的边界像素点;
%练习:
I = imread(‘x.jpg’);
se = strel(‘square’,3);
J = imdilate(I,se);
J1 = imerode(I,se);
L = J -J1;
[m,n] = size(L);
L1 = zeros(m,n,3);
for i = 1:m
for j = 1:n
if L(i,j)>0
L1(i,j,1)=255;
end
end
end
subplot(1,3,1),imshow(I);
subplot(1,3,2),imshow(L);
subplot(1,3,3),imshow(L1);