zoukankan      html  css  js  c++  java
  • Digital Image Processing 学习笔记2

    第二章

    2.1视觉感知要素

    2.1.1 人眼的结构

    眼睛由角膜与巩膜外壳、脉络膜和视网膜包围,晶状体由通信的纤维细胞层组成,并由附在睫状体上的纤维悬挂;视网膜上分布两类光感受器(锥状体和杆状体),他们主要位于中央凹附近,对颜色高度敏感。其中锥状体视觉称为白昼视觉或亮视觉;杆状体没有色彩感觉,对低照明度敏感,当只有杆状体受刺激时(月光下),称为暗视觉或微光视觉。

    *低照明水平下,主要有杆状体执行;高照明水平下,主要有锥状体执行。

    2.1.2 眼睛中图像的形成

    光接收器的相对刺激作用产生感知,把辐射能转变为电脉冲,最后由大脑解码。

    2.1.3 亮度适应和辨别

    由人的视觉系统感知的亮度是主观亮度,视觉系统具有亮度适应现象(通过改变整个灵敏度来完成这一较大的变动),视觉系统当前灵敏度级别称为亮度适应级别

    在背景光强I的视野中增加一个照射分量ΔI,形成一个持续时间很短的闪烁,ΔI/I称为韦伯比,其值较小意味着可分辨强度较小的百分比变化,表明辨别能力"较好"。

    表明感知亮度不是简单强度的函数的两种现象:马赫带,在强度不同的区域边界出现"下冲"或"上冲"现象;同时对比,感知区域的亮度并不简单的取决于其强度,与背景亮度也有关系。下面给出了这两个现象的例子。

    2.2 光和电磁波谱

    电磁波可以看成以波长λ传播的正弦波,每个无质量的粒子包含一定的能量,其称之为光子。可见光波段在整个电磁波谱中占相当窄的一部分,彩色谱的每种颜色不是突然中止的,而是混合平滑过渡到另外一种颜色。没有颜色的光称之为单色光或五色光,唯一属性是它的强度或大小,灰度级一词通常用来表示单色光的强度。

    *从黑到白的单色光的度量值范围称为灰度级,单色图像通常称之为灰度图像。

    描述彩色光源:发光强度,从光源流出能量的总量,用瓦特(W)度量;光通量,描述观察者从光源感受到的能量,用流明数(lm)度量;亮度,一种主观描述。

    2.3 图像感知和获取

    2.3.1 使用单个传感器获取图像

    2.3.2 使用条带传感器获取图像

    2.3.3 使用传感器阵列获取图像

    2.3.4 简单的图像形成模型

    我们用形如f(x, y)的二维函数来表示图像,在空间坐标(x, y)处,f的值或幅度是一个正的标量,其物理意义由图像源决定,因为其亮度与物理源的辐射能量有关, f一定是一个非零有限量

    函数可以由两个分量来表征:入射到被观察场景的光源总能量和场景中物体反射的光的总能量(有时候用投射来替代反射)。这两个分量分别称为入射分量反射分量,分别用来表示,则

    对于单色图像的任意坐标的灰度可以表示为l=f(x, y),其值范围是。这区间称为灰度级,通常情况下是[0, L - 1],最小值为黑色,最大值为白色。

    2.4 图像取样和量化

    我们将连续的感知数据转换为数字形式有两步处理:取样和量化。

    2.4.1 取样和量化的基本概念

    对坐标值的数字化称之为取样,对灰度值的离散化称之为量化

    2.4.2 数字图像表示

    通过取样和量化,我们可以把一幅图像函数转换为数字图像,其坐标张成的实平面部分称为空间域xy称之为空间变量空进坐标

    一副数字图像可以用三种方式进行标示:

    1. 函数图:xy是空间坐标,zf在此坐标处的值。
    2. 灰度图:每个点的灰度值与该点的f值成正比,当图像的一部分被打印并作为数值进行分析时,这种表示相当有用。
    3. 矩阵:可以直接进行处理和算法开发。

    用矩阵表示时,矩阵中每个元素是将图像单元、图像元素或像素,注意数字图像的远点位于左上角,出于存储和量化硬件的考虑,灰度级数典型地取2的整数次幂,即,灰度跨越的值域非正式的称谓动态范围,作为一条规则,上限取决于饱和度,下限取决于噪声。与这一概念紧密联系的是图像对比度,我们定义一幅图像中最高和最低灰度级间的灰度差为对比度。饱和度指超过这个值的灰度级将被剪切掉这样的一个最高值,噪声表现为粒状的纹理模式,在较暗区域掩盖了可检测的最低真实灰度级。

    2.4.3 空间和灰度分辨率

    空间分辨率是图像中可分辨最小细节的度量,每单位距离线对数和单位距离点数是最长用的度量,要注意的是空间分辨率的度量必须针对空间单位来规定才会有效。

    灰度分辨率是在灰度级中可分辨的最小变化。

    2.4.4 图像内插

    内插是在诸如放大、收缩、旋转和几何校正等任务中广泛应用的基本工具,从根本上看,内插是用已知数据来估计未知位置的数值的处理。如将一副500×500的图像放大到750×750的图像。

    最简单的方法是最近邻内插法,将原图像中最近邻的灰度赋值给每个新的位置;常用的是双线性内插法,用4个最近邻去估计给定位置的灰度,但它并不是一种线性方法,公式如下:

    更复杂的是双三次内插,包括16个最近邻点。它是商业图像编辑程序的标准内插方法,公式为:

    2.5 像素间的基本关系

    本书中,图像用f(x, y)表示,某个特殊的像素用小写字母表示,如或者。

    2.5.1 相邻像素

    像素p的4邻域:(x+1, y) (x-1, y) (x, y+1) (x, y-1),这四点称之为p的邻点,用表示;p的四个对角邻点用表示;这8个点称为p的8邻域,用表示。如果p在边界上,在第三章进行处理。

    2.5.2 邻接性、连通性、区域和边界

        

    邻接性分为4邻接、8邻接和m邻接(又称m邻接);令S是贴图想中的一个像素子集,若S的全部像素之间存在一个通路,则可以说两个像素p和q在S中是连通的,对于S中任意像素p,S中连通到该像素的集称为S的连通分量,若S仅有一个连通分量,则S称为连通集。

    令R为图像中的一个子集,若R为连通集,则称R为一个区域。

    区域R的边界(边缘或轮廓)是这样一些点的集合:这些点与R的补集中的点邻近,这种边界也成为内边界。

    2.5.3 距离度量

    对于坐标分别为(x, y)(s, t) (v, w)的像素p, q, z,

    则D 称为距离函数或度量;像素p, q的距离定义如下:

    2.6 数字图像处理中所用数学工具介绍

    http://v.163.com/special/opencourse/daishu.html,这是网易公开课--MIT的线性代数,Gilbert Strang教授讲得很有应用性。

    2.6.1 阵列与矩阵操作

    2.6.2 线性操作与非线性操作

    线性操作针对的是加和操作和数乘操作。

    2.6.3 算术操作

    值得是两个矩阵点对点做数学运算,图像相加可以做平滑噪声的处理,图像相减可以增强差别,图像相乘或相除可以用来矫正阴影和进行模板操作。

    *均值为$m$的随机变量$z$的方差定义为$E[(z-m)^2]$,其中$E{}$是该参量的期望值;两个随机变量的协方差定义为$E[(z_i-m_i)(z_j-m_j)]$,若两个变量不相关,则它们的协方差为0。

    2.6.4 集合和逻辑操作

    基本集合操作

    属于、空集、交集、并集、补集的基本概念与数学中学的类似,还有一个差集的概念:

    $$A-B=\{w|w\in A,\,w\notin B\}=A\cap{B^c}$$

    图像灰度集合操作中会有些小的变化,首先元素是三元形式$(x, y, z)$,其中$x, y$是空间坐标,$z$是灰度,那么补集定义$A^c=\{(x, y, K-z)|(x, y, z)\in A\}$,并集定义$A\cup B=\{\mathrm{max}_z(a,b)|a\in A,b\in B\}$等等。

    逻辑操作

    包括的操作有非(NOT)、与(AND)、或(OR)、与非(做差集AND[NOT])和异或(XOR)操作,其中需要注意的是AND, OR, NOT是功能完备的。

    模糊集合

    用以处理界限不精确的分类集合,比如用年龄区分。

    2.6.5 空间操作

    空间操作可以分作三类:

    单像素操作:

    $$s=T(z)$$

    其中$z$是源图像中某像素的灰度,$s$是处理后图像中相应的灰度,$T$是变换函数。

    邻域操作

    令$S_{xy}$代表图像$f$中任意一点$(x,y)$为中心的一个邻域坐标集,然后在这个邻域内经过一些操作生成一个像素的坐标值。

    几何空间变换和图像配准

    几何变换也叫橡皮膜变换,它由两个基本操作组成:坐标空间变化+灰度内插(空间变换之后的像素赋灰度值)。

    最常用的空间坐标变换是仿射变换,形式如下:

    $$\begin{bmatrix} x & y & 1 \end{bmatrix}=\begin{bmatrix}v & w & 1 \end{bmatrix}T=\begin{bmatrix} v & w & 1 \end{bmatrix}\begin{bmatrix} t_{11} & t_{12} & 0\\ t_{21} & t_{22} & 0 \\ t_{31} & t_{32} & 0 \end{bmatrix}$$

    其中矩阵$T$可以实现恒等变换、尺度变换、旋转变换、平移变换、以及垂直和竖直方向的便宜变换。对于$T$中的元素,$t_{11}$ 和$t_{22}$表明尺度变换因子,$t_{12}$表明水平偏移变换,$t_{21}$表明垂直偏移变换,$t_{31}$和$t_{32}$表明平移变换情况。

    上式可以有两种方法来使用,一种是向前映射,一种是逆计算,称作反向映射,即$(v,w)=T^{-1}(x,y)$的,就实现角度来讲,往往反向映射更为有效。

    图像配准是数字图像处理的一种重要应用,用于对齐多幅相同场景的图像。这多幅图像可能是多模态的,使用的方法是利用约束点。往往约束点选取的越多,其准确度也越高,但计算量会相应增加。

    2.6.6 向量与矩阵操作

    一个像素可以用向量来表示,如RGB彩色图像;一幅图像也可以用向量来表示,即一个$M\times N$的矩阵变为$MN\times 1$的向量。

    对于用矩阵表示的像素,任一点$a$在$n$维空间的欧氏距离$D$可以表示为:

    $$D(\vec{z},\vec{a})=\begin{bmatrix}(\vec{z}-\vec{a})^T(\vec{z}-\vec{a})\end{bmatrix}^{\frac{1}{2}}=\sum_{i=1}^{n}{(z_i-a_i)^2}^{\frac{1}{2}}$$

    2.6.7 图像变换

    一种二维线性变换$T(u,v)$可以表示为

    $$T(u,v)=\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y)r(x,y,u,v)$$

    其中$f(x,y)$是图像,$r(x,y,u,v)$称为正变换核,如果从$T$到$f$,需要的变换核称为反变换核,这两种变换在一起称为变换对。对于变换核,如果可以拆分,如

    $$r(x,y,u,v)=r_1(x,u)r_2(r,v)$$

    那么我们称变换核是可分的,如果$r_1=r_2$,那么变换是对称的,例如二维傅里叶变换

    $$r(x,y,u,v)=e^{-j2\pi(\frac{ux}{M}+\frac{vy}{N})}$$

    上图描述了线性变换域执行图像处理的基本步骤,变换可以看作一个变换举矩阵作用到图像矩阵上。

    2.6.8 概率方法

    随机变量$z$的第$n$阶矩定义为:

    $$\mu_n(z)=\sum_{k=0}^{L-1}(z_k-m)^np(z_k)$$

    其中$p(z_k)$是图像中灰度级$z_k$出现的概率,$m$为整幅图像的灰度均值,所以我们可以得到$\mu_0(z)=1$,表示概率之和为1;$\mu_1(z)=m$,表示整幅图像的期望值;$\mu_2(z)=\sigma^2$,表示方差。

    *高阶矩的敏感性更高,对于图像的视觉特性也有越明显的作用。

     

     

    MATLAB 版

    这一章节主要是一些概念介绍和函数介绍。

    2.1 数字图像的表示

    2.1.1 坐标约定

    IPT(Image Process Tools)中关于坐标的描述与数学上的描述略有不同,主要区别有:

    1. 使用$(r,c)$来代表行和列。
    2. 远点在$(1,1)$处。

    MATLAB的基本单位是矩阵,对于一个数来说,可以看做是$1\times 1$的标量,一副数字图像可以表示成:

    $$f=\begin{bmatrix}f(1,1) & f(1,2) & \cdots & f(1,N) \\ f(2,1) & f(2,2) & \cdots & f(2,N) \\ \vdots & \vdots & \ddots & \vdots \\ f(M,1) & f(M,2) & \cdots & f(M,N) \\\end{bmatrix}$$

    一个$1\times N$矩阵称为一个行向量,一个$M\times 1$矩阵称为一个列向量

    2.2 读取图像

    imread - Read image from graphics file.

    用法:f = imread('路径名+文件名+扩展名')

    其支持的格式有

    size – Size of array.给出一幅图像的行数和列数

        用法:[M, N] = size(f)

    whos - List current variables, long form. 显示出一个数组的附加信息

        用法:whos f

    2.3 显示图像

    imshow - Display image in Handle Graphics figure.

        用法:imshow(f, G)

    其中G是该图像的灰度级数,默认是256,用一个数组表示[low high],如果参数不写,那么会将整幅图像的像素灰度值等比例拉伸到0-255,如下图效果:

    Figure - Create figure graphics object. 用以显示多福图像时辅助使用。

        用法:imshow(f), figure, imshow(g)

    2.4 保存图像

    Imwrite - Write image to graphics file.

        用法:imwrite(f, '路径名+文件名+扩展名')

    针对JPEG图像使用imwrite,可以通过调整最后一个缺省参数达到压缩效果:

        用法:imwrite(f, '路径名+文件名+扩展名', q)

    其中的q是一个0-100之间的整数,q越小,图像退化越严重。

    其支持的格式有

    imfinfo - Information about graphics file.

        用法:k = imfinfo ('路径名+文件名+扩展名')

    此时的k可以看做一个结构体(针对C语言),具体显示可以使用"."操作符,如k.Filename。

    round – Round to nearest integer.

        用法:m = round(x)

    2.5 数据类

    MATLAB默认的数据类型是double,其支持的数据类有

     

     

     

    2.6 图像类型

    支持四种图像类型:亮度图像、二值图像、索引图像、RGB图像。

    2.6.1亮度图像

    类型有unit8 ,范围是[0, 255];unit16,范围[0, 65535];double,归一化之后范围[0, 1]。

    2.6.2 二值图像

    其像素取值只能是0或者1。

    logical – Convert numeric values to logical

        用法:B = logical(A)

    islogical - Determine if input is logical array

        用法:tf = islogical(A)

    如果是二值图像,返回1,;如果不是,返回0。

    2.7 数据类与图像类型间的转换

    2.7.1 数据类型间转换

    语法简单:B = data_class_name(A);比如B = double(A)。

    *从double到Unit8的时候,小于0的全部置为0,大于255的置于255,其他部分向下取整。

    2.7.2 图像类和类型间的转换

    mat2gray - Convert matrix to grayscale image.

    im2bw – Convert image to binary image, based on threshold.

    im2double – Convert image to double precision.

    等等函数,其中用关系运算符也可以生成二值图像,如

    $$f=\begin{bmatrix}1 & 2 \\ 3 & 4\end{bmatrix} \ f > 2 : \ \begin{bmatrix} 0 & 0 \\ 1 & 1 \end{bmatrix}$$

    2.8 数组索引

    2.8.1 向量索引

    转置运算符(.'),可以将行向量转置为列向量;取元素的数据块可以使用冒号操作符(:);end表示向量的最后一个元素

    linspace – Generate linearly spaced vectors

        用法:x = linspace(a, b, n)

    产生一个含有n个元素的行向量x,这n个元素线性地隔开并且包含a与b。

    2.8.2 矩阵索引

    example:

    $$A=\begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix}$$

    使用end作为索引:$B = A(2 : end, end : -2 :1)$,得到的结果为$\begin{bmatrix} 6& 4 \\ 7 & 9 \end{bmatrix}$,是因为从行方向上看取第2行至第3行;从列方向上看,从最后一行至第1行间隔取。

    使用向量作为索引:$C = A([1 3], [2 3])$,得到的结果为$\begin{bmatrix} 2 & 3 \\ 8 & 9 \end{bmatrix}$,是因为行方向取1,3行,列方向取2,3列。

    矩阵索引还可以使用寻址方式,形式为$A(D)$,其中D是一个逻辑数组,例如$\begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & 1\\ 0 & 0 & 0 \end{bmatrix}$,那么$A(D) = \begin{bmatrix} 1 \\ 6\end{bmatrix}$

    使用冒号,会将交矩阵所有元素按照列方向排成一个列向量,比如$E = B(:)$可以得到结果$E = \begin{bmatrix}1 \\ 4 \\ 7 \\ 2 \\ 5 \\ 8 \\ 3 \\ 6 \\ 9 \end{bmatrix}$

    sum – Sum of array elements

        用法:sum(A)

    可以得到的结果是 $\begin{bmatrix}12 & 15 & 18\end{bmatrix}$

    2.8.3 选择数组维数

    Operation(A, dim)

    operation是一个可能的操作, A是一个数组,dim是一个标量,表明沿着第dim维给出相应结果。

    ndims – Number of array dimensions

        用法:ndims(A)

    其结果不会小于2,因为即使是标量,我们也认为是个$1\times 1$的数组。

    2.9 一些重要的标准数组

    $zeros(M,N)$生成一个大小$M\times N$的double类数组,其元素均为0。

    $ones(M,N)$生成一个大小$M\times N$的double类数组,其元素均为1。

    $true(M,N)$生成一个大小$M\times N$的logical类数组,其元素均为1。

    $false(M,N)$生成一个大小$M\times N$的logical类数组,其元素均为0。

    $magic(M)$生成一个大小$M\times M$的魔方数组,每一行元素之和、每一列元素之和和主对角线元素之和相等,主要用于测试目的,且元素均为整数。

    $rand(M,N)$生成一个大小$M\times N$的double类数组,其元素在[0, 1]之间。

    $randn(M,N)$生成一个大小$M\times N$的double类数组,其元素是正态分布的随机数,随机数均值为0,方差为1,如高斯分布。

    2.10 M函数编程简介

    2.10.1 M文件

    M文件可以是简单执行一系列MATLAB语句的脚本,也可以是接受变量并产生一个或多个输出的函数。

    函数的定义形式:

    $$function [outputs] = name(inputs)$$

    2.10.2 运算符

    三类运算符:

    1. 执行数值计算的算术运算符
    2. 在数量上比较操作数的关系运算符
    3. 执行函数AND、OR和NOT的逻辑运算符

    算术运算符

    *点操作符,比如".^"、".*"都是点对点操作,两个操作数必须是相同的维数。

    关系运算符

    作用于两个相同维数的矩阵,点对点进行关系判断。其中"非"是"~="

    逻辑运算符和函数

    AND:"&"        OR:"|"    NOT:"~"

    逻辑函数:

    • xor(异或):作用于两个相同维数的数组
    • all:若一个向量中所有元素都非零,则返回1。矩阵中按列操作。
    • any:若一个向量中任何元素都非零,则返回1。矩阵中按列操作。

    一些重要的变量和常量

    数的表示

    可以使用科学技术规则。

    2.10.3 流控制

    if, else , else if:

    if expression1

        statements

    elseif expression2

        statements

    else

        statements

    end

    for:

    for index = start: increment: end

        statement

    end

    switch

    switch switch_expression

        case case_expression

            statement

        case case_expression

            statement

        otherwise

            statement

    end

    如果case中有多个表达式,用花括号;且与C语言的switch相比,不需要break语句。

    2.10.4 优化代码

    1. 向量化代码:将循环问题变成向量或矩阵预算。
    2. 预分配内存:计算开始前就分配足够的空间内存。

    2.10.5 交互式I/O

    input – Request user input.

    disp – Display text or array.

    strread – Read formateed data from string.

    strcmp – Compare strings(case sensitive)

    2.10.6 单元数组与结构简介

    单元数组:是一个多维数组,其元素是其他数组元素的副本。(MATLAB中的赋值并不是做一个副本,而是做一个标号,除非原始数组发生了变化)比如$C={A, B}$之后数组A、B可能会改变,但C中不会跟着相应改变。

    结构:类似单元数组,更接近于C语言中的结构体。

  • 相关阅读:
    mysql 远程登陆不上
    hdu 5339 Untitled【搜索】
    SqlServer 书目
    passwordauthentication yes
    oracle 11g RAC ocfs2
    Oracle 11g RAC database on ASM, ACFS or OCFS2
    CentOS ips bonding
    Oracle 11g RAC features
    openStack 王者归来之 trivial matters
    openstack windows 2008 img
  • 原文地址:https://www.cnblogs.com/salan668/p/3516274.html
Copyright © 2011-2022 走看看