文章目录

  • 1. 数字图像处理与识别
    • 1.1数字图像
    • 1.2 数字图像处理与识别
    • 1.3 数字图像处理的预备知识
    • 1.4 基本的图像操作
  • 2. MATLAB基础
    • 2.1 常用命令
    • 2.2 矩阵
    • 2.3 细胞数组和结构体
    • 2.4 Matlab图像类型
    • 2.5 图像操作
  • 3. 图像的点运算
    • 3.1 灰度直方图
    • 3.2 灰度的线性变换
    • 3.3 灰度的对数变换
    • 3.4 伽玛变换
    • 3.5 灰度阈值变换
    • 3.6 分段线性变换
    • 3.7 直方图均衡化
    • 3.8 直方图规定化
  • 4. 图像的几何运算
    • 4.1 图像平移
    • 4.2 图像镜像
    • 4.3 图像转置
    • 4.4 图像缩放
    • 4.5 图像旋转
    • 4.6 插值算法
      • 4.6.1 最近邻插值
      • 4.6.2 双线性插值
      • 4.6.3 高阶插值
      • Matlab综合案例——人脸图像配准
  • 5. 空域图像增强
    • 5.1 空间域滤波
      • 5.1.1 邻域处理
      • 5.1.2 边界处理
      • 5.1.3 相关和卷积
      • 5.1.4 滤波的MATLAB实现
    • 5.2 图像平滑
      • 5.2.1 平均模板
      • 5.2.2 高斯平滑
      • 5.2.3 自适应平滑滤波
    • 5.3 中值滤波
    • 5.4 图像锐化
      • 5.4.1 基于一阶导数的图像增强——梯度算子
        • Robert交叉梯度
        • Sobel梯度
      • 5.4.2 基于二阶微分的图像增强——拉普拉斯算子
      • 5.4.3 基于一阶与二阶导数的锐化算子的比较
      • 5.4.4 高斯-拉普拉斯变换(Laplacian of a Gaussian, LoG)
  • 6. 频域图像增强
    • 6.1 傅里叶变换
    • 6.2 快速傅立叶变换及实现
    • 6.3 频域滤波基础
    • 6.4 频域低通滤波器
    • 6.5 频域高通滤波器
    • 6.6 频域滤波器与空域滤波器之间的内在联系
    • Matlab综合案例 —— 利用频域滤波消除周期噪声
      • 频域带阻滤波器
      • 带阻滤波消除周期噪声
  • 7. 小波变换
    • 7.1 多分辨率分析
      • 7.1.1 多分辨率框架
      • 7.1.2
      • 7.1.3 图像处理中分解与重构的实现
    • 7.2 Gabor多分辨率分析
  • 8. 图像复原
    • 8.1 图像复原的一般理论
      • 8.1.1 一般模型
      • 8.1.2 噪声模型
      • 8.1.3 空间滤波复原
      • 8.1.4 线性空间不变退化模型
    • 8.2 使用图像复原技术
  • 9. 彩色图像处理
  • 10. 形态学图像处理
  • 11. 图像分割
    • 11.1 边缘检测
      • 11.1.1 边缘检测概述
        • 11.1.1.1 边缘检测基本步骤
        • 11.1.1.2 边缘检测的分类
      • 11.1.2 常见边缘检测算子
        • 11.1.2.1 梯度算子
        • 11.1.2.2 高斯-拉普拉斯算子
        • 11.1.2.3 Canny 边缘检测算子
  • 12. 特征提取
  • 13. 图像识别初步
  • 14. ANN
  • 15. SVM

1. 数字图像处理与识别

1.1数字图像

根据图像的属性不同,图像分类方法也不同。从获取方式上图像分为拍摄类图像和绘制类图像;从颜色上图像分为彩色图像、灰度图像和黑白图像等;从图像的内容上图像分为人物图像,风景图像等;从功能上又分为流程图、结构图、心电图、电路图、设计图等。
       在数字图像处理领域,将图像分为模拟图像数字图像两种,计算机处理的信号都是数字信号,所以在计算机上处理的图像均为数字图像。根据数字图像在计算机中表示方法不同,分为二进制图像,索引图像(如果颜色较少,则用颜色表表示这几种颜色,图像的像素由颜色表的索引表示,可降低所需存储空间),灰度图像,RGB图像和多帧图像;根据计算机中图像文件格式不同,图像又分为位图和矢量图。可见,图像的属性是多角度的,图像的分类也是多维的。

实质

  • 线性代数和矩阵论的角度,数字图像是由图像信息组成的二维矩阵,矩阵的每个元素代表对应位置上的图像亮度和/或色彩信息。
    表示
  • 由于随机变化和噪声的原因,图像在本质上是统计性的。因而有时将图像函数作为随机过程的实现来观察存在其优越性。这时有关图像信息量和冗余的问题可以用概率分布和相关函数来描述和考虑。例如,如果知道概率分布,可以用熵(Entropy) 来度量图像的信息量,这是信息论中一个重要的思想。
  • 线性系统的角度考虑,图像及其处理也可以表示为用狄拉克冲激公式表达的点展开函数的叠加。在大多数时候,我们都考虑使用线性系统近似的方式对图像进行近似处理以简化算法。虽然实际的图像并不是线性的,图像坐标和图像函数的取值都是有限的和非连续的。

图像的空间分辨率: 通常会称一幅大小为M×N的数字图像的空间分辨率为M×N像素。
       当高分辨率下的图像以低分辨率表示时,在同等的显示或者打印输出条件下,图像的尺寸变小,细节变得不明显;而当将低分辨率下的图像放大时,则会导致图像的细节仍然模糊,只是尺寸变大。这是因为缩小的图像已经丢失了大量的信息,在放大图像时只能通过复制行列的插值方法来确定新增像素的取值。

图像的灰度级分辨率: 灰度级分辨率又叫色阶,是指图像中可分辨的灰度级数目,即前文提到的灰度级数目L。由于灰度级度量的是投射到传感器上光辐射值的强度,所以灰度级分辨率也叫辐射计量分辨率。
      灰度级分辨率逐渐降低,图像中包含的颜色数目变少,图像细节表达受到影响。

1.2 数字图像处理与识别

数字图像处理 (Digital Image Processing)指对图像进行处理,进行各种加工来改善图像的外观,是对图像的修改和增强,是作为一种 预处理,供其他图像分析、识别算法使用。

数字图像分析(Digital Image Analyzing)是指对图像中感兴趣的目标进行检测和测量,以获得客观的信息。将一幅图像转化为另一种非图像的抽象形式,包括图像中某物体与测量者的距离以及目标对象的计数或其尺寸等,以及边缘检测和图像分割、特征提取以及几何测量与计数等。

数字图像识别(Digital Image Recognition)主要研究图像中各目标的性质和相互关系,识别出目标对象的类别,从而理解图像的含义。从图像分析中得到的相关描述(特征)对目标进行归类,输出我们感兴趣的目标类别标号信息(符号)。

计算机图形学(Computer Graphics)。此概念与数字图像分析大致相反,它是一个对由概念或数学表述的物体图像进行处理和显示的过程。

图像处理的典型案例——X光照片的增强
图像识别的典型案例——人脸识别

数字图像处理与识别 基本步骤

  1. 图像的点运算。 改善图像的外观,灰度归一化。如图像拉伸、对比度增强、直方图均衡以及直方图匹配等。
  2. 图像的几何变换。 前期预处理工作必要的一部分,是图像处理中相对固定和程式化的内容。如图像的几何归一化图像校准
  3. 图像增强。 相对简单却最具艺术性的领域之一。根据需要突出 某些信息,同时削弱或去除某些不需要的信息的处理方法。
  4. 小波变换。 图像压缩、边缘和特征检测以及纹理分析。小波变换则基于一些有限宽度的基小波,这些小波不仅在频率上是变化的,而且具有有限的持续时间。
  5. 图像复原。 与图像增强相似,其目的也是改善图像质量。但是图像复原是试图利用退化过程的先验知识使已被退化的图像恢复本来面目。建立在比较严格的数学推导上。
  6. 彩色图像处理。 主要包括对全彩图像的处理,也包括灰度图像的伪彩色化。
  7. 形态学图像处理。 基于物体自然形态的图像处理分析方法。其基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的。图像形态学往往用于边界提取、区域填充、连通分量的提取、凸壳、细化、像素化等图像操作。
  8. 图像分割(Image Division) 将一幅图像分解为若干互不交叠区域的过程。
  9. 特征提取(Feature Extraction) 指的是进一步处理之前得到的图像区域和边缘,得到图像的“非图像”的表示或描述,如数值、向量和符号等,提取出来的这些就是特征。有了这些特征我们就可以通过训练过程教会计算机如何懂得这些特征,从而使计算机具有了识别图像的本领。常用的图像特征有纹理特征形状特征空间关系特征等。
  10. 对象识别(Object Recognition &Identification) 一般是指利用前一步从数字图像中提取出的特征向量进行分类和理解的过程,这涉及计算机技术、模式识别、人工智能等多方面的知识。

经过上述处理步骤,最初的一幅原始的、可能存在干扰和缺损的图像就变成了其他控制算法需要的信息,从而实现了图像理解的最终目的。以上概括了数字图像处理的基本顺序,但不是每个图像处理系统都一定需要进行所有这些步骤。在实际的图像处理系统设计中,我们应当根据实际需要决定采用哪些步骤和模块。

1.3 数字图像处理的预备知识

数字图像是由一组具有一定的空间位置关系的像素组成的,因而具有一些度量和拓扑性质。理解像素间的关系是学习图像处理的必要准备,这主要包括相邻像素、邻接性、连通性、区域、边界的概念,以及今后要用到的一些常见距离度量方法。

  1. 邻接性
    它是一种相似性的度量,用于确定所需判断邻接性的像素之间的相似程度。
  2. 连通性
    像素的连通性(Contiguous):令S代表一幅图像中的像素子集。如果在S中全部像素之间存在一个通路,则可以称2个像素P和Q在S中是连通的。此外,对于S中的任何像素P,S中连通到该像素的像素集叫做S的连通分量。如果S中仅有一个连通分量,则集合S叫做连通集
  3. 区域和边界
    如果R同时是连通集,则称R为一个区域(Region)
    边界(Boundary) 的概念是相对于区域而言的。一个区域的边界(或边缘、轮廓)是区域中所有有一个或多个不在区域R中的邻接像素的像素所组成的集合。而区域的 边缘(Edge) 由具有某些导数值的像素组成,是一个像素及其直接邻域的局部性质,是一个有大小和方向属性的矢量。
    边界和边缘是不同的。边界是和区域有关的全局概念,而边缘表示图像函数的局部性质
  4. 距离度量

    即距离等于r的像素形成以P为圆心的圆。

    即距离等于r的像素形成以P为中心的菱形。

    即距离等于r的像素形成以P为中心的方形。

1.4 基本的图像操作

图像操作按照处理图像的数量分类,可以分为对单幅图像操作(如滤波)和对多幅图像操作(如求和、求差和逻辑运算等);按照参与操作的像素范围的不同,可以分为点运算和邻域运算;而根据操作的数学性质,又可以分为线性操作和非线性操作。

  1. 点运算和邻域运算
    点运算指的是对图像中的每一个像素逐个进行同样的灰度变换运算。设r和s分别是输入图像f(x, y)和输出图像g(x, y)在任一点(x, y)的灰度值,则点运算可以使用下式定义。

    如果将点运算扩展,对图像中每一个小范围(邻域)内的像素进行灰度变换运算,即称为邻域运算或邻域滤波。这可以使用下式定义。
  2. 线性和非线性操作
    对两幅图像的线性组合应用算子与分别应用算子后的图像在进行同样的线性组合所得到的结果相同,即为线性操作。不符合上述定义的算子即为非线性算子,对应的是非线性图像操作。

    滤波中的平均平滑、高斯平滑、梯度锐化等都是线性运算,而中值滤波则是非线性的。

2. MATLAB基础

注释:%
**跨行输入:**方法是在行末使用3个半角圆点
F1 命令打开帮助浏览器
“H1”行: 是M文件中的第一个注释行(即以百分号开始的行),它必须紧跟着函数定义行,中间不能有空行,这一行的百分号前也不能有空白字符或缩进。这一行的内容将在 使用help命令时显示在第一行, 而lookfor命令查找H1行中的指定关键词,并在结果的右侧列显示H1行。
提前分配矩阵内存: 这个技巧与动态内存的使用有关。当分配的动态内存零散无序时,会产生大量内存碎片,进而导致内存分配和回收效率降低。事先分配一块足够大的空间(当然,不是过大)以尽量减少内存碎片的产生。

