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为输出点的灰度值,
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*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
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)
对象的中轴:以该对象为圆心的某个圆和边界至少有两个相切的点的连线。