第二周学习笔记
第三章
$g(x, y)$ = T(f(x, y))
其中f(x, y)为输入图像,g(x, y)为输出(处理后的)图像,T是对图像$f$进行处理的操作符(定义在点(x, y)的指定邻域内,T也可以对一组图像进行处理,例如为降低噪声而让K幅图像相加。
亮度变换函数
亮度变换函数仅取决于亮度的值,与(x, y)无关,所以亮度变换函数通常写作:$s = T(r)$
r表示图像$f$中相应点(x, y)的亮度,s表示图像$g$中相应点(x, y)的亮度,T在这里是一个亮度或者灰度级变换函数
函数imajust(对灰度图像进行亮度变换)
$$g = imadjust(f, [low_in high_in], [low_out high_out], gamma)$$
- 此函数将图像f中的亮度值映射到图像g中,也就是把low_in到high_in之间的值映射到low_out到high_out中。
- 除图像f外,imadjust的所有输入输出均指定在0和1之间,而不论图像f的类。若f为uint8图像,则imadjust将乘以255来确认应用中的实际值。
- [low_in low_high]、[low_out high_out]使用则会得到默认值[0 1]。若high_out小于low_in,则输出亮度会反转
- 参数gamma制定了曲线的形状,该曲线来映射$f$的亮度值,便于生成图像$g$
小实验(使用函数imadjust)
-
原图
-
$g1 = imadjust(f, [], [1 0])$
明暗反转图可以用于增强嵌入在大量黑色中的白色和灰色细节
-
$g2 = imadjust(f, [0.5 0.75], [])$
处理出我们感兴趣的亮度带
-
$g3 = imadjust(f, [], [], 2)$
压缩灰度级的低端并拓展灰度级的高端
对数和对比度拉伸变换
对数和对比度拉伸变换是进行动态范围处理的基本工具。
对数变换
表达式如下:
$$g = c * log(1 + double(f))$$
- c为常数
- 变换形状类似于 $gamma < 1$ 的曲线。但gamma曲线形状可变,对数函数形状固定。
- 主要应用压缩动态范围(如通过计算对数,降低傅里叶频谱的动态范围,便于处理)
- 执行对数变换时,通常期望将导致的压缩值还原为显示的全范围。(例如,对8bit而言,MATLAB中最简单方法使用:$gs = im2uint8(mat2gray(g))$
对比度拉伸
函数形式:
$$s = T(r) = \frac{1}{1 + (m/r)^E}$$
- r表示输入图像的亮度,s是输出图像中的相应亮度值,E控制该函数的斜率。
- 在MATLAB中,由以下式子完成操作:$g = 1./(1+(m./(double(f) + eps)).^E)$
- 使用eps可避免f出现0值时的溢出现象。
- T(r)限制值为1,执行此类变换时,输出值被缩放到$[0 \quad 1]$中
小实验(傅里叶频谱)
-
原图
-
对数变换
亮度变换实用M函数z
- 使用M函数$intrans$
intrans中使用的changeclass也要自己手写的函数
- 亮度标度的M函数
当我们希望把图像标度在全尺度,即最大范围[0, 255]或[0, 65535],可使用此函数
直方图处理和函数绘图
一副数字图像在范围[0, G]内总共有L个灰度级,其直方图定义为离散函数
$$h(r_k) = n_k$$
- $r_k$是区间$[0, G]$内的第K级亮度,$n_k$是灰度级为$r_k$的图像中的像素数。
- 通常我们用归一化直方图,即使用所有元素$h(r_k)$除以图像中的像素总数所得到的图形:$p(r_k) = \frac{h(r_k)}{n} = \frac{n_k}{n}$
核心函数:
$$h = imhist(f, b)$$
- $f$为输入图像,$h$为其直方图$h(r_k)$,$b$是用于形成直方图的灰度级的个数,缺省值为256
- 使用$p = imhist(f, b) / numbel(f)$即可简单获得归一化直方图。(numbel(f)给出数组f中的元素个数)
直方图均衡化
对输入灰度级执行如下变换:
$$s=T(r)=\int_0^r p_r(w)dw$$
- $p_r(r)$表示灰度级的概率密度函数,s表示输出灰度级,$w$是积分的哑变量
- 输出的灰度级概率密度函数是均匀的$p_s(s)=\left{\begin{array}{cc}1,&0\leq s\leq 1\0, & 其他\end{array}\right.$
- 在变化钱该图像的灰度级较均衡化,覆盖了整个范围[0 1],均衡化处理的结果图像拓展了动态范围,具有较高对比度。
对于离散的灰度值:
$$s_k=T(r_k)=\sum_{j=0}^k p_r(r_j)=\sum_{j=0}^k \frac{n_j}{n}$$
- $s_k$是输出图像中的亮度值,对应输入图像中的亮度值$r_k$
工具箱函数
$g = histeq(f, nlev)$
- f为输入图像,nlev是为输出图像之地那个的灰度级数(缺省值为64,一般来说,我们将其赋为灰度级的最大可能数量256)
- 若nlev等于L,即输入图像中可能的灰度级的总数,则histeq直接执行变换函数$T(r_k)$。若nlev小于L,则histeq试图划分灰度级,以便得到较平坦的直方图.
小实验(直方图均衡化)
-
原图
-
直方图
-
均衡化后
-
均衡化后直方图
直方图匹配
生成具有指定直方图的图像的方法称为直方图匹配或直方图规定话
输入灰度级的概率分布函数$p_r(r)$:
$$s=T(r)=\int_0^r p_r(w)dw$$
输出灰度级的概率分布函数$p_s(s)$:
$$H(z)=\int_0^z p_z(w)dw$$
由前两个等式得:
$$z=H{-1}(s)=H{-1}(T(r))$$
由输入图像得到$T(r)$,只要找到$H^{-1}$,就能够使用等式得到变换后的灰度级$z$
工具箱函数:
$$g = histeq(f, hspec)$$
- f为输入图像,hspec为指定的直方图(一个由指定值构成的行向量),g为输出图像(其直方图近似于制定直方图hspec)
- 当length(hspec)远小于图像$f$中的灰度级时,图像$g$的直方图会较好匹配hspec
小实验(直方图匹配)
-
火星原图
-
原图直方图
-
均衡化后
-
均衡化后直方图
空间滤波
领域处理:
- 定义中心点(x,y)
- 仅对预先定义的以(x,y)为中心点的领域内的像素进行计算
- 令计算结果为该点处处理的响应
- 对图像中的每一点重复此步骤
线性空间滤波
线性滤波的机理
在图像f中逐点移动滤波掩模w中心。在每个点(x,y)处,滤波器在该点处的响应是滤波掩模所限定的相应领域像素与滤波器系数的乘积结果的累加(所有假设都基于掩模的大小为奇数的原则,有意义的掩模尺寸最小为$3*3$)
执行线性空间滤波的两个重要的概念:
- 相关:掩模w在图像f中移动的过程
- 卷积:与相关过程相同,在图像f中移动掩模w前,将掩模w旋转180°
工具箱函数:
$$g = imfilter(f, w, filtering_mode, boundary_options, size_options)$$
- f是输入图像,w为滤波掩模,g为滤波结果,filtering_mode指定在滤波过程中使用相关还是卷积,boundary_options用处理边界充零问题(边界的大小有滤波器的大小确定)。size_options可以是'same'或'full'。
- imfilter产生的结果与输入有着相同类(剪切时可能会引起数据的丢失,原因是易导致滤波后结果超出范围。解决这一问题有两种解决方案)
- 使用一个用来归一化系数的选项,使得系数和限定在范围[0, 1]内
- 以double格式输入数据(仍需要归一化为某个点处的一种有效图像格式)
非线性空间滤波
非线性空间滤波则基于非线性操作,包含了一个领域的像素(令每个中心处的响应等于其领域内的最大像素值的操作即为非线性滤波)
工具箱函数:
$$g = colfilt(f, [m n], 'sliding', @fun, parameters)$$
- m和n是滤波区域的维数,'sliding'表示处理过程是在输入图像f中逐个像素地滑动该m×n区域,@fun引用一个函数,该函数任意表示为fun,parameters表示函数fun可能需要的参数,符号@称为函数句柄,它是一种MATLAB数据类型,它包含有引用函数用到的一些信息
- 函数fun必须对矩阵的每一列操作,并返回一个包含所有列的结果的行向量v。v的第k个元素表示的是对A中的第k列进行fun操作后的结果
- 函数padarray:非线性空间滤波在进行滤波之前,输入图像必须经过填充,函数形式为:$fp = padarray(f, [r c], method, direction)$
- 其中,f为输入图像,fp为填充后的图像,[r c]用于给出填空f的行数和列数
图像处理工具箱的标准滤波器
线性空间滤波器
函数fspecial:
$$w = fspecial('type', parameters)$$
- 'type'表示滤波器类型,'parameters'进一步定义了指定的滤波器。
小实验(线性空间滤波器)
- 原图
- 拉普拉斯滤波后的uint8图像
- 红拉普拉斯滤波后的double类图像
- 增强后结果
-
g4
-
g8
非线性空间滤波器
函数ordfilt2:
$$g = ordfilt2(f, order, domain)$$
- 使用邻域的一组排列元素中的第order个元素来替代f中的每个元素,而该邻域则由domain中的非零元素指定。domain是一个由0、1组成的大小为$m*n$的矩阵(在这种情况下,domain类似于掩模)
- 大小为$m*n$的最小滤波器
$$g = ordfilt2(f, 1, ones(m, n))$$ - 相应的最大滤波器
$$g = ordfilt2(f, m*n, ones(m, n))$$ - 中值滤波器
$$g = ordfilt2(f, median(1:m*n), ones(m, n))$$
基于使用,工具箱还提供了二维中值滤波函数
$$g = medfilt(f, [m n], padopt)$$- [m n]指定了$m*n$的邻域,padopt制定了三个可能边界填充选项:'zeros'(默认值)、'symmetric'(按照镜像反射方式对称的沿边界拓展)、'indexed'(double图像,则以1来填充图像,否则以0填充)
- 函数默认形式为$g = medfilt2(f)$
- 大小为$m*n$的最小滤波器
小实验(非线性空间滤波器)
-
原图
-
椒盐噪声污染后
-
medfilt2默认选项滤波
-
使用'symmetric'