2.1 常用命令

  1. addpath函数
    addpath函数向path变量中加入指定的目录路径,其原型如下。
    addpath('dir','dir2','dir3' ...'-flag')
    dir、dir2、dir3等为要加入的目录路径,这些变量必须是绝对路径。

  2. genpath函数
    genpath函数生成包含指定目录下所有子目录的路径变量,其原型如下。
    p = genpath('directory');
    参数directory为指定的目录。
    函数返回包含指定目录本身和其全部子目录的数据。

  3. 打开与编辑M文件
    如果需要编辑某个M文件,可以使用open命令和edit命令,它们的调用形式如下。
    open filename
    edit filename
    edit命令只能编辑M文件,而open命令可以使用Windows默认操作打开一系列其他类型的文件。

  4. help命令
    help命令可以用于查看Matlab系统或M文件中内置的在线帮助信息。doc 命令可以用于查看命令或函数的 HTML 帮助,这种帮助信息可以在帮助浏览器窗口中打开。doc命令可提供比help命令更多的信息,还可能包含图片或视频等的多媒体例子,对图像处理工具箱中的函数更是如此。
    help command-name
    doc function-name

  5. lookfor命令
    当忘记命令或函数的完整拼写时,可以使用lookfor命令查找当前目录和自动搜索列表下所有名字中含有所查内容的函数或命令。其调用格式如下。
    lookfor keyword

  6. save函数
    将price、age和number三个变量保存到文件MyData.mat中。save('MyData.mat', 'price', 'age', 'number')

  7. size
    函数可以获得指定数组某一维的大小,可以用来查看图像的高度和宽度以及动态图像的帧数等
    size(A,dim)
    函数ndims可以查看数组的维数。ndims(A)

  8. meshgrid函数
    meshgrid函数用于根据给定的横纵坐标点生成坐标网格,以便计算二元函数的取值,在绘制三维曲面时常常会用到它。
    [X,Y] = meshgrid(x, y)
    X和Y为输出采样点的横坐标矩阵和纵坐标矩阵,X阵和Y阵的元素分别为对应位置点的横坐标和纵坐标。

u = [-10:0.1:10];
v = [-10:0.1:10];
[U,V] = meshgrid(u,v);
H = exp(-(U.^2 + V.^2)./2/3^2);
mesh(u, v, H);



默认情况下,Matlab将变量存储为双精度浮点数(double)

2.2 矩阵



eye(n)生成N 阶单位阵,zeros(n)生成N阶每个元素均为0的方阵。




对于图像矩阵,还有一系列Matlab函数可以进行专门针对图像的像素级操作。如图像叠加imadd,图像相减imsubtract等。



如果函数有返回值,但调用者没有指定接收返回值的变量,系统会使用默认的ans变量存储返回值。如果函数返回多个值,则ans中只保留第一个返回值。

2.3 细胞数组和结构体

  1. 细胞数组
    我们常常会遇到不同维度的返回值同时被一个函数返回的情况。细胞数组是Matlab特有的一种数据结构,它的各个元素可以是不同的数据类型。细胞数组可采用下标访问。相当于python的list。
    定义:


    访问:访问细胞数组{}
    Cell{1} 返回 ans = Harry
    使用圆括号形式的索引可以得到变量的描述
    Cell(3) ans =[2x2 double]
    细胞数组中存储的是建立该对象时所使用的其他对象(矩阵或字符串、数字等)的拷贝,而不是引用或指针,即使其他对象的值被改变,细胞数组中的值也不变

  2. 结构体
    结构体是另一种形式的聚合类型,拥有多个不同类型的字段,通过圆点运算符“.”引用内部字段,字段必须具有独特的名字以便区分。相当于python的字典。


2.4 Matlab图像类型

图像类型要包括亮度图像、RGB图像、索引图像、二值图像和多帧图像。
亮度图像(Intensity Image) 即灰度图像。Matlab 使用二维矩阵存储亮度图像,矩阵中的每个元素直接表示一个像素的亮度(灰度)信息。
RGB图像(RGB Image) 使用3个一组的数据表达每个像素的颜色,即其中的红色、绿色和蓝色分量。在Matlab中,RGB图像被存储在一个m×n×3的三维数组中。对于图像中的每个像素,存储的三个颜色分量合成像素的最终颜色。
索引图像(Indexed Image) 往往包含两个数组:一个图像数据矩阵(Image Matrix)和一个颜色索引表(Colormap)。对应于图像中的每一个像素,图像数据数组都包含一个指向颜色索引表的索引值。

图像中的每个像素都用整数表示,其含义为颜色索引表中对应颜色的索引。
二值图像(Binary Image) 二值图像中,像素的颜色只有两种可能取值:黑或白,0表示黑色,而1表示白色。
多帧图像(Multiframe Image Array) 对于某些应用,可能要处理多幅按时间或视角方式连续排列的图像,称之为多帧图像(所谓“帧”就是影像动画中最小单位的单幅影像画面)。例如:一个拥有5张连续的400像素×300像素的RGB图像的多帧连续片断的存储方式是一个400×300×3×5的矩阵。
cat函数 cat函数可以在指定维度上连接数组,其调用方式如下。CAT(DIM, A, B)。
图像格式转换函数
图像数据类型转换函数

2.5 图像操作

Matlab可以处理以下的图像文件类型:BMP、HDF、JPEG、PCX、TIFF、XWD、ICO、GIF、CUR。可以使用imread和imwrite函数对图像文件进行读写操作,使用imfinfo函数来获得数字图像的相关信息

  1. imread函数
    imread函数可以将指定位置的图像文件读入工作区。对于除索引图像以外的情况。
    A = imread(FILENAME, FMT)
    FMT 参数指定图像文件的格式所对应的标准扩展名,
  2. imwrite函数
    imwrite 将指定的图像数据写入文件中,通过指定不同的保存文件扩展名。
    imwrite(A,FILENAME, FMT);
  3. imfinfo函数
    imfinfo函数可以读取图像文件中的某些属性信息,例如修改日期、大小、格式、高度、宽度、色深、颜色空间、存储方式等。
    imfinfo(FILENAME, FMT);
  4. imshow函数
    imshow 函数用于显示工作区或图像文件中的图像,在显示的同时可控制部分效果,常用的调用形式如下。
    imshow(I, [low high], param1, value1, param2,value2, …)
    可选参数[low high]指定显示灰度图像时的灰度范围,灰度值低于low的像素被显示为黑色,高于high的像素被显示为白色,介于low和high之间的像素被按比例显示为各种等级的灰色。如果将此参数指定为空矩阵[ ],则函数会将图像矩阵中的最小值指定为low,最大值指定为 high,
  5. 多帧显示
load mri%载入Matlab自带的核磁共振图像
imshow(D(:,:,7), map);% 显示多幅中的一幅
% 同一窗口显示
figure, montage(D, map);
% 转化成为电影
figure
mov=immovie(D, map);
%colormap(map);%设定颜色表
movie(mov);%播放电影
  1. 图像的放缩
    输入 zoom on命令即可实现图像的放缩,zoom off可以关闭图像放缩功能。打开图像放缩功能之后,就可以通过简单的鼠标操作观察图像细部了。
  2. 像素值查看工具
    通过输入impixelinfo命令在最后显示的图像窗口的左下角,随鼠标光标的移动显示鼠标指针所指位置处的像素值,还可以通过imdistline命令以交互的方式查看图像中两点之间的距离

3. 图像的点运算

3.1 灰度直方图

灰度直方图描述了一幅图像的灰度级统计信息,主要应用于图像分割和图像灰度变换等处理过程中。
      图像直方图描述图像的各个灰度级的统计特性,它是图像灰度值的函数,统计一幅图像中各个灰度级出现的次数或概率。有一种特殊的直方图叫做归一化直方图,可以直接反映不同灰度级出现的比率

I=imread('coins.png'); %读入原图像
I = im2double(I);%转换数据类型为double
[M,N]=size(I);%计算图像面积
figure(1);%打开新窗口
imshow(I);%显示原图像
title('原图像');
figure(2);%打开新窗口
imhist(I);
[H,x] = imhist(I, 64);%计算64个小区间的灰度直方图
stem(x, (H/M/N), '.');%绘制归一化直方图
title('histogram');


一系列灰度直方图上,可以很直观地看出图像的亮度和对比度特征。实际上,直方图的峰值位置说明了图像总体上的亮暗:如果图像较亮,则直方图的峰值出现在直方图的较右部分;如果图像较暗,则直方图的峰值出现在直方图的较左部分,从而造成暗部细节难以分辨。如果直方图中只有中间某一小段非零值,则这张图像的对比度较低;反之,如果直方图的非零值分布很宽而且比较均匀,则图像的对比度较高。

3.2 灰度的线性变换

% 增加对比度
Fa = 2; Fb = -55;
O = Fa .* I + Fb/255;
figure(3);subplot(2,2,1);
imshow(O);title('Fa = 2 Fb = -55 增加对比度');
figure(4);subplot(2,2,1);
[H,x] = imhist(O, 64);
stem(x, (H/M/N), '.');
title('Fa = 2 Fb = -55 增加对比度');
%减小对比度
Fa = 0.5; Fb = -55;
O = Fa .* I + Fb/255;
figure(3);subplot(2,2,2);imshow(O);
title('Fa = 0.5 Fb = -55 减小对比度');
figure(4);subplot(2,2,2);
[H,x] = imhist(O, 64);
stem(x, (H/M/N), '.');
title('Fa = 0.5 Fb = -55 减小对比度');
%线性增加亮度
Fa = 1; Fb = 55;O = Fa .* I + Fb/255;
figure(3);subplot(2,2,3);
imshow(O);title('Fa = 1 Fb = 55 线性平移增加亮度')
figure(4);subplot(2,2,3);
[H,x] = imhist(O, 64);
stem(x, (H/M/N), '.');title('Fa = 1 Fb = 55 线性平移增加亮度');
% 反相显示
Fa = -1; Fb = 255;
O = Fa .* I + Fb/255;
figure(3);subplot(2,2,4);
imshow(O);title('Fa = -1 Fb = 255 反相显示');
figure(4);subplot(2,2,4);
[H,x] = imhist(O, 64);
stem(x, (H/M/N), '.');title('Fa = -1 Fb = 255 反相显示');


3.3 灰度的对数变换

对数变换的一般表达式:

函数自变量低值时,曲线的斜率很高;自变量高值时,曲线斜率变小。
对数函数曲线可知,这种变换可以增强一幅图像中较暗部分的细节,从而可用来扩展被压缩的高值图像中的较暗像素,因此对数变换被广泛地应用于频谱图像的显示中。一个典型的应用是傅立叶频谱,直接显示频谱时,图像显示设备的动态范围往往不能满足要求,从而丢失了大量的暗部细节。而在使用对数变换之后,图像的动态范围被合理地非线性压缩,从而可以清晰地显示。

I=imread('coins.png');%读取图像
F = fft2(im2double(I));%计算频谱
F = fftshift(F);
F = abs(F);
T= log(F + 1);%对数变换
subplot(1,2,1);imshow(F, []);
title('未经变换的频谱');subplot(1,2,2);
imshow(T, []);title('对数变换后');%显示原图和变换结果

3.4 伽玛变换

伽玛变换又称指数变换或幂次变换,一般表达式如下:

esp为补偿系数;γ则为伽玛系数。与对数变换不同,伽玛变换可以根据γ的不同取值选择性地增强低灰度区域的对比度或是高灰度区域的对比度。
γ的取值决定了输入图像和输出图像之间的灰度映射方式,即决定了是增强低灰度(阴影区域)还是增强高灰度(高亮区域)。

  • γ>1时,图像的高灰度区域对比度得到增强。
  • γ<1时,图像的低灰度区域对比度得到增强。
  • γ=1时,这一灰度变换是线性的,即不改变原图像。

通常需要将0~255的灰度动态范围首先变换到0~1的动态范围,执行伽玛变换后再恢复原动态范围。
J = imadjust(I, [low_in high_in], [low_out,high_out], gamma);
若high_out小于low_out,则输出图像J的亮度将会反转。

I = imread('pout.tif');
%读入原图像% Gamma取0.75
figure(1)
subplot(1,3,1);
imshow(imadjust(I, [ ], [ ], 0.75));
title('Gamma 0.75')
figure(2)
subplot(1,3,1);
imhist(imadjust(I, [ ], [ ], 0.75));
title('Gamma 0.75');
% Gamma取1
figure(1)
subplot(1,3,2);
imshow(imadjust(I, [ ], [ ], 1));
title('Gamma 1');
figure(2)
subplot(1,3,2);
imhist(imadjust(I, [ ], [ ], 1));
title('Gamma 1');
% Gamma取1.5
figure(1)
subplot(1,3,3);
imshow(imadjust(I, [ ], [ ], 1.5));
title('Gamma 1.5');
figure(2)
subplot(1,3,3);
imhist(imadjust(I, [ ], [ ], 1.5));
title('Gamma 1.5');


