虽然随着工业相机设备技术的发展,各种型号的工业相机层出不穷。相机的分辨率、曝光时间等性能都有了极大改善。但,工业环境复杂,导致常常得到的目标图像并不是非常理想。我们还需要利用图像增强技术,对图像进行进一步处理,以得到更好的特征和视觉效果。
图像增强:
一般的图像增强方法根据增强处理过程所在的空间不同,可分为基于空域和频域的方法。基于空域的方法直接对图像进行处理;基于频域的方法是在图像的某种变换域内对图像的变换系数进行修正,然后再反变换到原来的空域,得到增强的图像。
主要目的:一、是为了改善图像的视觉效果,提高图像的清晰度;
二、是针对给定图像的应用场合,突出某些感兴趣的特征,抑制不感兴趣的特征,以扩大图像中不同物体特征之间的差别,满足某些特殊分析的需要。
基于空间域的图像增强:直接作用于图像像素的增强方法。
1、灰度变换增强
灰度变换主要针对独立的像素点进行处理,由输入像素点的灰度值决定相应的输出像素点的灰度值,通过改变原始图像数据所占的灰度范围而使图像在视觉上得到改善。
1.1 线性灰度增强
线性灰度增强,将图像中所有点的灰度按照线性灰度变换函数进行变换。在曝光不足或过度的情况下,图像的灰度可能局限在一个很小的灰度范围内,这时图像可能会很模糊不清。利用一个线性单值函数对图像内的每一个像素做线性拓展,将会有效地改善图像的视觉效果。
基本原理:假设一幅图像f(x,y)变换前的的灰度范围是[a, b],希望变换后g(x,y)灰度范围拓展或者压缩至[c, d],则灰度线性变换函数表达式为:
通过调整a,b,c,d,的值可以控制线性变换函数的斜率,从而达到灰度范围的拓展或压缩。
1.2 分段线性灰度增强
分段线性灰度增强可将需要的图像细节灰度级扩展,增强对比度,将不需要的图像细节灰度级压缩。
基本原理:假设输入图像f(x,y)的灰度为0~M级,增强后图像g(x,y)的灰度级0~N级,区间[a, b]、[c,d]分别为源图像和增强图像的某一灰度区间。分段线性变换函数为:
a,b,c,d取不同的值时,可得到不同的效果。
(1)若a=c,b=d,灰度变换函数为一条斜率为1的直线,增强图像与源图像相同;
(2)若a>c,b (3)若a 由此可见,通过调整a,b,c,d,可以控制分段的斜率,从而对任意灰度区间进行拓展或者压缩。 1.3 非线性灰度增强 显而易见,当用非线性函数对图像灰度进行映射时,可以实现图像的非线性灰度增强。 基本原理:常用的非线性灰度增强方法有对数函数非线性变换和指数函数非线性变换。 (1)对数函数非线性变换 对图像做对数非线性变换时,变换函数为: 通过调整a,b,c,可以调整曲线的位置与形状。利用此变换,可以使输入图像的低灰度范围得到扩展,高灰度范围得到压缩,以使图像分布均匀。 (2)指数函数非线性变换 对图像做指数函数非线性变换时,变换函数为: 通过调整a,b,c,可以调整曲线的位置与形状。利用此变换,可以使输入图像的低灰度范围得到扩展,高灰度范围得到压缩,以使图像分布均匀。 2、直方图增强 图像直方图描述了一幅图像的灰度级分布情况,我们从图像的灰度级的分布形态可以提供图像信息的很多特征。因此,我们通过改变图像的直方图的形态也就是改变图像的对比度了。常用的方法有直方图均衡化和直方图规定化。 在进行直方图相关操作之前,我们肯定得知道直方图长什么样,也就是直方图统计。从数学上理解,图像直方图实际就是图像各灰度值统计特性与图像灰度值之间的函数关系,它统计的是一幅图像中各个灰度级出现的次数或者概率。从图形上说,它是一个二维图,用横坐标表示各个像素点的灰度级r;纵坐标表示对应灰度级的像素个数或者概率: 算法实现步骤: (1)获取源图像的宽和高; (2)逐行扫描图像的像素点,并进行灰度统计; (3)计算各个灰度级的概率密度。 2.1 直方图均衡化 2.2 直方图规定化 3、图像平滑 3.1 线性滤波(Linear filter) 3.1.1 均值滤波(Simplebluring) 均值滤波实际上就是用均值替代原图像中的各个像素值。 均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来(目标核的)像素值。对噪声图像特别是有大的孤立点的图像非常敏感,即使有极少数量点存在较大差异也会导致平均值的明显波动。 原理分析:(K为模板) 处理后的目标点像素值: , M=Kw*kh Opencv的API介绍:(一般模板选择3*3,5*5的) blur(Matsrc, Mat dst, Size(xradius, yradius), Point(-1,-1)); //括号内依次含义:原图;处理图;size表内核的大小,Size(3,3)就表示3x3的核大小;Point类型的anchor,表示锚点(即被平滑的那个点), 插曲: 空间滤波技术分类 一、根据空间滤波增强目的可分为:平滑滤波和锐化滤波; 二、根据空间滤波的特点可分为:线性滤波和非线性滤波。 (1)平滑滤波,能减弱或消除图像中的高频分量,但不影响低频分量。因为高频分量对应图像中的区域边缘等灰度值具有较大、较快变化的部分,平滑滤波将这些分量绿区可减少局部灰度的起伏,使图像变得比较平滑。实际应用中,平滑滤波即可以用来消除噪声,又可以用在提取较大的目标前过滤去除较小的细节或将目标内的小间断连接起来。 (2)锐化滤波,能减弱或消除图像中的低频分量,但不影响高频分量。因为低频分量对应图像中灰度值缓慢变化的区域,因而与图像的整体特性如整体对比度和平均灰度值等有关。锐化滤波将这些分量滤去可使图像反差增加,边缘明显。实际应用中,锐化滤波可用于增强图像中被模糊的细节或景物的边缘。 实验结果: (原图含有椒盐噪声) (均值滤波效果图) 分析:因为椒盐的幅值基本都是相同的,只是出现噪声点的位置是随机的,所以在统计意义下的噪声均值也不为0,因此,即使在理想情况下也无法完全去除。但从模板的含义来理解,经过均值滤波处理后,噪声部分被弱化到周围的像素点上,所以结果图上,噪声幅值减小但噪声点的颗粒面积同时变大。 缺点(shortcoming):在降低噪声的同时使图像变得模糊,特别是在景物的边缘和细节处,模板越大,虽然噪声的抑制效果越好,但同时画面的模糊越严重。 3.1.2高斯滤波(Gaussianbluring)(低通滤波器) 高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。 高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。进行高斯滤波的通常原因是真实图像在空间内的像素是缓慢变化的,因此临近点的像素变化不会很明显,但是随机的两个点就可能形成很大的像素差。正是基于这一点,高斯滤波在保留信号的条件下减少噪声。遗憾的是,这种方法在接近边缘处就无效了,因此高斯滤波会破平边缘。但是,高斯平滑滤波器对于抑制服从正态分布的噪声仍然是非常有效的。 高斯函数: 二维高斯: Opencv里面API介绍: GaussianBlur(Matsrc, Mat dst, Size(11, 11), sigmax, sigmay);其中Size(x, y), x, y 必须是正数而且是奇数 //GaussianBlur(const Mat& src, Mat& dst, Size(x,y),double sigmaX, double sigmaY=0,intborderType=BORDER_DEFAULT (一般默认)); //src和dst当然分别是输入图像和输出图像;size为高斯滤波器模板大小;sigmaX和sigmaY分别为高斯滤波在横线和竖向的滤波系数;borderType为边缘点插值类型。 实验结果: (含有高斯噪声) (高斯滤波效果图) (含有椒盐噪声) (高斯滤波效果图) 分析:高斯滤波对于椒盐噪声和高斯噪声都有明显的抑制作用,但高斯滤波对于椒盐噪声的抑制效果更好。一般在不知道噪声类型的情况下都选择高斯滤波。 3.2非线性滤波(Nonlinear filtering) 3.2.1中值滤波(Medianbluring) 中值滤波法是一种基于排序统计理论的一种能有效抑制噪声的非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值,也就是将中心像素的值用所有像素值的中间值(不是平均值)替换。中值滤波通过选择中间值避免图像孤立噪声点的影响,对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。这些优良特性是线性滤波方法所不具有的。此外,中值滤波的算法比较简单,也易于用硬件实现。所以,中值滤波方法一经提出后,便在数字信号处理领得到重要的应用。 原理: 其中,f(x,y),g(x,y)分别为原图像和处理后的图像,W为模板,通常为3*3、5*5区域,也可以有不同的形状,如线形、圆形、十字形、圆环形等。 Opencv里面API介绍: medianBlur(Matsrc, Mat dest, ksize) //src和dst当然分别是输入图像和输出图像。ksize为均值滤波器模板大小 实验结果: (含有椒盐噪声) (中值滤波效果图) (含有高斯噪声) (中值滤波效果图) 分析:结果图显示知,中值滤波对于噪声具有抑制作用,而且对于椒盐噪声,中值滤波具有很好的降噪性。但会损失一定的图像清晰度。 3.2.2双边滤波(BilateralFiltering) 双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。双边滤波能够提供一种不会将边缘平滑掉的方法,但作为代价,需要更多的处理时间。与高斯滤波类似,双边滤波会依据每个像素及其领域构造一个加权平均值,加权计算包括两个部分,其中第一部分加权方式与高斯平滑中相同,第二部分也属于高斯加权,但不是基于中心像素点与其他像素点的空间距离之上的加权,而是基于其他像素与中心像素的亮度差值的加权。可以将双边滤波视为高斯平滑,对相似的像素赋予较高的权重,不相似的像素赋予较小的权重,也可用于图像分割之中。 双边滤波器的好处是可以做边缘保存(edge preserving),一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。 原理: Opencv里面的API介绍: 双边模糊bilateralFilter(src,dest, d=15, 150, 3); - 15 –计算的半径,半径之内的像数都会被纳入计算,如果提供-1 则根据sigma space参数取值 -150 – sigma color 决定多少差值之内的像素会被计算 - 3 – sigma space 如果d的值大于0则声明无效,否则根据它来计算d值 //src和dst当然分别是输入图像和输出图像。d为每个像素领域的直径,sigmaColor为颜色空间的标准偏差,sigmaSpace为坐标空间的标准偏差。borderType为边缘点插值类型。 实验结果:(原图含有高斯噪声) (均值滤波) (高斯滤波) (中值滤波) (双边高斯滤波) 分析:均值模糊无法克服边缘像素信息丢失缺陷。原因是均值滤波是基于平均权重; 高斯模糊部分克服了该缺陷,但是无法完全避免,因为没有考虑像素值的不同; 中值模糊,虽然抑制噪声算法比均值滤波略为复杂,但保持画面清晰度的效果更好; 高斯双边模糊是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变。 4、图像锐化 几种常见的卷积算子 (Robert 算子) (Sobel 算子) (Laplance算子) 3.1 sobel算子 Sobel 算子是一个离散微分算子(discrete differentiation operator)。 它结合了高斯平滑和微分求导,用来计算图像灰度函数的近似梯度。用于图像处理和计算机视觉,特别是在边缘检测算法中,它可以创建强调边缘的图像。它以斯坦福人工智能实验室(SAIL)的同事Irwin Sobel和GaryFeldman命名。 Sobel和Feldman在1968年SAIL的演讲中提出了“各向同性3x3图像梯度算子”的概念。从技术上讲,它是一个离散微分算子,计算图像强度函数梯度的近似值。在图像中的每一点,Sobel-Feldman算子的结果是相应的梯度向量或该向量的范数。Sobel-Feldman算子基于将图像与水平和垂直方向上的小的可分离的整数值滤波器进行卷积,因此在计算方面相对简便。另一方面,它产生的梯度近似相对粗糙,特别是对于图像中的高频变化。 图像边缘, 边缘就是灰度值变化剧烈的地方。表示这一改变的一个方法是使用导数。是像素值发生跃迁的地方,是图像的显著特征之一,在图像特征提取、对象检测、模式识别等方面都有重要的作用。梯度值的大变预示着图像中内容的显著变化。用更加形象的图像来解释,假设我们有一张一维图形。下图2中灰度值的”跃升”表示边缘的存在,图3中使用一阶微分求导我们可以更加清晰的看到边缘”跃升”的存在。 图1、 Lena 图2、像素一维图形 图 3、一阶导数 具体是采用卷积的计算方法实现的。假设被作用的图像为 ,在两个方向上求导: 水平变化求导:将 与一个奇数大小的内核 进行卷积。比如,当内核大小为3时, 的计算结果为图4a: 垂直变化求导:将 I 与一个奇数大小的内核 进行卷积。比如,当内核大小为3时, 的计算结果为图4b: 在图像的每一点,结合以上两个结果求出近似 梯度 ,如图4c: 也可简化为: l 求取导数的近似值,kernel=3时不是很准确,OpenCV使用改进版本Scharr函数,算子如下: Opencv里面API介绍: cv::Sobel ( InputArray Src // 输入图像 OutputArray dst// 输出图像,大小与输入图像一致 int depth // 输出图像深度. Int dx // X方向,几阶导数 int dy // Y方向,几阶导数 int ksize, SOBEL算子kernel大小,必须是1、3、5、7、 double scale = 1 double delta = 0 int borderType =BORDER_DEFAULT) cv::Scharr ( InputArray Src // 输入图像 OutputArray dst// 输出图像,大小与输入图像一致 int depth // 输出图像深度. Int dx. // X方向,几阶导数 int dy // Y方向,几阶导数. double scale = 1 double delta = 0 int borderType =BORDER_DEFAULT) 实验效果图: (原图) (x方向的梯度变化) (y方向的梯度变化) (sobel算子检测的边缘) (x方向的梯度变化) (y方向的梯度变化) (scharr算子检测的边缘) 分析:由实验图像可以明显的看出,scharr算子比sobel算子更加能突显图像的边缘细节,效果比sobel更好。 3.2 Laplace算子 拉普拉斯算子是最简单的各向同性微分算子,具有旋转不变性。一个二维图像函数的拉普拉斯变换是各向同性的二阶导数,定义为: 其中, 为了更适合于数字图像处理,将该方程表示为离散形式: 另外,拉普拉斯算子还可以表示成模板的形式,如图5-9所示。图5-9(a)表示离散拉普拉斯算子的模板,图5-9(b)表示其扩展模板,图5-9(c)则分别表示其他两种拉普拉斯的实现模板。从模板形式容易看出,如果在图像中一个较暗的区域中出现了一个亮点,那么用拉普拉斯运算就会使这个亮点变得更亮。因为图像中的边缘就是那些灰度发生跳变的区域,所以拉普拉斯锐化模板在边缘检测中很有用。一般增强技术对于陡峭的边缘和缓慢变化的边缘很难确定其边缘线的位置。但此算子却可用二次微分正峰和负峰之间的过零点来确定,对孤立点或端点更为敏感,因此特别适用于以突出图像中的孤立点、孤立线或线端点为目的的场合。同梯度算子一样,拉普拉斯算子也会增强图像中的噪声,有时用拉普拉斯算子进行边缘检测时,可将图像先进行平滑处理。 图像锐化处理的作用是使灰度反差增强,从而使模糊图像变得更加清晰。图像模糊的实质就是图像受到平均运算或积分运算,因此可以对图像进行逆运算,如微分运算能够突出图像细节,使图像变得更为清晰。由于拉普拉斯是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。因此,锐化处理可选择拉普拉斯算子对原图像进行处理,产生描述灰度突变的图像,再将拉普拉斯图像与原始图像叠加而产生锐化图像。拉普拉斯锐化的基本方法可以由下式表示: 这种简单的锐化方法既可以产生拉普拉斯锐化处理的效果,同时又能保留背景信息,将原始图像叠加到拉普拉斯变换的处理结果中去,可以使图像中的各灰度值得到保留,使灰度突变处的对比度得到增强,最终结果是在保留图像背景的前提下,突现出图像中小的细节信息。 Opencv里面API的介绍: 处理的步骤: 1、 高斯模糊 – 去噪声GaussianBlur() 2、转换为灰度图像cvtColor() 3、拉普拉斯 – 二阶导数计算Laplacian() 4、 取绝对值convertScaleAbs() 5、显示结果 cv::Laplacian( InputArray src, OutputArray dst, int depth, //深度CV_16S int kisze, // 3 double scale = 1, double delta =0.0, int borderType = 4) 实验效果图: (原图) (laplace算子锐化后的效果) 分析:通过laplace算子可以在保留背景信息的同时,将图像像素发生变化的地方,进行锐化突出,显示更多图像小的细节信息。 3.2 Canny算子 Canny算子与Marr(LoG)边缘检测方法类似(Marr大爷号称计算机视觉之父),也属于是先平滑后求导数的方法。John Canny研究了最优边缘检测方法所需的特性,给出了评价边缘检测性能优劣的三个指标: 1 好的信噪比,即将非边缘点判定为边缘点的概率要低,将边缘点判为非边缘点的概率要低; 2 高的定位性能,即检测出的边缘点要尽可能在实际边缘的中心; 3 对单一边缘仅有唯一响应,即单个边缘产生多个响应的概率要低,并且虚假响应边缘应该得到最大抑制。 Canny算法就是基于满足这3个指标的最优解实现的,在对图像中物体边缘敏感性的同时,也可以抑制或消除噪声的影响。 Canny算子求边缘点具体算法步骤如下: 1. 用高斯滤波器平滑图像. 2. 用一阶偏导有限差分计算梯度幅值和方向 3. 对梯度幅值进行非极大值抑制 4. 用双阈值算法检测和连接边缘. (1)灰度化和去噪 Canny算法通常处理的都是灰度图像,因此先把图像转变为灰度图像。 高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,特别是对抑制或消除服从正态分布的噪声非常有效。滤波可以消除或降低图像中噪声的影响,使用高斯滤波器主要是基于在滤波降噪的同时也可以最大限度保留边缘信息的考虑。 (2)用一阶偏导的有限差分来计算梯度的幅值和方向。 高斯模糊的目的主要为了整体降低图像噪声,目的是为了更准确计算图像梯度及边缘计算梯度值和方向,幅值。计算图像梯度可以选择算子有Robot算子、Sobel算子、Prewitt算子等。 图像灰度值的梯度一般使用一阶有限差分来进行近似,这样就可以得图像在x和y方向上偏导数的两个矩阵。 这里采用更加简单明了的2x2的算子,其数学表达如下: (3)对梯度幅值进行非极大值抑制。 非极大值抑制是进行边缘检测的一个重要步骤,通俗意义上是指寻找像素点局部最大值。沿着梯度方向,比较它前面和后面的梯度值进行了。 (4)用双阈值算法检测和连接边缘。 非最大信号抑制以后,输出的幅值如果直接显示结果可能会少量的非边缘像素被包 含到结果中,所以要通过选取阈值进行取舍,传统的基于一个阈值的方法如果选择的阈值较小起不到过滤非边缘的作用,如果选择的阈值过大容易丢失真正的图像边缘,Canny提出基于双阈值(Fuzzy threshold)方法很好的实现了边缘选取,在实际应用中双阈值还有边缘连接的作用。双阈值选择与边缘连接方法通过假设两个阈值其中一个为高阈值TH另外一个为低阈值TL则有 a.对于任意边缘像素低于TL的则丢弃 b.对于任意边缘像素高于TH的则保留 c.对于任意边缘像素值在TL与TH之间的,如果能通过边缘连接到一个像素大于TH而且边缘所有像素大于最小阈值TL的则保留,否则丢弃。 Opencv里面API介绍: Canny算法介绍 – 五步 1. 高斯模糊 - GaussianBlur 2. 灰度转换 - cvtColor 3. 计算梯度 – Sobel/Scharr 4. 非最大信号抑制 5. 高低阈值输出二值图像 API – cv::Canny( InputArraysrc, // 8-bit的输入图像 OutputArrayedges,// 输出边缘图像, 一般都是二值图像,背景是黑色 doublethreshold1,// 低阈值,常取高阈值的1/2或者1/3 doublethreshold2,// 高阈值 intaptertureSize,// Soble算子的size,通常3x3,取值3 boolL2gradient // 选择 true表示是L2来归一化,否则用L1归一化) 实验效果图: (原图) (canny算子检测边缘结果) 分析:由结果图看出,通过canny算子检测得到的图像边缘确实效果很好,基本上能过很好的体现图像的边缘信息。 *5、频率域增强 低通滤波,高通滤波,带阻滤波,同态滤波; *6、彩色增强 真彩色增强,假彩色增强,伪彩色增强;