Matlab数字图像处理技术
一、数字图像处理基础
1、图形和图像的区别
图形(矢量图):以几何数学为基础,图形由点、线、圆等图元组成,图形文件仅记录点的坐标和绘图命令。
图像(点阵图):用像素来描述的图,图像文件中记录每个像素的颜色和亮度。
2、四邻域和八邻域:
4-邻域:设像素p(x,y),它有4个水平和垂直相邻的像素:(x-1,y)(x+1,y)
(x,y-1)(x,y+1),这4个点组成p的4-邻域。
对角邻域:像素p(x,y)的4个对角临近像素:(x-1,y-1)(x+1,y-1)
(x-1,y+1)(x+1,y+1),这4个点组成p的对角邻域。
8-邻域:像素p的4-邻域和对角邻域合起来组成p的8-邻域。
3、彩色模型
(1)RGB模型
8种颜色配比(归一化):
(2)HIS模型:H(色度),S(饱和度),(I)亮度。
(3)二值模型:0—黑色,1—白色。
(4)灰度模型:白—黑有256个灰度级来显示图像,0—黑色,255—白色。
(5)几种图像的颜色数:
二值图像:2种像素值
灰度图像:256种灰度级
彩色图像:256 * 256 * 256 = 2^24种
索引彩色:
4、图像处理中常用的输入设备:数码相机、数码摄像机、扫描仪;
图像处理中常用的输出设备:显示器、打印机、绘图仪。
5、图像的存储:
空间分辨率:M * N 幅度分辨率:G = 2^K
存储一幅图像所需位数(bit):b = M * N * K。
二、图像的基本运算
1、图像点运算
F为输入点的灰度值,G为输出点的灰度值,
- b = 0时,a>1,图像对比度增大;0<a<1,图像对比度减小。
- a = 1时,b>0,灰度值上移,亮度增加;b<0,灰度值下移,亮度降低。
- a = 1,b = 255,图像反相。
Matlab中图像线性变换:
Y = imlincomb(a,x,b); %Y=a*X+b
2、图像的加法运算
C(x,y) = A(x,y) + B(x,y)
图像的叠加方法:
g(x,y) = a*f(x,y)+ b*h(x,y); a+b = 1
matlab中:
A = imread(‘第一幅图’);
B = imread(‘第二幅图’);
C = 0.5*A + 0.5*B;
Imshow(c);
3、减法运算
主要检测同一场景两幅图像之间的变化
G(x,y) = T2(x,y)- T1(x,y)
Matlab中:
A = imread(‘第一幅图’);
B = imread(‘第二幅图’);
C = A - B;
Imshow(c);
4、乘法运算
用二值图像与原图像做乘法,得到需要的子图像。
Z = X .* Y; 要求X和Y的大小、数组元素相同。
Matlab中:
X = imread(‘被点乘的图像’);
Y = zeros(M,N);
Y (70:120, 120:380) = 1;
X = im2double(X);
Z = X.*Y;
Imshow(Z);
5、图像几何运算
(1)图像的镜像:
B = fliplr(A);水平镜像
B = flipud(A);垂直镜像
(2)图像的平移:
A = imread(‘tree.bmp’);
[M N] = size(A);
B = zeros(M, N, class(A));
tx = 100, ty = 50;
B(1+ty:M, 1+tx:N) = A(1:M-ty, 1:N-tx);
imshow(B);
(3)图像的旋转
B = imrotate(A, 60, ‘bilinear’, ‘crop’);截去局部
(4)图像的缩放
B = imresize(A, m);
(5)图像的转置
B = A’
三、图像的变换
1、傅里叶变换
傅里叶变换将图像从空域变换到频域;
傅里叶逆变换将图像从频域变换到空域。
2、一维傅里叶变换(会计算)
逆变换:
Matlab中一维傅里叶变换: Y = fft(X),省略系数1/N
3、二维傅里叶变换(会编程)
Y = fft2(X)
Matlab代码:
A = zeros(300,300);
A (100:200, 100:200) = 1;
B = fft2(A);
C = abs(B);
D = fftshift(C);
D1 = unint8(D);
Imshow(D1);
4、傅里叶变换的性质
(1)平移不变性:在空域图像平移时,在频域中频谱不变
(2)旋转一致性:空域中图像旋转a角度,在频域中同样也旋转a角度
5、离散余弦变换
Y = dct2(X) 二维离散余弦变换
A = imread(‘lenna.bmp’);
A1 = im2double(A);
B = dct2(A1);
C = abs(B);
Imshow(unint8(c));
四、图像增强
1、图像灰度映射
(1)点运算:见二.1节
(2)灰度拉伸
将原始图像的灰度区间分成多段,分别作线性变换,即分段线性变换。
Y = imadjust(X, [a,b], [a’,b’]) *注意要归一化
代码:
A = imread(’ballet.bmp’);
B = imadjust(A, [0, 0.2], [0, 0.8]);
imshow(B);
2、直方图的均衡化
直方图:表达一幅图像灰度级数分布情况的统计图。
横坐标:灰度值fk,一般取0~255;
纵坐标:1、某一灰度值fk的像素个数nk;
2、灰度值fk出现的概率nk/n,n是像素的总个数。
*手工计算直方图均衡化步骤:
(1)给出所有灰度级fk(k=0,…,L-1)的所有概率值;
(2)求出所有累积分布函数gk:
(3)对gk四舍五入取整:gk=(int)[(L-1)gk+0.5]
(4)确定对应关系:fk à gk
(5)计算新的概率值: Pf’
*编程实现直方图均衡化
Y = histeq(X)
imhist(X) 显示X的直方图
代码:
A = imread(‘pout.tif’);
B = histeq(A);
Imshow(B);
3、空域滤波
定义:在图像空间借助模板进行邻域操作,这一图像处理过程被称为空域滤波,模板被称为空域滤波器。
模板的定义:就是一个系数矩阵,经常是奇数。
*运算过程:就是用一个3*3的模板在图像上顺序滑动的过程。
-
-
- 设模版系数为3:
- 设图像的某子图像的灰度值为:
- 计算后像素点s5的灰度值为:R = k1s1+k2s2+...+k9s9
- 设模版系数为3:
-
空域滤波的分类
- 平滑:消除噪声
- 锐化:加强图像的边缘和轮廓。
- 均值滤波
- 目的:可去除图像的噪声,从而起到图像平滑的作用,但图像会模糊。
- 原理:利用模板,将一个像素及其邻域中的所有像素的灰度平均值赋给输出图像中相应的像素,从而达到平滑的目的。
- 模板的设计规则:
模板的大小:3*3,5*5,……
模板的系数:全为1
3*3的模板:
模板尺寸越大,图像越模糊,图像细节丢失越多
d) 给图像增加噪声
给图像增加椒盐噪声:
B = imnoise(A, ’saly & pepper’, d), d为噪声密度,缺省值0.05
给图像增加高斯白噪声:
B = imnoise(A, ‘gaussian’ , m, v); m为白色密度,默认0,v是噪声密度,默认0.01
e) matlab编程实现
A = imread(‘face_1.bmp’);
h1 = ones(3,3)/9;
B1 = imfilter(A, h1);
imshow(B1);
(2)中值滤波
a)中值滤波的过程
I. 用一个模板窗口在图像上滑动;
II.把窗口中像素的灰度值按升序或者降序排列;
III.将中间值赋给窗口中心的元素
b)优点:1、抑制噪声2、较好的保护了边缘轮廓信息,减少模糊
c)matlab编程实现
A = imread(‘face_1.bmp’);
B1 = mefilter2(A, [3,3]);
imshow(B1);
(3)锐化滤波
用模板代替微分
matlab编程实现
A = imread(‘bot.bmp’);
h1 = [1 2 1;0 0 0; -1 -2 -1];
B1 = imfilter(A,h1);
imshow(B1);
4、频域滤波
原理:图像变化平缓的部分靠近频域的圆心,这个区域为低频区域。
图像中边缘、噪音、变化陡峭的部分,以放射方向离开频域的圆心,这个区域为高频区域。
低通滤波:
(1)步骤:
a.对于给定的图像f(x,y),计算出它的傅立叶变换F(u,v)
b.选择一个低通滤波器H(u,v)
c.在频域内经行低通滤波
G(U, V) = F(U,V) H(U,V)
d.通过傅立叶的逆变换得到最终图像
g(x, y)= F-1[G(u, v)]
(2)滤波器的选择
Butterworth滤波器
n为阶数,D0为截止频率到原点(u0, v0)的距离,D(u, v)为到原 点(u0, v0)的距离。
(3)mybuffer_m:
f = imread(‘一幅图’);
f = im2double(f);
F = fftshift(fft2(f));
[M N] = size(F);
n = 3; D0 = 40;
u0 = floor(M/2); v0 = floor(N/2);
for u = 1:M
for v = 1:N
D = sqrt((u-u0)^2+(v-v0)^2);
H = 1/(1+(D/D0)^(2*n));
G(u,v) = H * F(u, v);
end
end
g = ifft2(ifftshift(G));
g = im2unint8(real(g));
imshow(g);
5、彩色增强
目的:1、将灰度图像转换成彩色图像;
2、将真彩色图像进行处理,再得到新的真彩色图像。
彩色图像增强的方法:
(1)伪彩色增强技术:将一幅灰度图转换成一幅彩色图像。
密度分割法:将一幅图像的灰度值分割成多个区间,每个区间赋予一种颜色
- 热金属编码
[1~63] 蓝色[0,0,255]
[64~127] 紫色[200,0,200]
[128~191] 橘黄色[255,150,0]
[192~254] 黄色[255,255,0]
- 彩虹编码
【0~63】 蓝色【0,0,255】
【64~127】 绿色【0,255,255】
【128~191】 红色【255,0,0】
【192~254】 品红色【255,0,255】
热金属编码代码:
X = imread(‘cat.bmp’);
Y = X/64; [M N] = size(Y);
for i= 1:M
for j = 1:N
switch y(i, j)
case 0
Y1(I,j,1:3) = [0,0,255];
case 1
Y1(i,j,1:3) = [200,0,200];
case 2
Y1(i,j,1:3) =[255,150,0];
case 3
Y1(i,j,1:3) = [255,255,0];
otherwise
Y1(i,j,1:3)=[255,255,255]
end
end
end
imshow(Y1)
(2)假彩色增强技术:将三幅灰度图像合成一幅彩色图像。
原理:1、将一幅灰度图送入R,G,B三个变换器;
2、在三个变换器中对同一灰度实施不同变化,使三个变换器输出不同;
3、将R,G,B三个变换器的不同输出合成某一种彩色图像。
变换器算法线性方程
代码:
f=imread(‘rice.bmp’);
[M N]=size(f); L=255;
f=double(f);
f1=floor(f/64);
R=f1; G=f1; B=f1;
for i=1:M
for j = 1:N
switch f1(i,j)
case 0
R(i,j)=0;G(i,j)=4*f(i,j);B(i,j)=L;
case 1
R(i,j)=0;G(i,j)=L;B(i,j)=-4f(i,j)+2L;
case 2
R(i,j)=4*f(i,j)-2*L;G(i,j)=L;B(i,j)=0;
case 3
R(i,j)=L; G(i,j)=-4f(i,j)+4L;B(i,j)=0;
end
end
end
g(:,:,1)=R; g(:,:,2)=G; g(:,:,3)=B;
g=uint8(g);
imshow(g);
(3)真彩色增强技术:将一幅真彩色图像转换为一幅新的真彩色图像。
原理:1、先将一幅真彩色图像的R,G,B分量分开;
A = imread(‘flowers.tif’);
B = A(:,:,1);
B(:,:,2:3) = 0;
imshow(B); %取出红色
2、再针对各分量分别进行增强处理;
3、将增强后的R,G,B分量重新合并为新的真彩色图像。
五、图像压缩编码
1、图像的冗余和压缩
冗余的分类
(1)像素冗余
压缩方法:行程编码,是无损的,可逆的。
例子 0……0 2……2 1……1 4……4 0……0
15个0 11个2 30个1 70个4 18个0
行程编码压缩为:15{0}11{2}30{1}70{4}18{0}
对于有大面积色块的图像效果很好。
(2)编码冗余
如果一个图像的灰度级编码,使用了多于实际需要的编码符号,就称该图像包含了编码冗余。
压缩方法:哈夫曼编码,是无损的,可逆的。
(3)视觉心理冗余
一些信息在一般视觉处理中比其他信息的相对重要程度要小,这种信息就被称作视觉心理冗余。
去除视觉心理冗余会导致定量信息的损失,是有损压缩,是不可逆的操作。
2、图像编码、解码的过程
原始图像à压缩编码器à编码结果à存储/传输à压缩解码器à解码图像
解码图像与原始图像可能相同(无损压缩),也可能不相同(有损压缩)。
(1)压缩编码器模型(3个独立操作)
输入原始图像à映射器à量化器à符号编码器à生成编码
映射器:减少像素冗余,如使用行程编码;
量化器:减少视觉心理冗余,仅用于有损压缩;
符号编码器:减少编码冗余,如使用哈夫曼编码。
(2)压缩解码器(2个独立操作)
输入编码à反符号解码器à反符号映射器à输出解码图像
3、行程编码
aaaa(4个)bbb(3个) cc(2个) d(1个) eeeee(5个) fffffff(7个)
压缩后:4a3b2c1d 5e7f,共6*(3+8)= 66bits
应该这么看待(4a)(3b)(2c)(1d)(5e)(7f)共6个
如4a,a是char类型,占一个字节,8位,然后观察前面的数字,4,3,2,1,5,7,最大为7,因此只需要3个二进制位就可以表示他们了。
4、哈夫曼编码
一种改变字长的编码方法,通过减少编码冗余来达到压缩目的。
基本原理:将在图像中频度较大的像素值给一个比较短的编码,将出现频度小的像素值给一个比较长的编码。
编码结果:
(1)统计符号出现的频率
(2)最终建立一个频率统计表
——将频率最大的符号用最短的编码
——最少出现的符号用最长的编码
*哈夫曼编码的步骤:
第一步:缩减信号源符号数量
I、对信号源符号按照出现频率从大到小排序;
II、将频率最小的两个符号的频率相加,合成一个新频率;
III、将这个新频率和其余频率按照从大到小的顺序排序;
IV、重复上述2、3步骤,直到最后只剩下两个符号的频率为止。
若有N个符号,则缩减次数为N-2
第二步:对每个信源符号编码
I、从最少的信源符号开始、逐步赋值回到起始信源符号。
II、每一步有两个分支,各赋予一个二进制码,如对频率大的赋0,对频率小的赋1。
*计算结果可以不同,但是位数一定是一致的
5、混合编码:行程编码和哈夫曼编码结合(会计算占用空间)
六、图像分割
1、分类
相似性——区域内部的像素一般具有灰度相似性。(基于区域的阈值分割法)
不连续性——区域之间的边界处具有灰度不连续性(基于边界的边缘检测法)
2、边缘检测
一阶导数:检测边的存在;
对于由明到暗的边,有一个向下的阶跃;对于由暗到明,结论相反。
一阶交叉差分:
(1)Roberts算子(2*2模板)
MATLAB中用Roberts算子作边缘检测
Y = edge(X, ‘roberts’);
Y = edge(X, ‘roberts’,thresh,direction);
thresh:为指定的阈值,
direction:为边缘检测方向,取值有‘horizontal’,‘vertical’,‘both’(缺省)
myroberts.m
A = imread(‘kelan.bmp’);
h1 = [1 0;0 -1];
B1 = imfilter(A, h1);
h2 = [0 1;-1 0];
B2 = imfilter(A, h2);
B3 = B1 + B2;
imshow(B3);
(2)Sobel算子(3*3模板)
MATLAB中用Sobel算子作边缘检测
Y = edge(X, ‘Sobel’);
Y = edge(X, ‘Sobel’,thresh,direction);
thresh:为指定的阈值,
direction:为边缘检测方向,取值有‘horizontal’,‘vertical’,‘both’(缺省)
二阶导数
特点:二阶微分导数在暗的一边是正的,在明的一边是负的,边缘位于过零点。
(3)Laplacian算子(3*3模板)
4-邻域 8-邻域
应用:检测一个像素是在边的亮的一边还是暗的一边。
缺点:边缘受噪声影响较大,不太连续,会产生双边效果。
MATLAB中用Laplacian算子作边缘检测
Y = edge(X, ‘log’);
Y = edge(X, ‘log’,thresh,sigma);
thresh:为指定的阈值,
sigma:为滤波器的标准偏差,缺省为2
mylap.m
A = imread(‘kelan.bmp’);
h1 = [0 -1 0; -1 4 -1; 0 -1 0];
B = imfilter(A,h1);
imshow(B);
- 阈值分割
(1)思想:
先确定一个阈值,当一个像素的灰度值超过这个阈值,我们就说这个像素属于我们感兴趣的目标对象,反之则属于背景部分。
(2)借助直方图选取阈值的方法
- 交互方式的阈值分割
Y = im2bw(X, lever);
将灰度图像X作阈值分割,lever为阈值,取值在[0 1]范围内。
- 极小点阈值分割
取图像灰度范围(0,255)的中值(128)作为初始阈值T0,按下面的公式迭代计算,直至前后两次循环得到阈值Ti+1和Ti相差非常小,循环过程停止。最后一个T i+1就是阈值。
hk是灰度为K的像素的个数。
mythre.m
A = imread(‘three.bmp’);
h = imhist(A);
t = []; t(1) = 128; MAX = 500;
for i = 1:MAX
s1 = 0; s2 = 0; s3 = 0; s4 = 0;
for k = 1:t(i)
s1 = s1 + h(k)*k; s2 = s2+h(k);
end
for k =t(i)+1:256
s3 = s3+h(k)*k; s4 = s4+h(k);
end
t(i+1)=floor((s1/s2 + s3/s4) / 2);
if (abs(t(i+1)-t(i)) < 10^-7) break;
end
end
tt = t(i+1);
B = A;
B(find(B<tt)) = 0;
B(find(B>=tt)) = 255;
imshow(B);
- 最优阈值分割
- 迭代阈值分割
4、区域生长
将具有相似性质的像素结合起来构成区域
方法:
从一个种子点出发,按照某种规则来检查周围邻域的像素点,如果具有和种子点相似的性质,就合并到种子区域中。
步骤:
1)在点族中选择一个种子
2)给定一个条件(灰度差的绝对值T)
3)以该种子为中心检查它的邻域像素,若灰度差<=T,就将它们合并。
MATLAB中的区域生长
Y = bwfill(X, r, c, n);
将二值图像X作区域填充(填为白色),(r, c)为种子坐标;n为邻域
Y = bwfill(X, n);
将二值图像X作区域填充(填为白色);n为邻域;种子用鼠标选择。
A = imread(‘draw.bmp’);
imshow(A);
[M N] = size(A);
r = floor(M/2);
c = floor(N/2);
B = bwfill(A, r, c, 8);
imshow(B);
七、目标的表达和扫描技术
一、
1、基本概念:
把图像分割后,为了进一步的处理,对感兴趣的目标要进行形象化的表达和描述。
2、形象化表达的分类:
(1)、根据区域内部的内部表达;(关注的是区域内部的灰度、颜色、文理等特性)
(2)、根据区域轮廓像素的外部表达。(关注的是区域轮廓的形状特性)
二、轮廓的链码表达
1、定义:(1)链码是一种边界(轮廓点)的编码表示方式;
(2)用具有特定长度和方向相连的直线段来表示目标的轮廓
4-链码和8-链码
2、链码的问题
(1)对于简单的轮廓这样的链码相当长。
改进:用较大的网格对原轮廓重新采样。
(2)对同一个轮廓,由于起点不同,产生的链码也是不同
改进:起点归一化
将链码一个方向循环所构成的自然数的值最小。
(3)对同一个目标的轮廓,如果目标平移,链码不变,但目标旋转,链码会改变。
改进:旋转归一化
利用链码的一阶差分代替原链码本身。
3、链码的实用化
形状数的定义:最小差分码
形状数的意义:在网格数相同的条件下,形状数可以满足同一个目标的轮廓的旋转归一化和起点归一化。
4、形状数序号
形状数序号的定义:形状数中阿拉伯数字的个数。(对于封闭的边界,序号一定是偶数)
三、轮廓线段的近似表达
用最少的多边形线段,获取边界形状的本质。
(1)最小周长多边形法:
将原目标轮廓看成是有弹性的线,将组成轮廓的像素序列的内外边看成一堵墙。若把线拉紧,则可以得到目标的最小周长多边形。
(2)聚合逼近多边形法
(3)分类逼近多边形法
四、目标的层次表达
四叉树表达法:
每次将图像一分为四,所有节点分为三类
——目标节点,白色表示
——背景节点,黑色表示
——混合节点,浅色表示
对于一个n级四叉树,其节点共个数为:
五、目标的骨架表达
设区域R的边缘为B,对于R内的任一点P,在B中搜索距离它最近的点,如果对于点P可以可以找到多余一个这样的点(如P1和P2),就可以认定P属于R的中线或骨架。
中轴变换方法(MAT)
对象的中轴:以该对象为圆心的某个圆和边界至少有两个相切的点的连线。