看出不同伽玛因子给图像的整体明暗程度带来的变化,以及对图像暗部和亮部细节清晰度的影响。当伽玛因子取1的时候,图像没有任何改变。
注意到直方图非零区间位置的变化,以及这些变化给图像带来的影响,由于伽玛变换并不是线性变换,所以它不仅可以改变图像的对比度,还能够增强细节,从而带来整体图像效果的增强和改善。

3.5 灰度阈值变换

可以将一幅灰度图像转换成黑白的二值图像。用户指定一个起到分界线作用的灰度值,如果图像中某像素的灰度值小于该灰度值,则将该像素的灰度值设置为0,否则设置为255。这个起到分界线作用的灰度值称为阈值,灰度的阈值变换也常被称为阈值化或二值化。

可以将图像内容直接划分为我们关心的和不关心的两个部分,从而在复杂背景中直接提取出感兴趣的目标。因此它是图像分割的重要手段之一。
BW = im2bw(I, level)
I为需要二值化的输入图像;level给出了具体的变换阈值。
thresh = graythresh(I)
可以自适应地确定变换所用的“最优”阈值

I = imread('rice.png');
thresh = graythresh(I);
bw1 = im2bw(I, thresh);% 二值化
bw2 = im2bw(I, 130/255);%130为阈值实现二值化,注意要将此阈值转换至[01]区间
subplot(1,3,1);imshow(I);title('原图像');
subplot(1,3,2);imshow(bw1);title('自动选择阈值');
subplot(1,3,3);imshow(bw2);title('阈值130');


单纯的灰度阈值化无法很好地处理灰度变化较为复杂的图像,常常给物体的边缘带来误差,或者给整个画面带来噪点。这要通过其他的图像处理手段予以弥补。

3.6 分段线性变换

分段线性变换有很多种,包括灰度拉伸、灰度窗口变换等。
       分段线性变换函数来增强图像对比度的方法实际是增强原图各部分的反差,即增强输入图像中感兴趣的灰度区域,相对抑制那些不感兴趣的灰度区域。分段线性函数的主要优势在于它的形式可任意合成,而其缺点是需要更多的用户输入。

分段的灰度拉伸可以更加灵活地控制输出灰度直方图的分布,可以有选择地拉伸某段灰度区间以改善输出图像。如果一幅图像灰度集中在较暗的区域而导致图像偏暗,我们可以用灰度拉伸功能来扩展(斜率>1)物体灰度区间以改善图像;同样,如果图像灰度集中在较亮的区域而导致图像偏亮,也可以用灰度拉伸功能来压缩(斜率<1)物体灰度区间以改善图像质量。

3.7 直方图均衡化

直方图均衡化又称为灰度均衡化,是指通过某种灰度映射使输入图像转换为在每一灰度级上都有近似相同的像素点数的输出图像,是一种实用性极高的直方图修正技术。经过均衡化处理后的图像中,像素将占有尽可能多的灰度级并且分布均匀。因此,这样的图像将具有较高的对比度较大的动态范围

[J, T] = histeq(I)
I是原始图像。J是经过直方图均衡化的输出图像。T是变换矩阵。

%都有近似相同的像素点数的输出图像,分布均匀
%图像易受光照、视角、方位、噪声等的影响。
%图像归一化就是将图像转换成唯一的标准形式以抵抗各种变换,
%从而可消除同类图像不同变形体之间的外观差异。
I = imread('pout.tif'); %读入原图像
I = im2double(I);
% 对于对比度变大的图像
I1 = 2 * I - 55/255;
subplot(4,4,1);imshow(I1);
subplot(4,4,2);imhist(I1);
subplot(4,4,3);imshow(histeq(I1));
subplot(4,4,4);imhist(histeq(I1));
%对于对比度变小的图像
I2 = 0.5 * I + 55/255;
subplot(4,4,5);imshow(I2);
subplot(4,4,6);imhist(I2);
subplot(4,4,7);imshow(histeq(I2));
subplot(4,4,8);imhist(histeq(I2));
% 对于线性增加亮度的图像
I3 = I + 55/255;
subplot(4,4,9);imshow(I3);
subplot(4,4,10);imhist(I3);
subplot(4,4,11);imshow(histeq(I3));
subplot(4,4,12);imhist(histeq(I3));
% 对于线性减小亮度的图像
I4 = I - 55/255;
subplot(4,4,13);imshow(I4);
subplot(4,4,14);imhist(I4);
subplot(4,4,15);imshow(histeq(I4));
subplot(4,4,16);imhist(histeq(I4));


将直方图均衡化算法应用于左侧的亮度、对比度不同的各个图像后,得到了右侧直方图大致相同的图像,这体现了直方图均衡化作为强大自适应性的增强工具的作用。原始图像的直方图不同而图像结构性内容相同时,直方图均衡化所得到的结果在视觉上几乎是完全一致的

3.8 直方图规定化

直方图均衡化算法可以自动确定灰度变换函数,主要用于增强动态范围偏小的图像对比度,丰富图像的灰度级。但有时希望可以对变换过程加以控制,如能够人为地修正直方图的形状,或者说是获得具有指定直方图的输出图像。这种用于产生具有特定直方图的图像的方法叫做直方图规定化,或直方图匹配。
[J, T] = histeq(I, hgram)
函数会将原始图像I处理成一幅以用户指定向量hgram作为直方图的图像。

I = imread('pout.tif');%读入原图像
I1 = imread('coins.png');%读入要匹配直方图的图像
I2 = imread('circuit.tif');%读入要匹配直方图的图像
%计算直方图
[hgram1, x] = imhist(I1);
[hgram2, x] = imhist(I2);
%执行直方图均衡化
J1=histeq(I,hgram1);
J2=histeq(I,hgram2);
% 绘图
subplot(2,3,1);imshow(I);title('原图');
subplot(2,3,2);imshow(I1); title('标准图1');
subplot(2,3,3);imshow(I2); title('标准图2');
subplot(2,3,5);imshow(J1); title('规定化到1');
subplot(2,3,6);imshow(J2);title('规定化到2');
%绘直方图
figure;
subplot(2,3,1);imhist(I);title('原图');
subplot(2,3,2);imhist(I1); title('标准图1');
subplot(2,3,3);imhist(I2); title('标准图2');
subplot(2,3,5);imhist(J1); title('规定化到1');
subplot(2,3,6);imhist(J2);title('规定化到2');


4. 图像的几何运算

4.1 图像平移


矩阵表示:

对变换矩阵求逆:

这样,平移后的目标图像中的每一点都可以在原图像中找到对应的点。
对于原图中被移出图像显示区域的点通常也有两种处理方法,可以直接丢弃,也可以通过适当增加目标图像的尺寸(将新生成的图像宽度增加tx,高度增加ty)
B = imtransform(A,TFORM,method);
空间变换结构TFORM指定了具体的变换类型。
可选参数method允许为imtransform函数选择插值方法,默认时为双线性插值 —‘bilinear’。

可以通过两种方法来创建TFORM结构,即使用maketform函数和cp2tform函数。
cp2tform是一个数据拟合函数,它需要原图像与目标图像之间的对应点对作为输入,用于确定基于控制点对的几何变换关系
tform = cp2tform(input_points,base_points, 'affine'); %仿射变换模型
   控制点对坐标input_points和base_points,利用cp2tform函数可以计算变换的参数,它返回一个TFORM结构的几何变换结构,其中就包括了几何变换的类型和参数。

maketform 函数获得TFORM结构的方法。
T=maketform(transformtype, Matrix);

  • 参数transformtype指定了变换的类型,如常见的’affine’为二维或多维仿射变换,包括平移、旋转、比例、拉伸和错切等。
  • Matrix为相应的仿射变换矩阵,例如对于平移变换,该矩阵为
function I_out = imMove(I, tx, ty)
tform = maketform('affine',[1 0 0;0 1 0; tx ty 1]);
I_out = imtransform(I,tform,...'XData',[1 size(I,2)],'YData',[1 size(I,1)]); %图像平移
subplot(1,2,1),imshow(I);title('原图像');
subplot(1,2,2),imshow(I_out);title('平移图像');I_out = imMove(I, 10, 30);

4.2 图像镜像

镜像变换又分为水平镜像竖直镜像
水平镜像:

竖直镜像:

% 镜像变换
A=imread('pout.tif');
[height,width,dim]=size(A);
%定义水平镜像变换矩阵
tform = maketform('affine',[-1 0 0;0 1 0; width 0 1]);
B = imtransform(A,tform,'nearest');
%定义竖直镜像变换矩阵
tform2 = maketform('affine',[1 0 0;0 -1 0; 0 height 1]);
C = imtransform(A,tform2,'nearest');
subplot(1,3,1),imshow(A);title('原图像');
subplot(1,3,2),imshow(B);title('水平镜像');
subplot(1,3,3),imshow(C);title('竖直镜像');

4.3 图像转置

图像转置是将图像像素的x坐标和y坐标互换

%图像转置
A=imread('pout.tif');
tform = maketform('affine',[0 1 0;1 0 0; 0 0 1]);
%定义转置变换矩阵
B = imtransform(A,tform,'nearest');
subplot(1,2,1),imshow(A);title('原图像');
subplot(1,2,2),imshow(B);title('图像转置');

4.4 图像缩放

图像缩放是指图像按照指定的比率放大或者缩小

直接根据缩放公式计算得到的目标图像中,某些映射源坐标可能不是整数,从而找不到对应的像素位置,因此我们必须进行某种近似处理,一种简单的策略是直接将它最邻近的整数坐标位置(0,0)或者(0,1)处的像素灰度值赋给它,这就是所谓的最近邻插值。

%图像缩放
A = imread('pout.tif');
B = imresize(A,1.2,'nearest');
%图像扩大1.2倍
figure,imshow(A);title('原图像');
figure,imshow(B);title('图像缩放');%% 使用imtransform
A = imread('pout.tif');
tform = maketform('affine',[2 0 0;0 2 0; 0 0 1]);
%定义转置变换矩阵
B = imtransform(A,tform,'nearest');
figure,imshow(A);title('原图像');
figure,imshow(B);title('图像缩放');

4.5 图像旋转

旋转一般是指将图像围绕某一指定点旋转一定的角度。旋转通常也会改变图像的大小

B=imrotate(A,angle,method, 'crop');

  • angle 为旋转角度,单位为度,如为其指定一个正值,则 imrotate 函数按逆时针方向旋转图像。
  • 可选参数method为 imrotate函数指定插值方法。
  • crop’选项会裁剪旋转后增大的图像,使得到的图像和原图大小一致。
% 围绕中心点的图像旋转
A=imread('pout.tif');
%最近邻插值法逆旋转30°,并剪切图像
B=imrotate(A,30,'nearest','crop');
B=imrotate(A,30,'bilinear','crop');
B=imrotate(A,30,'bicubic','crop');
figure
subplot(1,2,1),imshow(A);title('原图像');
subplot(1,2,2),imshow(B);title('逆时针旋转30°');
figure
subplot(1,3,1),imshow(B);title('最邻近插值');
subplot(1,3,2),imshow(B);title('双线性插值');
subplot(1,3,3),imshow(B);title('双三次插值');
%%
A = imread('pout.tif');
alpha = 30*pi/180;
tform = maketform('affine',[cos(alpha) -sin(alpha) 0;sin(alpha) cos(alpha) 0; 0 0 1]);
%定义转置变换矩阵
B = imtransform(A,tform,'nearest');
figure,imshow(A);title('原图像');
figure,imshow(B);title('图像缩放');


4.6 插值算法

实现几何运算时,有两种方法。
      第一种称为向前映射法,其原理是将输入图像的灰度一个像素一个像素地转移到输出图像中,即从原图像坐标计算出目标图像坐标:g(x1,y1) = f ( a(x0,y0), b(x0,y0) )。前面的平移、镜像等操作就可以采用这种方法。
      另外一种称为向后映射法,它是向前映射变换的逆,即输出像素一个一个地映射回输入图像中。如果一个输出像素映射到的不是输入图像的采样栅格的整数坐标处的像素点,则其灰度值就需要基于整数坐标的灰度值进行推断,这就是插值。由于向后映射法是逐个像素产生输出图像,不会产生计算浪费问题,所以在缩放、旋转等操作中多采用这种方法,本书中采用的也全部为向后映射法。

4.6.1 最近邻插值

这是一种最简单的插值算法,输出像素的值为输入图像中与其最邻近的采样点的像素值。

4.6.2 双线性插值


首先对上端的两个点进行线性插值,得到

再对下端的两个顶点进行线性插值,得到

最后,对垂直方向进行线性插值,得到

综合得到:

线性插值的假设是原图的灰度在两个像素之间是线性变化的。

4.6.3 高阶插值

