第3章 可视化像素强度分布   本章介绍可视化像素强度分布的各种方法(参见图3.1)。这里还包括在图像镶嵌和三角化中有用的生成点指针。换句话说,图像结构可视化展示了关于图像几何的内容。 图3.1 图3.4中组合RGB像素强度的3-D视图   这里的基本方法是在裁剪数字图像中提供关于像素强度的2-D和3-D视图。通过裁剪彩色图像,可以获得组合的像素彩色值或同一图像内的各个彩色通道像素值的不同视图。图像裁剪的重要性不容小觑。图像裁剪从图像中提取子图像。这使得可以专注于自然场景或实验室样本里被认为有趣的、相关的、值得仔细观察的那部分。像素强度是用于镶嵌图像的生成点(网点)的另一个来源,可以产生从不同视角揭示图像几何和图像目标的图像 网格。   例3.1   在附录A.3节中列表A.22的Matlab程序被用来执行如下操作:   (1)裁剪一幅RGB图像以获得一幅子图像。例如,对图3.2中的大图像进行裁剪可得到图3.3中的微小图像结果。   (2)生成一个3-D网格,展示组合的RGB像素值。对裁剪图像得到的结果如图3.1 所示。   (3)生成一个3-D网格,其轮廓为红色通道值。对裁剪图像中像素的红色通道值得到的结果如图3.4(a)所示。   (4)生成一个3-D网格,其轮廓为绿色通道值。对裁剪图像中像素的绿色通道值所得到的结果如图3.5所示。彩色图像中的绿色通道值通常倾向于在最小值和最大值之间具有最大数量的变化。因此,绿色通道是在图像的沃罗诺伊镶嵌中使用的生成点(网点)的选择中寻找不均匀性的好地方。为了看到这一点,考虑3-D网格与它们的轮廓之间的差异,首先从图3.5里绿色通道的3-D网格开始,并与图3.4(a)中的红色通道值和图3.4(b)中的蓝色通道值进行比较。 图3.2 萨勒诺火车站的RGB图像示例 图3.3 对图3.2的图像裁剪得到的子图像 图3.4 图3.2中的红色和蓝色通道值   (5)生成一个3-D网格,其轮廓为蓝色通道值。对裁剪图像中像素的蓝色通道值得到的结果如图3.4(b)所示。 ? 注意:构建直方图需要一幅强度图。 图3.5 绿色通道像素强度与图3.2的轮廓的3-D视图 3.1 直方图和绘制   有许多方法能可视化数字图像中像素强度的分布。一个好的入门方法是可视化图像中像素强度的分布。   例3.2 灰度直方图示例   对图3.2中每个灰度像素的像素强度计数结果如图3.6所示。要对图像像素强度计数 进行试验,参见附录A.3节中列表A.21的代码。有关的详细信息,参见下面的3.1.1小节。 图3.6 灰度火车站图像的直方图 ? 3.1.1 直方图   图像直方图绘制相对于像素强度值的图像强度值出现频率。直方图是使用直方条来构造的,因为通常不可能在直方图中包括单个像素的强度值。一个图像强度直方条(也称为图像强度桶)是在一个特定范围内的像素强度的集合。通常,强度图像的直方图包含256个直方条,每个直方条对应一个像素强度。每个强度图像直方图显示每个像素强度直方条的尺寸(基数)。图像直方图使用称为直方条化的技术构建。图像直方条化是一种将每个像素强度分配给包含对应强度的直方条的方法。下面是另一个例子。   例3.3 直方图的直方条示例   图3.7中的强度(灰度)图像img对其中256个强度中的每一个来说其像素数量都有很大变化。由于渔夫的白色T恤,所以超过200个像素具有最高强度(强度 = 1)。还要注意,那里有超过500个像素具有0强度(黑色像素)。让直方图的直方条所覆盖的强度范围(256个强度中的每一个都对应一个直方条)由下式表示: 0, 1, 2, 3, ..., i, i+ 1, ..., 253, 254, 255 (图像强度直方条) 并用img(x, y)表示在位置(x, y)的像素强度。用0 ≤ i ≤ 255表示直方条i的强度。那么,所有其强度匹配img(x, y)强度的像素都被按下面方式直方条化在bin(i)中: bin(i) = {img(x, y): img(x, y) = i} 使得img(x, y) ? [i, i + 1)(第i个强度直方条) 图3.7 具有256个直方条的图像直方图   附录A.3节中列表A.21的Matlab程序给出对彩色图像和灰度图像都可进行直方条化的示例。对直方条化的扩展学习见[21,3.4.1小节]。 ?   例3.4   要查看子图像中的强度数量,请裁剪选定的图片。例如,裁剪图3.7中的图像,只选择渔夫的头部和肩膀,如图3.8所示。然后,对于强度80、81、82,使用附录A.3节中列表A.21的Matlab程序与原始图像比较直方条80、81和82的大小。换句话说,裁剪图像中的直方条的尺寸相比原始图像中的直方条的尺寸急剧下降。 图3.8 具有256个直方条的裁剪图像直方图 ?   在Matlab中,函数imhist显示灰度图像的直方图。如果g是灰度图像,则imhist的默认显示为255个直方条,每个图像强度为一个直方条。使用imhist(g,n)在g的直方图中显示n个直方条(参见如图3.6的RGB图像的灰度直方图)。使用 >> [counts,x]=imhist(g); (3.1)   将相对频率值存储在直方图的计数中,水平轴值存储在x中。另参见第3.6节中介绍的函数histeq。 3.1.2 茎干图   茎干图是2-D图,将函数值显示为棒棒糖状(具有圆端的茎干)。使用函数stem来生成茎干图。在表示像素强度的相对频率时,茎干图提供了一种直方图的视觉替换方式(直方图中的垂直线被用所替换,参见图3.9)。茎干图使用式(3.1)从直方图中收集信息以得到stem(x,counts)。参见如图3.9中的茎干图。同时,请注意,使用函数stem3可以生成3-D茎干图。图3.9是借助列表3.1得到的。 图3.9 图像像素强度分布 列表3.1 生成图3.9的Matlab程序hist.m 3.1.3 绘制   相对于从直方图提取的矢量counts和x,函数plot给出相对频率计数的2-D图(参见,例如表3.1)。 >> plot(x,counts); 3.1.4 表面绘制   根据矩阵gf(滤波图像)和g(双精度灰度图像),函数surf和surfc分别生成3-D表面和3-D表面等高线图。例如,使用大米图像g和滤波图像gf,借助列表3.2可得到将等高线图画在表面下面的表面绘图。试使用    表3.1 两组直方条计数 图像bin 80bin 81bin 82394135204423152609 >> surfc(gf,g);滤波等高线图 >> surfc(gth,g);阈值图像等高线图 列表3.2 生成图3.11的Matlab程序mesh.m   注意在第一个等高线图中图像强度被分离的证据,以及在第二个等高线图中,即阈值化大米图像中,画在表面下的等高线图里强度被分离的证据。使用surfc,可以借助列表3.2的程序得到如图3.10所示的可视化透视结果。 图3.10 由rice.png的图像强度得到的线框参数表面 3.1.5 线框表面绘制   将函数meshgrid和surfc结合可生成线框表面图,在表面下方有等高线图。这种可视化图像强度的形式如图3.11所示。在列表3.2中,meshgrid(g)是meshgrid(g,g)的缩写,它将图像g指定的域转换为数组x和y,然后用于构造3-D线框图。 3.1.6 轮廓绘制   函数contour绘制等高线图,其中3-D表面值映射到等值线,每个等值线具有不同的颜色。 3.2 等 值 线   用于数字图像的等值线连接2-D平面中所有表示相同强度的点。等值线上的点表示高于x-y平面的高度。在RGB图像中的红色通道里,等值线上的点表示红色的亮度等级(参见如图3.11)。每条等值线属于一个表面,比如指示强度值100的位置。对于等值线,存在2-D中定义的隐式标量字段,例如位置(0, 0),(25, 75)处的值100。Matlab函数clabel可用于在等值线中插入强度值。然而,使用函数set和get的组合是一个有吸引力的替代方案,这使得可以控制等值线值的范围1。图3.12(b)和图3.11以轮廓线的方式给出等值线的示例,它们是由附录A.3.3小节中列表A.23所生成的。 图3.11 peppers.png的红色通道等值线值 图3.12 peppers.png的红色通道等值线   问题3.1   实验函数surf、surfc、stem、stem3、plot、mesh、meshc、meshgrid、contour,每种情况都利用如下数组g所表示的小图像显示不同的变化。 >> g=[12,-1,55;34,-1,66;-123,3,56];   使用灰度图像pout.png重复进行相同的实验。接下来使用彩色图像的每个彩色通道以显示各个可视化函数。 ?   例3.5   通过对图像强度分布直方图和茎干图的说明,考虑图像pout.tif(Matlab库中的有用图像)的强度分布。M. Sonka、V. Hlavac和R. Boyle [182,2.3.2小节]提供了对图像直方图一个很好的概述。直方图的效用可以从以下事实看出:对于一些图像,可以在对数方式压缩的图像动态范围中选择阈值,其中阈值是直方图中主要峰值之间的谷强度。这是图3.9中的情况,其中大约为120的强度值提供了一个良好的阈值。 ?   问题3.2   使用图像直方图在ex_greyth.m中对阈值进行实验,以确定直方图所显示的相对频率分布的峰,并从之间的谷中选择有效阈值。使用cameraman.tif图像,获得类似于图3.13所示的结果(调用修改后的Matlab程序histh.m)。显示原始图像、阈值图像和图像直方图,指出为阈值选择的强度。另外,显示histh.m。 图3.13 通过直方图得到的阈值图像 ? 3.3 彩色直方图   彩色图像中彩色通道强度的分布也值得考虑。在记录下每个像素的彩色通道强度之后,通过叠加每种彩色的茎干图就可产生彩色直方图。   图3.14显示了植物图像的组合彩色通道强度直方图。通过修改列表3.4中的代码,可 图3.14 图像像素彩色通道分布 以显示三个单独的直方图,每一个都对应图像中的一个彩色通道(参见图3.15)。 列表3.3 生成图3.14的Matlab程序hist.m 图3.15 三个图像像素彩色通道分布 ?   1 试用set和get的组合来代替clabel,例如    >> set(h,'ShowText','on','TextStep',get(h,'LevelStep'))   这种标记轮廓线的方法可以控制显示在轮廓线上的高度标记。例如,使用get(h,'LevelStep')*2以抑制较低高度的标号 --------------- ------------------------------------------------------------ --------------- ------------------------------------------------------------ 3.4 自适应阈值化 通过对图像中的每个像素邻域使用不同的阈值来克服全局阈值化的限制。自适应阈值化利用每个像素邻域中的像素强度值确定局部阈值。阈值化的形式很重要,因为像素强度在像素小邻域中趋于相当均匀。给定图像I,邻域滤波图像If和阈值If + C,使用下式来修改每个像素值: 滤波函数imfilter和fspecial的组合可用于计算滤波图像的邻域值。首先,确定有效的n ? n邻域尺寸,并使用fspecial的average滤波器选项。然后,对每个邻域使用replicate选项将平均滤波器值填充到所有图像邻域。例如,为9 ? 9的邻域选择 n = 9,并结合两个Matlab滤波器来获得 >> If=imfilter(I,fspecial(’average’,[99]),’replicate’); 问题3.3 自适应阈值化 除了使用函数fspecial的average和log邻域滤波选项外,还可使用以下选项(参见列表3.4,一些结果如图3.16所示)。 (1)disk(圆平均法)。 (2)gaussian(高斯低通滤波器)。 (3)laplacian(近似2-D拉普拉斯算子)。 (4)motion(运动滤波器)。 (5)prewitt(蒲瑞维特水平边缘增强滤波器[157])。 列表3.4 生成图3.16的Matlab程序adapt2.m (6)sobel(索贝尔水平边缘增强滤波器[177])。 (7)unsharp(非锐化对比度增强滤波器)。 图3.16 对大米图像的自适应阈值化 在以下图像中使用自适应阈值化方法尝试每个滤波器以及average滤波器和log滤波器:pout.png和tooth819.tif。在每种情况下,显示所有结果并使用自适应阈值化指示哪种滤波方法最有效(参见图3.16)。 ? 3.5 对比度拉伸 可以拉伸图像的动态范围,使图像强度占据更大的动态范围。这样做的结果是图像的暗区和亮区之间的对比度增加。这可使用所谓的对比度拉伸来实现的,这是像素强度变换的另一个例子。使用以下方法来对每个像素值进行变换。让 g = 输入图像 c, d = 分别为max[max(g)]和min[min(g)] a, b = g的新动态范围 g(x, y) = [g(x, y) ? c] + a函数stretchlim和imadjust的组合可用于在图像上执行对比度拉伸。例如,选择像素值的累积分布中的第10和第90百分点之间为新的动态范围。这意味着在新的动态范围内,10%的像素值将小于新的min(d),并且90%的新像素值将大于max(c)。 在图3.17的对比度拉伸图像中,鞋子和鞋子右侧地板上的斑点现在更加明显,即更加可辨别 。请注意,对比度拉伸是在转换为灰度的RGB图像上执行的。实际中,可以直接在RGB图像上进行对比度拉伸(参见图3.18)。对比图3.19中的直方图,像素值的相对频率的变化分布是明显的。图3.19是利用列表3.5获得的。 图3.17 灰度鞋子图像上对比度拉伸彩虹 图3.18 彩色鞋子图像上对比度拉伸彩虹 图3.19 对比度拉伸牙齿化石图像的直方图 列表3.5 生成图3.19的Matlab程序histstretch.m 对新动态范围的选择是依赖于图像的。例如,可考虑一下1990年在塞尔维亚发现的具有35万年历史的牙齿化石的微切片图像。该图像和相应的对比度拉伸图像如图3.20所 示,该图利用列表3.6获得。在原始图像中几乎看不到牙齿图像的特征。选择一个等于[0.03, ... , 0.97]的新动态范围后,牙齿的特征更明确。 图3.20 对比度拉伸牙齿化石图像 列表3.6 生成图3.20的Matlab程序contrast.m 通过比较图3.21中的直方图,可以看出原始牙齿图像和对比度拉伸图像中、像素值的相对频率分布之间的对比,特别是高强度时的情况。 图3.21 牙齿化石图像经对比度拉伸后的直方图 ? 问题3.4 使用对比度拉伸对牙齿图像tooth819.tif进行试验。这里的挑战是找到能更清晰地定义牙齿部分的对比度拉伸图像。 ? 3.6 直方图匹配 可以通过从输入图像中提取目标直方图分布来推广对比度拉伸。基本方法要求用户为图像的直方图均衡化指定灰度级强度的期望范围。列表3.7给出了如何完成此操作的示例,其中相应的均衡图像如图3.22所示。 列表3.7 生成图3.22的Matlab程序histeqs.m 图3.22 对牙齿图像的直方图均衡化 经过一些实验,可以发现最好的结果是当目标直方图的范围在[40, 60]时,如图3.23所示。即使对于目标直方图的这个窄范围,所得图像中的牙齿区域也不像它们在图3.20的对比度拉伸图像中那样定义得清晰。 问题3.5 使用直方图匹配对牙齿图像tooth819.tif进行试验。这里的挑战是找到能更清晰地定义牙齿部分的目标直方图。 ? 图3.23 牙齿图像的目标直方图 第4章 线 性 滤 波 本章介绍线性空间滤波器。线性滤波器是时间不变的设备(功能或方法),它对信号进行操作以用某种方式修改信号。在这里考虑的例子中,线性滤波器是一个以像素(彩色或非彩色)值作为输入的函数。实际上,线性滤波器是作用在像素特征值——例如颜色、梯度方向和梯度幅度(尤其是衡量边缘像素强度的梯度幅度)集合上的线性函数,以某种有用的方式对其进行修改或展示。有关线性函数的更多信息参见5.1节。 从工程角度来看,关于滤波的最著名和最重要的文章之一是L. A. Zadeh [211]1953年的文章。与计算机视觉的兴趣相关的是扎德(Zadeh)的思路和最佳滤波器。理想滤波器是可以产生所需信号而没有任何失真或延迟的滤波器。理想滤波器的一个好的示例来自M. Robinson的罗宾逊形状滤波器[164,5.4节,p.159],可用于解决计算机视觉中的形状识别问题。理想的滤波器通常是不可能的。所以Zadeh引入了最优滤波。最优滤波器是一种可产生所需信号最佳(接近)近似值的滤波器。另一篇对计算机视觉很重要的经典论文是J. F. Canny的边缘滤波方法,坎尼在[24]中给出了介绍并在[25]中进行了详细阐述。有关数字图像中边缘检测的尺度不变滤波的最新论文,参见S. Mahmoodi [116]。有关一般线性滤波器设置的更多信息参见R. B. Holmes [82]。有关信号处理中的线性滤波器,尤其可参见D. S. Broomhead、J. P. Huke和M. R. Muldoon [20,3节]。 4.1 图像滤波的重要性 前面的重点是操纵图像的动态范围,以改善、锐化和增加图像特征的对比度。在本章中,焦点从锐化图像对比度转变为基于局部邻域像素值加权和的图像滤波。这给出了一种去除图像噪声、锐化图像特征(增强图像外观)以及实现边缘和角点检测的方法。图像滤波方法的研究直接关系到图像分析、图像分类和图像检索的各种方法。在图像分析和计算机视觉中,图像滤波的重要性可以在如下滤波方法中找到。 快速椭圆滤波:通过对固定数量的盒分布的重复卷积来构造径向均匀的盒样条,见K. N. Chaudhury、A.Munoz-Barrutia和M. Unser [28]。所提出滤波方法的结果如图4.1所示。 高斯平滑滤波:高斯平滑滤波方法有两个主要步骤,由S. S. Sya和A. S. Prihatmanto给出[185]:(1)将给定的光栅图像标准化为RGB彩色,使得彩色像素强度在0到225的范围内;(2)将标准化的RGB图像转换为HSV图像以获得色调、饱和度和值的阈值来检测由Lumen社交机器人跟踪的人脸。Sya和Prihatmanto对高斯滤波的应用说明了HSV色彩空间的高效用。高斯滤波是非线性滤波的一个例子。有关这方面的更多信息参见5.6节和附录B.15节。 非线性自适应中值滤波(AMF):T. K.Thivakaran和R. M. Chandrasekaran在[189]中提出使用非线性AMF。? 图4.1 肌动蛋白纤维图像滤波 像素的开放邻域与给定像素的接近度:S. A. Naimpally和J. F. Peters在[126,140,148],其他人在[72,75,135,149,159,167]中引入了一种图像滤波方法,它聚焦于像素的开放邻域与邻域外部像素的接近度。像素的开放邻域是像素周围固定距离内的一组像素,不包括沿邻域边界的像素。有关开放集和邻域的更多信息参见附录B.4节和B.9节。 4.2 滤 波 器 核 在线性空间滤波器中,可通过n ? m邻域中的像素值的线性组合获得目标像素的滤波值。目标像素位于邻域的中心。邻域像素值的线性组合由滤波器核或模板确定。滤波器核是与邻域大小相同的数组,包含分配给目标像素附近像素的权重。线性空间滤波器对核和邻域像素的值进行卷积以获得新的目标像素值。令w表示3 ? 3核并且令g(x, y)为3 ? 3邻域中的目标像素,则行矢量对的点积总和就能给出目标像素的新值。对相同大小的一对1 ? n矢量A和B,点积是相应位置数值的乘积之和,即, 在选择3 ? 3核之后,计算数字图像g的3 ? 3邻域中的点积之和作为目标像素g(x, y)的值,即, 例如,考虑如下的点积和示例: 核w被称为索贝尔模板,可用于图像中的边缘检测[57,3.6.4小节](还可参见[24,54,56,118,157])。在Matlab中,可以使用函数dot(点积)来计算给定3 ? 3模板的目标像素n(2, 2)的值。列表4.1对此进行了说明。 ? 列表4.1 计算目标值的Matlab程序target.m 将核与图像邻域进行卷积的步骤总结如下。 (1)定义一个n ? n的滤波器核k。 (2)将核滑动到图像g中的n ? n邻域n(核的中心与邻域目标像素重叠)。 (3)将像素值乘以相应的核权重。如果n(x, y)与k(x, y)重叠,则计算n(x, y)k(x, y)。对于k的第i行k(i, :),计算点积k(x, y)?n(x, y)。然后计算行点积的和。 (4)将原始目标值替换为新的滤波值,即步骤(3)中的点积的总和。 4.3 线性滤波器实验 使用所谓的函数句柄@,可以在Matlab中根据操作op(例如max、median、min)以下列方式定义核。 >> func=@(x)op(x(:)); 函数nlfilter(邻域滑动滤波器)根据n ? n邻域和核对图像进行滤波(例如,基本方法是通过用核的中值替换原始目标像素值来计算邻域中的目标像素值)。对于摄像师图像,考虑中值滤波器的设计。参见列表4.2和图4.2。 列表4.2 生成图4.2的Matlab程序nbd.m 要了解邻域滑动滤波器的工作原理,请尝试列表4.3中所示的实验。 问题4.1 根据选定的图像,使用函数max和mean定义nlfilter的新版本(参见列表4.3以了解如何完成此操作)。在每种情况下,使用subplot显示原始图像、原始图像的直方图、滤波图像和滤波图像的直方图。