双线性插值的平滑作用会使图像的细节退化,而其斜率的不连续性则会导致变换产生不希望的结果。这些都可以通过高阶插值得到弥补,高阶插值常用卷积来实现。输出像素的值为输入图像中距离它最近的4×4领域内采样点像素值的加权平均值。
例子见4.5。

Matlab综合案例——人脸图像配准

图像配准就是将同一场景的两幅或多幅图像进行对准,在很多人脸自动分析系统中的人脸归一化,即要使各张照片中的人脸具有近似的大小,尽量处于相同的位置。

一般来说,我们以基准图像为参照,并通过一些基准点(fiducial points)找到适当的空间变换关系s和t,对输入图像进行相应的几何变换,从而实现它与基准图像在这些基准点位置上的对齐。

MATLAB实现:
1)读入基准图像和要配准的输入图像。

Iin = imread('2.bmp');
Ibase = imread('1.bmp');
figure
subplot(1, 2, 1),imshow(Iin);
subplot(1, 2, 2),imshow(Ibase);


2)标注基准点对,并将其保存至工作空间。
利用 Matlab 提供的cpselect函数可以交互式地选择基准点。在命令行中调用cpselect可以启动该交互工具。可以分别单击两幅图像中的相同部分选择成对儿的基准点

cpselect(Iin, Ibase);


3)指定要使用的变换类型
根据之前得到的控制点对坐标input_points和base_points,利用cp2tform函数可以计算变换的参数。将基准点对作为输入传递给cp2tform,选择一种适当的变换类型,cp2tform函数就能够确定出该类型变换所需的参数。

tform = cp2tform(movingPoints, fixedPoints, 'affine');
tform1 = cp2tform(movingPoints, fixedPoints, 'piecewise linear');
Iout = imtransform(Iin, tform);
Iout1 = imtransform(Iin, tform1);
figure
subplot(1, 3, 1), imshow(Iout);
subplot(1, 3, 2), imshow(Iout1);
subplot(1, 3, 3), imshow(Ibase);

5. 空域图像增强

图像增强是数字图像处理相对简单却最具艺术性的领域之一,增强的目的是消除噪声削弱或去除某些不需要的信息,显现那些被模糊了的细节或简单地突出一幅图像中我们感兴趣的特征
      但增强处理并不能增强原始图像的信息,其结果只能增强对某种信息的辨别能力,而同时这种处理有可能损失一些其他信息,要根据具体期望的处理效果做出取舍。
      图像增强技术基本上可分成两大类:一类是空间域增强,一类是频率域增强。虽然技术上不同,但目的相同。空间域图像增强技术主要包括直方图修正、灰度变换增强、图像平滑化以及图像锐化等,但更多实际情况是需要采用几种方法联合处理;

第3章中通过灰度变换改善图像外观的方法,以及3.7、3.8节中的直方图灰度修正技术(即直方图均衡化和直方图规定化)都是图像增强的有效手段,这些方法的共同点是变换是直接针对像素灰度值的,与该像素所处的邻域无关,而空间域增强则是基于图像中每一个小范围(邻域)内的像素进行灰度变换运算,某个点变换之后的灰度由该点邻域之内的那些点的灰度值共同决定,因此空间域增强也称为邻域运算或邻域滤波。

空间域变换可表示为:

5.1 空间域滤波

5.1.1 邻域处理

滤波是信号处理中的一个概念,是将信号中特定波段频率滤除的操作,在数字信号处理中通常采用傅立叶变换及其逆变换实现。图像滤波实际上和通过傅立叶变换实现的频域下的滤波是等效的,故而也称为滤波。

对图像中的每一点(x,y),重复下面的操作。
(1)对预先定义的以(x,y)为中心的邻域内的像素进行运算。
(2)将(2)中运算的结果作为(x,y)点新的响应。
上述过程就称为邻域处理或空间域滤波。如果对于邻域中的像素计算为线性运算,则又称为线性空间域滤波,否则称为非线性空间域滤波。

5.1.2 边界处理

执行滤波操作 当模板位于图像边缘时,模板的某些元素很可能会位于图像之外的情况,这时需要对于在边缘附近执行滤波操作单独处理,有3种犯法可以用来解决边界问题:
(1)收缩处理范围,使用模板处理时忽略图像 f 四周一圈1个像素宽的边界
(2)使用常数填充图像,例如:0
(3)使用复制像素的方法填充图像,只是用来填充边界像素值的不是固定的常数,而是复制图像f本身边界的模式。

5.1.3 相关和卷积

卷积:

卷积时模板是相对其中心点做镜像后再对f位于模板下的子图像做加权和的,或者说在做加权和之前模板先要以其中心点为原点旋转 180°。只有当模板本身是关于中心点对称时相关和卷积的结果才会相同。

5.1.4 滤波的MATLAB实现

Matlab中与滤波相关的函数主要有imfilter和fspecial。Imfilter完成滤波操作,而fspecial可以为我们创建一些预定义的二维滤波器,直接供imfilter函数使用。

滤波函数imfilter的原型如下。
g = imfilter(f,w,option1,option2,…)

  • f是要进行滤波操作的图像。
  • w是滤波操作所使用的模板,为一个二维数组。
  • option1, option2, … 是可选项,具体可以包括以下选项。
    • 边界选项

      采用第一种方式固定值填充虚拟边界的问题是在边缘附近会产生梯度,采用后面三种方式填充可让边缘显得平滑。
    • 尺寸选项:由于滤波中填充了边界,有必要指定输出图像g的大小
    • 模式选项:指明滤波过程是相关还是卷积
 f = imread('E:\matlab\matlab_basic\3.jpg');w = [1 1 1; 1 1 1; 1 1 1] / 9;g = imfilter(f, w, 'corr', 'replicate'); %滤波figuresubplot(1,2,1);imshow(f);title('原图') %得到5.2(b)的图像subplot(1,2,2);imshow(g);title('滤波后的图像')


可创建预定义的二维滤波器的fspecial函数的常见调用格式为:
h = fspecial(type,parameters)

  • 参数type指定了滤波器的类型
  • 可选输入parameters是和所选定的滤波器类型type相关的配置参数,如尺寸和标准差等。
  • 返回值h为特定的滤波器。
  • h= fspecial(‘average’,hsize),hsize的默认值为[3 3]。
  • h = fspecial(‘disk’,radius),半径radius的默认值为 5。
  • h = fspecial(‘gaussian’,hsize,sigma),hsize的默认值为[3 3],sigma的默认值为 0.5。
  • h = fspecial(‘sobel’)返回一个加强水平边缘的竖直梯度算子。h= [ 1 2 1 ;0 0 0 ;−1 −2 −1 ]如果需要检测竖直边缘,则使用h’。

5.2 图像平滑

平均平滑滤波器和高斯平滑滤波器都是线性平滑滤波器,在学习频率域滤波之后,还可以为它们赋予另外一个名字——低通滤波器。

5.2.1 平均模板

图像平滑是一种可以减少和抑制图像噪声的实用数字图像处理技术。在空间域中一般可以采用邻域平均来达到平滑的目的。


通过平滑滤波原局部图像中噪声点的灰度值得到了有效修正,像这样将每一个点用周围点的平均替代从而达到减少噪声影响的过程就称为平滑或模糊。

I = imread('E:\matlab\matlab_basic\3.jpg');
figure, subplot(221),imshow(I)
h = fspecial('average', 3); % 3*3平均模板
I3 = imfilter(I, h, 'corr', 'replicate'); %相关滤波,重复填充边界
subplot(222),imshow(I3)
h = fspecial('average', 5); % 5*5平均模板
I5 = imfilter(I, h, 'corr', 'replicate');
subplot(223),imshow(I5);
h = fspecial('average', 7);
I7 = imfilter(I, h, 'corr', 'replicate');
subplot(224),imshow(I7);


随着模板的增大,滤波过程在平滑掉更多的噪声的同时也使得图像变得越来越模糊。

5.2.2 高斯平滑

平均平滑对于邻域内的像素一视同仁,为了减少平滑处理中的模糊,得到更自然的平滑效果,很自然地想到适当加大模板中心点的权重,随着远离中心点,权重迅速减小,从而可以确保中心点看起来更接近于与它距离更近的点,基于这样的考虑得到的模板即为高斯模板。

高斯模板是将连续的二维高斯函数的离散化表示,因此任意大小的高斯模板都可以通过建立一个(2k+1)×(2k+1)的矩阵M得到,其(i,j)位置的元素值可由下式确定。

σ的选择:

  • 如果σ过小,偏离中心的所有像素权重将会非常小,相当于加权和响应基本不考虑邻域像素的作用,这样滤波操作退化为图像的点运算,无法起到平滑噪声的作用;
  • 如果σ过大,而邻域相对较小,这样在邻域内高斯模板将退化为平均模板;
  • Matlab 中σ的默认值为0.5;
  • 在实际应用中,通常对 3×3 的模板取σ为0.8左右,对于更大的模板可以适当增大σ的值。
I = imread('E:\matlab\matlab_basic\6.png');
I = rgb2gray(I);
subplot(2,3,1),imshow(I);
h3_5 = fspecial('gaussian', 3, 0.5);% sigma=0.53*3高斯模板
I3_5 = imfilter(I, h3_5);% 高斯平滑
subplot(2,3,2),imshow(I3_5);
h3_8 = fspecial('gaussian', 3, 0.8); % sigma=0.83*3高斯模板
I3_8 = imfilter(I, h3_8);
subplot(2,3,3),imshow(I3_8);
h3_18 = fspecial('gaussian', 3, 1.8);% sigma=1.83*3高斯模板,接近于平均模板
I3_18 = imfilter(I, h3_18);
subplot(2,3,4),imshow(I3_18);
h5_8 = fspecial('gaussian', 5, 0.8);
I5_8 = imfilter(I, h5_8);
subplot(2,3,5),imshow(I5_8);
h7_12 = fspecial('gaussian', 7, 1.2);
I7_12 = imfilter(I, h7_12);
subplot(2,3,6),imshow(I7_12);


σ偏小而平滑效果不明显;σ增大至1.8时,效果类似于平均平滑效果;随着模板的增大,原图中的噪声得到了更好的抑制。

5.2.3 自适应平滑滤波

利用平均模板的平滑在消除噪声的同时也使图像变得模糊,高斯平滑在一定程度上缓解了这些现象,但由平滑滤波机理可知这种模糊是不可避免的。有选择性地进行平滑,即只在噪声局部区域进行平滑,而在无噪声局部区域不进行平滑,将模糊的影响降到最少,这就是自适应滤波的思想。

如何判断该局部区域是需要平滑的区域还是不需要平滑的区域,这要基于噪声的性质来考虑。
判断噪声的依据:

  • 局部区域最大值与最小值之差大于某一阈值T,即max®–min®>T,其中R代表该局部区域
  • 局部区域方差大于某一阈值T,即D®>T,D®表示区域R中像素的方差。

自适应滤波算法的逻辑:
(1)逐行扫描图像;
(2) 对每一个像素,以该像素作为中心,计算其周围区域R的统计特征,如最大值、最小值和方差等;
(3)如果区域R的特征满足选定的噪声判据
(4)根据选定的模板计算邻域加权和作为该点的响应;
(5)否则,不处理该点。

5.3 中值滤波

中值滤波本质上是一种统计排序滤波器。对于原图像中某点(i,j),中值滤波以该点为中心的邻域内的所有像素的统计排序中值作为(i,j)点的响应。中值滤波的一种典型应用是消除椒盐噪声。

噪声模型
J = imnoise(I,type,parameters);

  • I为原图像
  • 可选参数type指定了噪声类型

    使用imnoise(’gaussian’, m, v)添加高斯噪声时,相当于对原图像中每一个像素叠加一个从均值为m、方差为v的高斯分布产生的随机样本值。当m=0时,较小的方差 v 通常保证了高斯分布有一个较大的概率产生值在0附近的随机样本(高斯分布密度函数f(x)在x=0附近具有最大值),从而在大部分像素位置对原图像影响较小。
I = imread('E:\matlab\matlab_basic\dog.jpg');
I=rgb2gray(I);
subplot(2,3,1);imshow(I);
J=imnoise(I,'salt & pepper');%为图像叠加椒盐噪声
subplot(2,3,2);imshow(J);
w = [1 2 1;2 4 2;1 2 1]/16;
J1=imfilter(J, w, 'corr', 'replicate'); %高斯平滑
subplot(2,3,4);imshow(J1); title('高斯平滑')
w = [1 1 1;1 1 1;1 1 1]/9;
J2=imfilter(J, w, 'corr','replicate');%平均平滑
subplot(2,3,5);imshow(J2); title('平均平滑')
J3=medfilt2(J,[3,3]);%中值滤波
subplot(2,3,6);imshow(J3); title('中值滤波')


改进的中值滤波策略:
      中值滤波效果依赖于滤波窗口的大小,太大会使边缘模糊太小了则去噪效果不好。因为噪声点和边缘点同样是灰度变化较为剧烈的像素,普通中值滤波在改变噪声点灰度值的时候,会一定程度地改变边缘像素灰度值。
      具体的改进方法如下。逐行扫描图像,当处理每一个像素时,**判断该像素是否是滤波窗口所覆盖下邻域像素的极大或者极小值。**如果是,则采用正常的中值滤波处理该像素;如果不是,则不予处理。在实践中这种方法能够非常有效地去除突发噪声点,尤其是椒盐噪声,而几乎不影响边缘。

5.4 图像锐化

图像锐化的目的是使模糊的图像变得更加清晰起来。主要用于增强图像的灰度跳变部分,这一点与图像平滑对灰度跳变的抑制正好相反。线性平滑都是基于对图像邻域的加权求和或者说积分运算的,而锐化则通过其逆运算**导数(梯度)**或者说有限差分来实现。

5.4.1 基于一阶导数的图像增强——梯度算子

对于离散二维离散函数f(i,j),可以用有限差分作为梯度幅值的一个近似。

包括平方和开方,不方便计算,因此可近似为绝对值的形式。

而在实际使用中,经常被采用的是另外一种近似梯度—Robert交叉梯度。

Robert交叉梯度

Robert交叉梯度对应的模板为


w1对接近+45°边缘有较强响应;w2对接近−45°边缘有较强响应。只要分别以w1和w2为模板,对原图像(a)进行滤波就可得到G1和G2,根据下式最终的Robert交叉梯度图像为

I = imread('E:\matlab\matlab_basic\dog.jpg');
I=rgb2gray(I);
subplot(2,2,1);imshow(I);
I = double(I);
w1 = [-1 0; 0 1];
w2 = [0 -1; 1 0];
G1 = imfilter(I, w1, 'corr', 'replicate'); % 以重复方式填充边界
G2 = imfilter(I, w2, 'corr', 'replicate');
G = abs(G1) + abs(G2); % 计算Robert梯度
subplot(2,2,2);imshow(G, []);
subplot(2,2,3);imshow(abs(G1), []);
subplot(2,2,4);imshow(abs(G2), []);

Sobel梯度

由于滤波时我们总是喜欢奇数尺寸的模板,因而一种计算Sobel梯度的Sobel模板更加常用。

对水平边缘有较大响应的竖直梯度

对竖直边缘有较大响应的水平梯度

I = imread('E:\matlab\matlab_basic\dog.jpg');
I=rgb2gray(I);
subplot(2,2,1);imshow(I);
I = double(I);
w1 = fspecial('sobel'); %得到水平sobel模板
w2 = w1' ;%转置得到竖直soble模板
G1 = imfilter(I, w1); %水平Sobel梯度
G2 = imfilter(I, w2); %竖直Sobel梯度
G = abs(G1) + abs(G2); %Sobel梯度
subplot(2,2,2);imshow(G1, []);
subplot(2,2,3);imshow(G2, []);
subplot(2,2,4);imshow(G, []);


直接利用Matlab梯度函数gradient计算Sobel梯度:

 I = imread('E:\matlab\matlab_basic\dog.jpg');I=rgb2gray(I); subplot(2,2,1);imshow(I);I = double(I); % 计算梯度之前要转换为double[Gx,Gy] = gradient(I); % 计算x,y方向梯度G = abs(Gx) + abs(Gy); %计算整体梯度subplot(2,2,2); imshow(G, []); % 整体梯度图像subplot(2,2,3);imshow(Gx, []); % x方向梯度图像(突显偏竖直方向的边缘)
subplot(2,2,4);imshow(Gy, []); % y方向梯度图像(突显偏水平方向的边缘)

5.4.2 基于二阶微分的图像增强——拉普拉斯算子

维函数f(x, y)的二阶微分(拉普拉斯算子)定义为

拉普拉斯算子:

对应的滤波模板如下:

沿用高斯平滑模板的思想,根据到中心点的距离给模板周边的点赋予不同的权重,还可得到如下的模板W5。

I = imread('E:\matlab\matlab_basic\dog.jpg');
I=rgb2gray(I);
subplot(2,2,1);imshow(I);
I1 = double(I);
w1 = [0 -1 0; -1 4 -1; 0 -1 0];
L1 = imfilter(I1, w1, 'corr', 'replicate');
w2 = [-1 -1 -1; -1 8 -1; -1 -1 -1];
L2 = imfilter(I1, w2, 'corr', 'replicate');
w3 = [1 4 1; 4 -20 4; 1 4 1];
L3 = imfilter(I1, w3, 'corr', 'replicate');
subplot(2,2,2);imshow(L1, []);
subplot(2,2,3);imshow(L2, []);
subplot(2,2,4);imshow(L3, []);
figure(2)
subplot(2,2,1);imshow(I);
subplot(2,2,2);imshow(L1+4*I1, []);
subplot(2,2,3);imshow(L2+5*I1, []);
subplot(2,2,4);imshow(L3+6*I1, []);


拉普拉斯锐化效果与之前的Robert与Sobel梯度锐化明显不同的一点是输出图像中的双边缘。此外,我们还注意到拉普拉斯锐化似乎对一些离散点有较强的响应。

5.4.3 基于一阶与二阶导数的锐化算子的比较


孤立噪声点,注意到二阶微分对于噪声点的响应较一阶微分要强很多;
二阶微分的非0响应则只出现在斜坡的起始和终点处,在灰度变化率恒定的斜面上二阶微分值为0,这就是图中的拉普拉斯锐化图像周围出现双边缘的原因。

  • 一阶导数通常会产生较宽的边缘。
  • 二阶导数对于阶跃性边缘中心产生零交叉,而对于屋顶状边缘(细线),二阶导数取极值。
  • 二阶导数对细节有较强的响应,如细线和孤立噪声点。
    对于图像增强而言,基于二阶导数的算子应用更多一些,因为它对于细节响应更强,增强效果也就更明显。
    边缘检测的时候,基于一阶导数的算子则会更多地发挥作用。

5.4.4 高斯-拉普拉斯变换(Laplacian of a Gaussian, LoG)

锐化在增强边缘和细节的同时往往也“增强”了噪声,因此如何区分开噪声和边缘是锐化中要解决的一个核心问题。
      基于二阶微分的拉普拉斯算子对于细节(细线和孤立点)能产生更强的响应,并且各向同性,因此在图像增强中较一阶的梯度算子更受到我们的青睐。然而,它对于噪声点的响应也更强。
      为了在取得更好的锐化效果的同时把噪声的干扰降到最低,可以先对带有噪声的原始图像进行平滑滤波,再进行锐化增强边缘和细节。将在平滑领域工作得更好的高斯平滑算子同锐化界表现突出的拉普拉斯锐化结合起来,得到高斯-拉普拉斯算子(Marr和Hildreth提出)。
LoG函数的三维形状:

I = imread('E:\matlab\matlab_basic\dog.jpg');
I=rgb2gray(I);
subplot(2,2,1);imshow(I);
Id = double(I);
h_lap = [-1 -1 -1; -1 8 -1; -1 -1 -1];
I_lap = imfilter(Id, h_lap, 'corr', 'replicate'); % Laplacian锐化
subplot(2,2,2);imshow(uint8(abs(I_lap)), []); % 取绝对值并将255以上的响应截断
h_log = fspecial('log', 5, 0.5); % 大小为5,sigma=0.5的LoG算子
I_log = imfilter(Id, h_log, 'corr', 'replicate');
subplot(2,2,3);imshow(uint8(abs(I_log)), []);
h_log1 = fspecial('log', 5, 2); % 大小为5,sigma=2的LoG算子
I_log1 = imfilter(Id, h_log, 'corr', 'replicate');
subplot(2,2,4);imshow(uint8(abs(I_log1)), []);figure(2)
subplot(2,2,1);imshow(I);
subplot(2,2,2);imshow(I_lap+Id, []);
subplot(2,2,3);imshow(I_log+2*Id, []);
subplot(2,2,4);imshow(I_log1+3*Id, []);



σ=0.5和σ=2时的LoG增强效果。与第二幅图相比,噪声得到了有效的抑制,且σ越小细节增强效果更好,σ越大则平滑效果越好。

6. 频域图像增强

傅立叶变换提供了一种变换到频率域的手段,由于用傅立叶变换表示的函数特征可以完全通过傅立叶反变换进行重建,不丢失任何信息,因此它可以使我们工作在频率域,而在转换回空间域时不丢失任何信息。

原函数f(x)(左),其傅立叶展开为一系列不同频率的正弦、余弦函数的加权和(右)。
从数学上已经证明了,傅立叶级数的前N项和是原函数f(t)在给定能量下的最佳逼近。
三角形式:

一个方波信号函数采用不同的N值的逼近情况:

有起伏,这就是著名的吉布斯现象。
指数形式:

6.1 傅里叶变换

一维连续傅里叶变换:
对于定义域为整个时间轴(−∞< t <∞)的非周期函数 f(t),此时已无法通过周期拓延将其扩展为周期函数,这种情况下就要用到傅立叶变换。

由F(u)我们还可以通过傅立叶反变换获得f(t):

一维离散傅里叶变换:


在数字图像处理中,我们关心的自然是二维离散函数的傅立叶变换,二维离散傅立叶变换(Discrete FourierTransform, DFT)公式:


频域原点位置的傅立叶变换为

显然,这是f(x, y)各个像素的灰度之和。而如果将系数1/MN放在正变换之前,则F(0, 0)对应于原图像f(x, y)的平均灰度。F(0,0)有时被称作频谱的直流分量(DC)。

幅度谱、相位谱和功率谱

  • 幅度谱
  • 相位谱

    通过幅度谱和相位谱,我们可以还原F (u, v)
  • 功率谱(谱密度)

    式中:Re(u, v)和Im(u, v)分别为F(u,v)的实部和虚部。

幅度谱又叫频率谱,是图像增强中关心的主要对象,频域下每一点(u,v)的幅度|F(u, v)|可用来表示该频率的正弦(余弦)平面波在叠加中所占的比例,幅度谱直接反映频率信息,是频域滤波中的一个主要依据。
相位谱表面上看并不那么直观,但它隐含着实部与虚部之间的某种比例关系,因此与图像结构息息相关。

6.2 快速傅立叶变换及实现

傅里叶变换需要执行n2 次复数乘法和N(N-1)次复数加法

利用W的周期性,DFT运算中的某些项就可以合并;而利用W的对称性,则可以仅计算半个W序列。而根据这两点,我们就可以将一个长度为N的序列分解成两个长度为N/2的序列并分别计算DFT,这样就可以节省大量的运算量。

快速傅立叶变换(Fast Fourier Transform,FFT)的基本思路——通过将较长的序列转换成相对短得多的序列来大大减少运算量。

目前流行的大多数成熟的 FFT 算法的基本思路大致可以分为两大类,一类是按时间抽取的快速傅立叶算法(Decimation InTime, DIT-FFT),另一类是按频率抽取的快速傅立叶算法(Decimation In Freqency, DIF-FFT)。

Matlab中提供了fft2和ifft2函数分别计算二维傅立叶变换和反变换,运算速度非常快;另一个与傅立叶变换密切相关的函数是fftshift,常需要利用它来将傅立叶频谱图中的零频点移动到频谱图的中心位置。

  1. fft2函数
    该函数用于执行二维快速傅立叶操作,因此可以直接用于数字图像处理。
    Y = fft2(X)
    Y = fft2(X,m,n)
    m和n分别用于将X的第一和第二维规整到指定的长度。当m和n均为2的整数次幂时,算法的执行速度要比m和n均为素数时更快。
    Y是计算得到的傅立叶频谱,是一个复数矩阵。
    计算abs(Y)可得到幅度谱,计算angle(Y)可得到相位谱。
  2. fftshift函数
    在fft2函数输出的频谱分析数据中,是按照原始计算所得的顺序来排列频谱的,而没有以零频为中心来排列,fftshift函数利用了频谱的周期性特点,将输出图像的一半平移到另一端,从而使零频被移动到图像的中间。
    Y = fftshift(X)
    Y = fftshift(X,dim)
    dim指出了在多维数组的哪个维度上执行平移操作。
  3. ifft2函数
    该函数用于对图像(矩阵)执行逆傅立叶变换。输出矩阵的大小与输入矩阵相同。调用形式为
    Y = ifft2(X)
    Y = ifft2(X,m,n)
    Y是反变换后得到的原始图像。
    在执行IFFT2函数之前,如果曾经使用FFTSHIFT函数对频域图像进行过原点平移,则还需要使用IFFTSHIFT将原点平移回原位置。
I2 = imread('1.bmp');%读入原图像
fcoef = fft2(double(I2));%做fft变换
spectrum = fftshift(fcoef);%将零点移到中心
temp =log(1+abs(spectrum));%对幅值做对数变换以压缩动态范围
figure;subplot(1,2,1);imshow(temp,[]);title('FFT');
subplot(1,2,2);imshow(I2);title('Source')


低频(频谱图像中靠近中心的区域)对应着图像的慢变化分量;高频(频谱图像中远离中心的区域)对应着一幅图像中较快变化的灰度级,常常对应着图像细节,如物体的边缘和噪声等。

I = imread('4.jpg');%读入原图像
A = rgb2gray(I);
B = imread('1.bmp');%读入原图像
% 求傅立叶变换
Af = fft2(double(A));Bf = fft2(double(B));
% 分别求幅度谱和相位谱
AfA = abs(Af);AfB = angle(Af);
BfA = abs(Bf);BfB = angle(Bf);
% 交换相位谱并重建复数矩阵
AfR = AfA .* cos(BfB) + AfA .* sin(BfB) .* i;
BfR = BfA .* cos(AfB) + BfA .* sin(AfB) .* i;
% 傅立叶反变换
AR = abs(ifft2(AfR));BR = abs(ifft2(BfR));% 显示图像
subplot(2,2,1);imshow(A);title('半身像原图像');
subplot(2,2,2);imshow(B);title('人脸的原图像');
subplot(2,2,3);imshow(AR, []);title('半身像的幅度谱和人脸的相位谱组合');
subplot(2,2,4);imshow(BR, []);title('人脸的幅度谱和半身像的相位谱组合');


交换相位谱之后,反变换之后得到的图像内容与其相位谱对应的图像一致,这就印证了我们之前关于相位谱决定图像结构的论断。而图像中整体灰度分布的特性,如明暗、灰度变化趋势等则在比较大的程度上取决于对应的幅度谱,因为幅度谱反映了图像整体上各个方向的频率分量的相对强度。

6.3 频域滤波基础


F(u, v)和H(u, v)分别表示f(x, y)和h(x, y)的傅立叶变换,而符号<==>表示傅立叶变换对,即左侧的表达式可通过傅立叶正变换得到右侧的表达式,而右侧的表达式可通过傅立叶反变换得到左侧的表达式。

频域滤波的基本步骤:
(1)计算原始图像f(x, y)的DFT,得到F(u, v)。
(2)将频谱F(u, v)的零频点移动到频谱图的中心位置。
(3)计算滤波器函数H(u, v)与F(u, v)的乘积G(u, v)。
(4)将频谱G(u, v)的零频点移回到频谱图的左上角位置。
(5)计算第(4)步计算结果的傅立叶反变换g(x, y)。
(6)取g(x, y)的实部作为最终滤波后的结果图像。

编写imfreqfilt函数进行频域滤波:

function out = imfreqfilt(I, ff)
% imfreqfilt函数 对灰度图像进行频域滤波
% 参数I 输入的空域图像
% 参数ff 应用的与原图像等大的频域滤镜
if (ndims(I)==3) && (size(I,3)==3) % RGB图像? ? I = rgb2gray(I);
end
if (size(I) ~= size(ff))msg1 = sprintf('%s: 滤镜与原图像不等大,检查输入',mfilename);msg2 = sprintf('%s: 滤波操作已经取消', mfilename);eid =sprintf('Images:%s:ImageSizeNotEqual',mfilename);error(eid,'%s %s',msg1,msg2);
end
% 快速傅立叶变换
f = fft2(double(I));
% 移动原点
s = fftshift(f);
% 应用滤镜及反变换
out = s .* ff; %对应元素相乘实现频域滤波
out = ifftshift(out);
out = ifft2(out);
% 求模值
out = abs(out);
% 归一化以便显示
out = out/max(out(:));

6.4 频域低通滤波器

在频谱中,低频主要对应图像在平滑区域的总体灰度级分布,而高频对应图像的细节部分,如边缘和噪声。因此,图像平滑可以通过衰减图像频谱中的高频部分来实现,这就建立了空间域图像平滑与频域低通滤波之间对应关系。

理想低通滤波器曲面图
编写的imidealflpf函数可以得到截止频率为freq的理想低通滤波器。

function out = imidealflpf(I, freq)
% imidealflpf函数 构造理想的频域低通滤波器
% I参数 输入的灰度图像
% freq参数 低通滤波器的截止频率
% 返回值:out – 指定的理想低通滤波器
[M,N] = size(I);out = ones(M,N);
for i=1:Mfor j=1:Nif (sqrt(((i-M/2)^2+(j-N/2)^2))>freq)out(i,j)=0;endend
end
I=imread('dog.jpg');
I=rgb2gray(I);
% 生成滤镜
ff = imidealflpf(I, 20);
% 应用滤镜
out = imfreqfilt(I, ff);
figure(1);subplot(2,2,1);imshow(I);title('Source');
temp = fft2(double(I));
temp = fftshift(temp);
temp = log(1 + abs(temp));
figure(2);subplot(2,2,1);imshow(temp, []);title('Source');
figure(1);subplot(2,2,2);imshow(out);title('Ideal LPF, freq=20');
% 计算FFT并显示
temp = fft2(out);temp = fftshift(temp);temp = log(1 + abs(temp));
figure (2);subplot(2,2,2);imshow(temp, []);title(' Ideal LPF, freq=20');
% 生成滤镜
ff = imidealflpf(I, 40);
% 应用滤镜
out = imfreqfilt(I, ff);
figure (1);subplot(2,2,3);imshow(out);title('Ideal LPF, freq=40');
% 计算FFT并显示
temp = fft2(out);temp = fftshift(temp);temp = log(1 + abs(temp));
figure (2);subplot(2,2,3);imshow(temp, []);title(' Ideal LPF, freq=40');
% 生成滤镜
ff = imidealflpf(I, 60);
% 应用滤镜out = imfreqfilt(I, ff);
figure (1);subplot(2,2,4);imshow(out);title('Ideal LPF, freq=60');
% 计算FFT并显示
temp = fft2(out);temp = fftshift(temp);temp = log(1 + abs(temp));
figure (2);subplot(2,2,4);imshow(temp, []);title(' Ideal LPF, freq=60');



当截止频率非常低时,只有非常靠近原点的低频成份能够通过,图像模糊严重;截止频率越高,通过的频率成份就越多,图像模糊的程度越小,所获得的图像也就越接近原图像。但可以看出,理想低通滤波器并不能很好地兼顾噪声滤除与细节保留两个方面,这和空域中采用平均模板时的情形比较类似。

6.5 频域高通滤波器



当σ增大时,H(u)的图像倾向于变宽,而h(x)的图像倾向于变窄和变高。这也体现了频率域和空间域的对应关系。频率域滤波器越窄,滤除的高频成份越多,图像就越平滑(模糊);而在空间域,对应的滤波器就越宽,相应的卷积模板越平坦,平滑(模糊)效果就越明显。

%高斯低通滤波器
function out = imgaussflpf(I, sigma)
% imgaussflpf函数 构造频域高斯低通滤波器
% I参数 输入的灰度图像
% sigma参数 高斯函数的Sigma参数
[M,N] = size(I);
out = ones(M,N);
for i=1:Mfor j=1:Nout(i,j) = exp(-((i-M/2)^2+(j-N/2)^2)/2/sigma^2);end
end



高斯低通滤波器在有效抑制噪声的同时,图像的模糊程度更低,对边缘带来的混叠程度更小,从而使高斯低通滤波器在通常情况下获得了比理想低通滤波器更为广泛的应用。

function out = imgaussfhpf(I, sigma)
% imgaussfhpf函数 构造频域高斯高通滤波器
% I参数 输入的灰度图像
% sigma参数 高斯函数的Sigma参数
[M,N] = size(I);out = ones(M,N);
for i=1:Mfor j=1:Nout(i,j) = 1 - exp(-((i-M/2)^2+(j-N/2)^2)/2/sigma^2);end
end



高斯高通滤波器可以较好地提取图像中的边缘信息,Sigma参数取值越小,边缘提取越不精确,会包含越多的非边缘信息;Sigma参数取值越大,边缘提取越精确,但可能包含不完整的边缘信息。

频域拉普拉斯滤波器:

function out = imlapf(I)
% imlapf函数 构造频域拉普拉斯滤波器
% I参数 输入的灰度图像
[M,N] = size(I);out = ones(M,N);
for i=1:M for j=1:Nout(i,j) = -((i-M/2)^2+(j-N/2)^2);end
end


6.6 频域滤波器与空域滤波器之间的内在联系

频域滤波较空域而言更为直观,频域下滤波器表达了一系列空域处理(平滑、锐化等)的本质,即对高于/低于某一特定频率的灰度变化信息予以滤除,而对其他的灰度变化信息基本保持不变。这种直观性增加了频域滤波器设计的合理性,使得我们更容易设计出针对特定问题的频域滤波器
      为了得到合适的空域滤波器,我们很自然地想到可以首先设计频域滤波器 H(u, v),而后根据卷积定理式,将H(u, v)反变换至空域后就得到了空域中滤波使用的卷积模板h(x, y),从而解决了空域滤波器的设计难题。
      然而,直接反变换得到的空域卷积模板h(x, y)同H(u, v)等大,从而与图像f(x, y)具有相同的尺寸。而模板操作十分耗时,要计算这样大的模板与图像的卷积将是非常低效的,直接利用H(u, v)在频域下滤波更为合适。

Matlab综合案例 —— 利用频域滤波消除周期噪声

频域带阻滤波器

function out = imgaussfbrf(I, freq, width)
% imgaussfbrf函数 构造频域高斯带阻滤波器
% I参数 输入的灰度图像
% freq参数 阻带中心频率
% width参数 阻带宽度
[M,N] = size(I);out = ones(M,N);
for i=1:Mfor j=1:Nout(i,j)= 1-exp(-0.5*((((i-M/2)^2+(j-N/2)^2)-freq^2)/(sqrt(i.^2+j.^2)*width))^2);end
end

带阻滤波消除周期噪声

带阻滤波器常用于处理含有周期性噪声的图像。

  1. 得到周期噪声图像
O = imread('pout.tif');
%读入原图像
[M,N] = size(O);I = O;
for i=1:Mfor j=1:NI(i,j)=I(i,j)+20*sin(20*i)+20*sin(20*j); %添加周期噪声end
end
subplot(1,2,1);imshow(O);title('Source');
subplot(1,2,2);imshow(I);title('Added Noise');


2. 频谱分析
使用高斯带阻滤波器时,首先需要对欲处理的图像的频谱有一个了解。下面的命令得到了两幅图像的频谱。

i_f=fft2(I);i_f=fftshift(i_f);i_f=abs(i_f);i_f=log(1+i_f);
o_f=fft2(O);o_f=fftshift(o_f);o_f=abs(o_f);o_f=log(1+o_f);
subplot(1,2,1);imshow(o_f, [ ]);title('Source');
subplot(1,2,2);imshow(i_f, [ ]);title('Added Noise');


发现周期性图像的傅立叶频谱中出现了两对相对于坐标轴对称的亮点,它们分别对应于图像中水平和竖直方向的正弦噪声。
我们构造高斯带阻滤波器的时候就需要考虑尽可能滤除具有这些亮点对应的频率的正弦噪声。注意到这4个点位于以频谱原点为中心,以50为半径的圆周上。因此,设置带阻滤波器中心频率为50,频带宽度为5。
3. 带阻滤波

ff = imgaussfbrf(I, 50, 5);
%构造高斯带阻滤波器
figure, imshow(ff, []);
out = imfreqfilt(I, ff);
%带阻滤波
figure,subplot(1,2,1);imshow(I);title('Source');
subplot(1,2,2);imshow(out);title('Gauss Filter');



我们看到周期噪声被很好地消除。

7. 小波变换

傅立叶变换一直是变换域图像处理的基石,它能用正弦函数之和表示任何分析函数,而小波变换则基于一些有限宽度的基小波,这些小波不仅在频率上是变化的,而且具有有限的持续时间。比如对于一张乐谱,小波变换不仅能提供要演奏的音符,而且说明了何时演奏等细节信息。但是傅立叶变换只提供了音符,局部信息在变换中丢失。

7.1 多分辨率分析

多分辨率理论与多种分辨率下的信号(或图像)表示和分析有关,某种分辨率下无法发现的特性在另一种分辨率下将很容易被发现。本章介绍多分辨率的相关概念和信号(或图像)的分解与重构算法。

7.1.1 多分辨率框架

多分辨率分析又称为多尺度分析,是小波分析中的重要部分,它将多种学科的技术有效地统一在一起,如信号处理的子带编码、数字语音识别的积分镜像过滤以及金字塔图像处理。多分辨率分析的作用是将信号分解成不同空间的部分。另外,它也提供了一种构造小波的统一框架。在观察图像时,对于不同大小的物体,往往采用不同的分辨率,若物体不仅尺寸有大有小,而且对比有强有弱,则采用多分辨率进行分析就凸显出一定的优势

7.1.2

多分辨率分析时,分解的最终目的是力求构造一个在频率上高度逼近的 L2 ®空间的正交小波基,这些频率分辨率不同的正交小波基相当于带宽各异的带通滤波器。另外,多分辨率分析只对低频空间作进一步分解,使频率的分辨率越来越高。

% 1.正弦波定义
f1=50; % 频率1
f2=100; % 频率2
fs=2*(f1+f2); % 采样频率
Ts=1/fs; % 采样间隔
N=120; % 采样点数
n=1:N;
y=sin(2*pi*f1*n*Ts)+sin(2*pi*f2*n*Ts); % 信号函数
figure(1),subplot(5,1,1);plot(y);title('两个正弦信号');
yy = fft2(y);
% 2小波滤波器谱分析
h=wfilters('db30','l'); % 低通
g=wfilters('db30','h'); % 高通
h=[h,zeros(1,N-length(h))]; % 补零(圆周卷积,且增大分辨率便于观察)
figure(1),subplot(5,1,2);stem(h);title('低通滤波');
g=[g,zeros(1,N-length(g))]; % 补零(圆周卷积,且增大分辨率便于观察)
figure(1),subplot(5,1,3);stem(g);title('高通滤波');
% 3 MALLAT分解算法(圆周卷积的快速傅立叶变换实现)
sig1=ifft(fft(y).*fft(h)); % 低通(低频分量)
figure(1),subplot(5,1,4);plot(sig1);title('低通滤波');
sig2=ifft(fft(y).*fft(g)); % 高通(高频分量)
figure(1),subplot(5,1,5);plot(sig2);title('高通滤波');%4 MALLAT重构算法
sig1=dyaddown(sig1); % 2抽取
figure(3),subplot(4,1,1),plot(sig1);
sig2=dyaddown(sig2); % 2抽取
sig1=dyadup(sig1); % 2插值
figure(3),subplot(4,1,2),plot(sig1);
sig2=dyadup(sig2); % 2插值
sig1=sig1(1,(1:N)); % 去掉最后一个零
figure(3),subplot(4,1,3),plot(sig1);
sig2=sig2(1,[1:N]); % 去掉最后一个零
hr=h(end:-1:1); % 重构低通
figure(3),subplot(4,1,4),plot(sig1);
gr=g(end:-1:1); % 重构高通hr=circshift(hr',1)'; % 位置调整圆周右移一位
gr=circshift(gr',1)'; % 位置调整圆周右移一位
sig1=ifft(fft(hr).*fft(sig1));% 低频
figure(2),subplot(3,1,1);plot(sig1);title('低频');
sig2=ifft(fft(gr).*fft(sig2));% 高频
figure(2);subplot(3,1,2);plot(sig2);title('高频');
sig=sig1+sig2;% 源信号
figure(2);subplot(3,1,3);plot(sig);title('重构信号');



7.1.3 图像处理中分解与重构的实现

7.2 Gabor多分辨率分析

傅立叶变换能将信号的时域特征和频域特征联系起来,却不能把二者有机地结合起来。

8. 图像复原

在成像过程中,由于成像系统各种因素的影响,可能使图像质量降低,即“退化”。与图像增强相似,图像复原的目的也是改善图像质量。但是图像复原是试图利用退化过程的先验知识使已被退化的图像恢复本来面目,而图像增强是用某种试探的方式改善图像质量,以适应人眼的视觉与心理。

8.1 图像复原的一般理论

基本概念:
      图像增强主要是一个主观的过程,而图像复原的大部分过程是一个客观的过程。
      图像复原的前提是图像退化,常见的退化原因大致有成像系统的像差或有限孔径或存在衍射、成像系统的离焦、成像系统与景物的相对运动、底片感光特性曲线的非线性、显示器显示时的失真、遥感成像中的大气散射和大气扰动、遥感摄像机的运动和扫描速度不稳定、系统各个环节的噪声干扰、模拟图像数字化引入的误差等。

8.1.1 一般模型

对于退化的复原,一般可采用两种方法。一种方法适用于对图像缺乏已知信息的情况,此时可对退化过程(模糊和噪声)建立模型,进行描述,并进而寻找一种去除或削弱其影响的过程。由于这种方法试图估计图像被一些相对良性的退化过程影响以前的情况,故是一种估计方法。
      另一方面,若对于原始图像有足够的已知信息,则对原始图像建立一个数学模型根据它对退化图像进行拟合会更有效。例如,假设已知图像中仅含有确定大小的圆形物体(如星辰、颗粒、细胞等),这样,由于仅是原始图像很少的几个参数(数目、位置、幅度等)未知,因此这是一个检测问题。
      进行图像复原时,还有许多其他选择。首先,问题既可以用连续数学,也可以用离散数学进行处理。其次,处理既可以在空间域,也可以在频域进行。此外,当复原必须用数字方法进行时,处理既可以通过空间域卷积,也可以通过频域的相乘来实现。


图像退化和复原模型图

8.1.2 噪声模型

数字图像的噪声主要来源于图像的获取和传输过程。使用CCD摄像机获取图像时,光照强度和传感器的温度是生成图像中产生大量噪声的主要因素。通过无线网络传输的图像可能会因为光或其他大气因素的干扰被污染。
(1)高斯噪声
高斯随机变量z的概率密度函数:

(2)瑞利噪声
瑞利噪声的概率密度函数由下式给出

概率密度的均值和方差:


(3)伽马噪声
伽马噪声的概率密度函数

密度的均值和方差:


(4)指数分布噪声
指数噪声的概率密度函数

a>0。概率密度函数的期望值和方差


指数分布的概率密度函数是当b=1时伽马概率密度分布的特殊情况。
(5)均匀分布噪声
均匀分布噪声的概率密度

概率密度函数的期望值和方差:

(6)脉冲噪声(椒盐噪声)
双极)脉冲噪声的概率密度函数:

如果b>a,则灰度值b在图像中将显示为一个亮点;反之则a的值将显示为一个暗点。若pa或pb为零,则脉冲噪声称为单极脉冲。如果pa和pb均不可能为零,尤其是它们近似相等时,则脉冲噪声值将类似于随机分布在图像上的胡椒和盐粉微粒。由于这个原因,双极脉冲噪声也称为椒盐噪声。同时,它们有时也成为散粒和尖峰噪声。

在一幅图像中,高斯噪声的产生源于电子电路噪声和由低照明或高温带来的传感器噪声。瑞利密度分布在图像范围内特征化噪声现象时非常有用。指数密度分布和伽马密度分布在激光成像中有一些应用。脉冲噪声主要表现在成像中的短暂停留,例如错误的开关操作。均匀密度分布可能在实践中描述的最少,然而均匀密度作为模拟随机数产生器的基础是非常有用的。

%噪声
function M = imnoise2(type, L, H, x, y)
% 该数组是L×H维,
if nargin == 1x = 0; y = 1;L = 1; H = 1;
elseif nargin == 3x = 0; y = 1;
end
% 开始处理
switch lower(type)%小写
%均匀噪声的情况case 'uniform'M = x + (y-x)*rand(L, H);
%高斯噪声的情况case 'gaussian'M = x + y*randn(L, H);
%椒盐噪声的情况case 'salt & pepper'if nargin <= 3x= 0.05; y = 0.05;end
% 确认Pa + Pb 是否大于1.? ?if (x+ y) > 1error('The sum Pa + Pb must not exceed 1.')endM(1:L, 1:H) = 0.5;% 不是01的情况N = rand(L, H);c = find(N <= x);M(c) = 0;u = x + y;c = find(N > x & N <= u);M(c) = 1;
%对数噪声的情况case 'lognormal'if nargin <= 3x = 1;y = 0.25;endM = x*exp(y*randn(L, H));
%瑞利噪声的情况case 'rayleigh'M = x+ (-y*log(1 - rand(L, H))).^0.5;
%指数噪声的情况case 'exponential'if nargin <= 3a = 1;endif x <= 0error('Parameter a must be positive for exponentialtype.')endk = -1/x;M = k*log(1 - rand(L, H));
%伽马噪声的情况case 'erlang'if nargin <= 3a = 2; b = 5;endif (b ~= round(b) || b <= 0)error('Param b must be a positive integer for Erlang.')endk = -1/a;R = zeros(L, H);for j = 1:bR = R + k*log(1 - rand(L, H));endotherwiseerror('Unknown distribution type.')end
end
%噪声直方图
r=imnoise2('gaussian',100000,1,0,1); %产生参数是x=0,y=1的高斯噪声序列
subplot(3,2,1);hist(r,50);title('高斯噪声直方图'); %显示直方图
r=imnoise2('rayleigh',100000,1,0,1);
%产生参数是x=0,y=1的瑞利噪声序列
subplot(3,2,2);hist(r,50);title('瑞利噪声直方图') %显示直方图,
r=imnoise2('lognormal',100000,1,1,0.25);
%产生参数是x=1,y=0.25的对数噪声序列
subplot(3,2,3);hist(r,50);title('对数噪声直方图') %显示直方图
r=imnoise2('exponential',100000,1,1);
%产生参数是x=1,y=1的指数噪声序列
subplot(3,2,4);hist(r,50);title('指数噪声直方图') %显示直方图
r=imnoise2('uniform',100000,1,0,1);
%产生参数是x=0,y=1的均匀噪声序列
subplot(3,2,5);hist(r,50); title('均匀噪声直方图')%显示直方图
r=imnoise2('salt & pepper',100000,1,0.05,0.05);
%产生参数是x=0.05,y=0.05的椒盐噪声序列
subplot(3,2,6);hist(r,50); title('椒盐噪声直方图')%显示直方图,

8.1.3 空间滤波复原

当在一幅图像中唯一存在的退化是噪声时

由于噪声项是未知的,我们不能从g(x,y)或G(u,v)中减去它们。而如果在周期噪声的情况下,通常从G(u,v)的谱来估计N(u,v)是可能的。
只有加性噪声存在的前提下,我们选择空间滤波方法。下面介绍几种常见的用于减少噪声的空间滤波器。
(1)均值滤波器
用模板中的全体像素的均值来替代原来的像素值的方法就是均值滤波。它主要包括算术均值滤波、几何均值滤波、谐波均值滤波以及逆谐波均值滤波。
由于均值滤波器对所有的点都是同等对待,所以在将噪声点分摊的同时,将景物的边界点也分摊了,会使图像变得模糊。为改善其效果,可以采用加权平均的方式来构造滤波器。但是,它所滤波的效果也是有限的。为有效改善这种状况,须改换滤波器的设计思路,统计排序滤波就是一种比较有效的方法。
(2)统计排序滤波器
统计排序滤波器是一种非线性的空间滤波器,它的响应基于图像滤波器包围的图像区域中像素的排序,然后用统计排序结果决定的值代替中心像素的值。统计滤波器最常见的例子是中值滤波器。

利用编写的函数split()对图像进行空域滤波,此函数既可以进行线性滤波,也可以进行非线性空域滤波,并且概括了多种滤波方式,如中值滤波、最值滤波、均值滤波以及调和滤波等。

%split()对图像进行空域滤波,概括了多种滤波方式
function f = spfilt(g, type, m, n, parameter)
%我们所设计的滤波器主要包括以下几种:
% F = SPFILT(G, 'amean', M, N) 算术平均数滤波
% F = SPFILT(G, 'gmean', M, N) 几何均值滤波
% F = SPFILT(G, 'hmean', M, N)  谐波均值滤波
% F = SPFILT(G, 'chmean', M, N, Q)对比谐波均值滤波
% 默认的滤波阶数 Q = 1.5.
% F = SPFILT(G, 'median', M, N) 中值滤波
% F = SPFILT(G, 'max', M, N)  ?最大值滤波
% F = SPFILT(G, 'min', M, N)  ?最小值滤波
% F = SPFILT(G, 'midpoint', M, N) 中点滤波
% F = SPFILT(G, 'atrimmed', M, N, d) 修剪均值滤波.
% 参数D须是一个非负数
% 默认值是 d = 2.
% 默认值 M = N = 3,
% Q = 1.5, and d = 2.
if nargin == 2m = 3; n = 3; Q = 1.5; d = 2;
elseif nargin == 5Q = parameter;d = parameter;
elseif nargin == 4Q = 1.5; d = 2;
elseerror('Wrong number of inputs.');
end
% 开始滤波
switch type%算术平均滤波的情况case 'amean'w = fspecial('average', [m n]);f = imfilter(g, w, 'replicate');%几何均值滤波的情况case 'gmean'f = gmean(g, m, n);%调和滤波的情况case 'hmean'f = harmean(g, m, n);%反调和滤波的情况case 'chmean'f = charmean(g, m, n, Q);%中值滤波的情况case 'median'f = medfilt2(g, [m n], 'symmetric');%最大值滤波的情况case 'max'f = ordfilt2(g, m*n, ones(m, n), 'symmetric');%ordfilt2二维数据统计过滤器%最小值滤波的情况case 'min'f = ordfilt2(g, 1, ones(m, n), 'symmetric');%中点滤波的情况case 'midpoint'f1 = ordfilt2(g, 1, ones(m, n), 'symmetric');f2 = ordfilt2(g, m*n, ones(m, n), 'symmetric');f = imlincomb(0.5, f1, 0.5, f2);%修剪滤波的情况case 'atrimmed'if (d <= 0) || (d/2 ~= round(d/2))error('d must be a positive, even integer.')endf = alphatrim(g, m, n, d);%其他otherwiseerror('Unknown filter type.')
end

我们在将一幅图像分别利用胡椒噪声和盐粒噪声污染后,利用不同 Q 值的反调和滤波器来滤波并观察滤波效果。

8.1.4 线性空间不变退化模型

假设n(x,y)=0,则g(x,y)=H[f(x,y)],若

则系统H是一个线性系统。这里,a和b是比例常数,f1(x,y)和f2(x,y)是任意两幅输入的图像。

对于任意 f (x, y),α和β,如果

则一个具有输入输出关系g(x, y)=H[ f (x, y)]的系统称为空间不变系统。这个定义说明图像中任一点的响应只取决于在该点的输入值,而与该点的位置无关。

图像复原中,许多退化类型可近似表示为线性空间不变过程。由于退化模型为卷积的结果,并且图像复原需要滤波器,所以图像复原又称为图像去卷积。

(1)维纳去卷积
在大部分图像中,邻近的像素是高度相关的,而距离较远的像素相关性较弱。由此,可以认为典型图像的自相关函数通常随着与原点的距离增加而下降。由于图像的功率谱是其自相关函数的傅立叶变换,从而可以认为图像的功率谱随着频率的升高而下降。
功率谱的低频部分以信号为主,而高频部分则主要被噪声所占据。

局限性:
(1)首先,当图像复原的目的是供人观察时,均方误差准则并不是一个特别好的优化准则。因为此准则对所有误差(不管其在图像中的位置)都赋予同样地权,而人眼则对暗处和高梯区域的误差比其他区域的误差具有较大的容忍性。
(2)经典的维纳去卷积不能处理具有空间可变点扩散函数的情形(例如存在彗差、散差、表面像场弯曲以及含有旋转的运动模糊等情况下)。
(3)这种技术不能处理有着非平稳信号和噪声的一般情形。大多数图像都是高度非平稳的,有着被陡峭边缘分开的大块平坦区域。此外,许多重要的噪声源是与局部灰度有伏案的(信号有关噪声)。

(2)功率谱均衡
如下形式的滤波器可将退化图像的功率谱复原至其原先的幅度:

和维纳滤波器类似,这种功率谱均衡(点扩散函数)滤波器也是无相移的(实偶函数),它可用于无相移的或相移可用其他方法确定的模糊传函数。
当无噪声时,这两处滤波器都简化为直接的去卷积;当无信号时,这两种滤波器都完全截止。然而,不同的是点扩散函数滤波器在模糊传递函数F(u,v)为零处并不截止到零。
点扩散函数滤波器具有相当强的图像复原能力,在某些情况下其性能优于维纳滤波器。点扩散函数滤波器有时也被叫做同态滤波器。

(3)几何均值滤波器

a和γ为正的实常数。这种滤波器是前面讨论过的几种滤波器的一般形式,其传递函数具有参数a和γ。当a=1时,就成为去卷积滤波器,而若令a=1/2,γ=1 ,则它就变为功率均衡滤波器。

8.2 使用图像复原技术

9. 彩色图像处理

10. 形态学图像处理

11. 图像分割

图像分割的方法和种类有很多,有些分割算法可以直接运用于大多数图像,而另一些则只适用于特殊类别的图像,要视具体情况来决定。一般采用的方法有边缘检测(edgedetection)、边界跟踪(edge tracing)、区域生长(regiongrowing)、区域分离和聚合等。

图像分割算法一般基于图像灰度值的不连续性或其相似性。不连续性是基于图像灰度的不连续变化分割图像,例如图像的边缘,有边缘检测、边界跟踪等算法;相似性是依据事先制定的准则将图像分割为相似的区域,如阈值分割、区域生长等。

图像分割在实际的科学研究和工程技术领域有着广泛的应用。在工业上,应用于矿藏分析、无接触式检测、产品的精度和纯度分析等;生物医学上,应用于计算机断层图像CT、X光透视、核磁共振、病毒细胞的自动检测和识别等;交通上,应用于车辆检测、车种识别、车辆跟踪等;另外,在机器人视觉、神经网络、身份鉴定、图像传输等各个领域都有着广泛的应用。

11.1 边缘检测

边缘检测可以大幅度地减少数据量,并且剔除了那些被认为不相关的信息,保留了图像重要的结构属性

11.1.1 边缘检测概述

11.1.1.1 边缘检测基本步骤


(1)平滑滤波
由于梯度计算易受噪声影响,因此第一步是用滤波去除噪声。但是,降低噪声的平滑能力越强,边界强度的损失越大。

(2)锐化滤波:为了检测边界,必须确定某点邻域中灰度的变化。锐化操作加强了存在有意义的灰度局部变化位置的像素点。

(3)边缘判定:在图像中存在许多梯度不为零的点,但是对于特定应用,不是所有点都有意义。这就要求我们根据具体情况选择和去除处理点,具体的方法包括二值化处理过零检测等。

(4)边缘连接:将间断的边缘连接成为有意义的完整边缘,同时去处假边缘。主要方法是Hough变换

11.1.1.2 边缘检测的分类

通常可将边缘检测的算法分为2类:基于查找的算法和基于零穿越的算法。除此之外,还有Canny边缘检测算法、统计判别方法等。

  • 基于查找的方法通过寻找图像一阶导数中的最大和最小值来检测边界,通常是将边界定位在梯度最大的方向,是基于一阶导数的边缘检测算法。

  • 基于零穿越的方法通过寻找图像二阶导数零穿越来寻找边界,通常是拉普拉斯过零点或者非线性差分表示的过零点,是基于二阶导数的边缘检测算法。

  • 基于一阶导数的边缘检测算子包括Roberts算子、Sobel算子、Prewitt算子等,它们都是梯度算子;基于二阶导数的边缘检测算子主要是高斯-拉普拉斯边缘检测算子。

11.1.2 常见边缘检测算子

11.1.2.1 梯度算子


Roberts 算子利用局部差分算子寻找边缘,边缘定位精度较高,但容易丢失一部分边缘,同时由于图像没经过平滑处理,因此不具备抑制噪声的能力。该算子对具有陡峭边缘且含噪声少的图像效果较好。

Sobel算子和Prewitt算子都考虑了邻域信息,相当于对图像先做加权平滑处理,然后再做微分运算,所不同的是平滑部分的权值有些差异,因此对噪声具有一定的抑制能力,但不能完全排除检测结果中出现的虚假边缘。虽然这两个算子边缘定位效果不错,但检测出的边缘容易出现多像素宽度。

11.1.2.2 高斯-拉普拉斯算子

拉普拉斯算子,但是由于它是一个二阶导数,对噪声具有无法接受的敏感性,而且其幅值会产生双边缘,另外,边缘方向的不可检测也是拉普拉斯算子的缺点之一,因此,一般不以其原始形式作用于边缘检测。

为了弥补拉普拉斯算子与生俱来的缺陷,美国学者Marr提出了一种算法,在运用拉普拉斯算子之前一般先进行高斯低通滤波,

11.1.2.3 Canny 边缘检测算子

12. 特征提取

13. 图像识别初步

14. ANN

15. SVM

精通Matlab数字图像处理与识别nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;相关推荐

  1. 《精通Matlab数字图像处理与识别》一6.2 傅立叶变换基础知识

    本节书摘来自异步社区<精通Matlab数字图像处理与识别>一书中的第6章,第6.2节,作者 张铮 , 倪红霞 , 苑春苗 , 杨立红,更多章节内容可以访问云栖社区"异步社区&qu ...

  2. matlab水果图片,matlab数字图像处理-----------------水果识别

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 又下了一个 %{ 如果图像中的目标物体是连在一起的,则分割起来会更困难,分水岭算法经常用于处理这类问题,通常会取得比较好的效果.分水岭分割算法把图像看成一 ...

  3. 《数字图像处理与机器视觉——Visual C++与Matlab实现》——0.2 数字图像处理与识别...

    本节书摘来自异步社区出版社<数字图像处理与机器视觉--Visual C++与Matlab实现>一书中的第0章,第0.2节,作者: 张铮 , 王艳平 , 薛桂香,更多章节内容可以访问云栖社区 ...

  4. 数字图像处理——车牌识别(matlab)

    本次大报告利用MATLAB函数功能,设计和实现了一个车牌识别系统.车牌识别系统的基本原理为:将手机拍摄到的包含车辆牌照的图像输入到计算机中进行预处理,再对牌照进行搜索.检测.定位,并分割出包含牌照字符 ...

  5. MATLAB数字图像处理系统-形状分类

    MATLAB数字图像处理系统-形状分类 摘 要 数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人 ...

  6. matlab对于处理数字图像的优点,学习MATLAB数字图像处理经验谈

    学习MATLAB数字图像处理经验谈 学习数字图像处理经验谈 (赵小川) 一.面向应用:层层分解.抓住要点 我们学习数字图像处理的最终目的还是应用,不管是用它来研制产品还是研发项目抑或是研究课题,都要用 ...

  7. MATLAB数字图像处理复习概览

    MATLAB数字图像处理 第1章 绪论 数字图像的概念 数字图像处理 第2章 数字图像处理基础 数字图像的生成与表示 数字图像的数值描述 第3章 图像基本运算 图像几何变换 几何变换基础 位置变换 几 ...

  8. 基于matlab的硅晶体模型,基于Matlab的图像处理技术识别硅太阳电池的缺陷

    第 44 卷 第 7 期 2010 年 7 月 上 海 交 通 大 学 学 报 JOURNAL OF SHANGHAI J IAOTON G UNIVERSITY Vol. 44 No. 7 Jul. ...

  9. matlab fspeical,MATLAB数字图像处理.doc

    MATLAB数字图像处理 MATLAB常用图像操作 转换图像类型 例1.对一幅图像进行二值化处理,代码及结果如下: load trees BW=im2bw(X,map,0.4); imshow(X,m ...

最新文章

  1. Java中switch都可以支持哪些数据类型
  2. python dataframe删除指定行_pandas.DataFrame删除/选取含有特定数值的行或列
  3. 实时音视频助力在线教育风口
  4. C语言base64编解码
  5. synchronized同步方法概述
  6. nodejs ftp文件服务器,node.js自动上传ftp的脚本分享
  7. android动态波浪效果,android贝塞尔曲线实现波浪效果
  8. jQuery 图片放大预览插件
  9. eclipse导入远程git代码及(push、pull、及maven工程导入)
  10. 终于找全啦!一二线城市知名互联网公司名单!对着找就对了...
  11. 常用SQL查询语句整理笔记【持续更新】
  12. 在搭建tesseract-OCR环境中遇到问题和反省
  13. while下有scanner循环比对,直至输入满足条件终止循环,equals,韩梅梅do...while不断努力走向chengg
  14. Executing statements
  15. nginx无网络启动失败——proxy_pass域名DNS解析出错
  16. UltraCompare for Mac(文件内容对比神器)v22
  17. 为什么4G、5G又称为蜂窝网络?跟蜂窝有什么关系?
  18. SudaMod-81.0 / crDroidAndroid-8.1(android-8.1.0_r20)红米3 2018年5月3日更新
  19. 什么是rest?什么是restful?它们之间是什么关系
  20. HDU 2014 青年歌手大奖赛_评委会打分

热门文章

  1. 更新Android版GPS定位源代码
  2. cocos2dx-lua-andriond腾讯应用宝游戏接入错误汇总
  3. html如何设置网页的背景图片,使放大或缩小浏览器时,页面排版和背景可以随浏览器放大缩小而排版不会改变,
  4. 【数据结构】图1——图的基本概念和术语、类型定义
  5. 全国首个数字产权区块链平台上线,共享购模式悄然上市
  6. 少儿编程让孩子玩出智慧
  7. 携职教育:四川2022年人力资源管理师考试报名通知
  8. dp交换机命令_DP 交换机
  9. HP-UX 基本命令学习
  10. 我的世界java1.16.3村庄种子,我的世界2020年最新版村庄种子