数字图像处理1--图像增强技术

我们从这一节开始进入数字图像处理的大门。预备知识后序补充。图像处理可以有多种分类,其中图像增强和图像复原可以看作是一组相反的过程,这篇主要是概括图像增强技术。那么,增强技术也可以有多种分类,如,可以分为平滑(抑制高频成分)与锐化(增强高频成分),空间域与频域。我们把以第二种为例,分开解释两种技术,并进行对比。为了更加贴近实际操作,我将主讲算法。

空间域图像增强

基于空域的算法分为点运算算法和邻域去噪算法。

简单来说,空间域增强就是指增强构成图像的像素,是直接对这些像素进行操作的过程。而频域则是修改图像的傅立叶变换。

g(x, y) =T[f (x, y)]定义了空间域。

f(x,y)是原图像,g(x,y)是处理后的图像

T是作用于f的操作,定义在(x,y)的邻域

空间域增强的简化形式(灰度级变换函数,又称强度映射):s =T(r)

r是f(x,y)在任意点(x,y)的灰度级,s是g(x,y)在任意点(x,y)的灰度级

1.点运算

点运算实际上是对图像的每个像素点的灰度值按一定的映射关系进行运算得到一副新图像的过程。点运算算法即灰度级校正、灰度变换和直方图处理等,目的或使图像成像均匀,或扩大图像动态范围,扩展对比度。

那我们先来看灰度变换中的常用算法:

1.1灰度变换

1.1.1图像反转

表达式:s = (L−1)−r

[0,L-1]为图像的灰度级。作用:倒转图像的灰度,适用于增强嵌入于图像暗色区域的白色或灰色细节,特别是当黑色面积占主导地位时。


1.1.2.对数变换

表达式:s = c*log(1+ r)

c是常数,r ≥ 0。

此种变换使一窄带低灰度输入图像值映射为一宽带输出值。有时原图的动态范围太大,超出某些显示设备的允许动态范围,如直接使用原图,则一部分细节可能丢失,解决办法是对原图进行灰度压缩,如对数变换,可应用在傅立叶频谱。


1.1.3.幂次变换

表达式: 

 c和γ正常数

γ <1 提高灰度级,在正比函数上方,使图像变亮                  

γ >1 降低灰度级,在正比函数下方,使图像变暗

c=γ=1时简化为正比变换。




1.1.4.对比拉伸

主要思想是提高图像处理时灰度级的动态范围(待深究)


1.1.5.灰度切割

提高特定灰度范围的亮度。两种基本方法:一是在所关心的范围内为所有的灰度指定一个较高值,而为其他灰度指定一个较低值。第二种使所需的范围的灰度变亮,但是保持了图像的背景和灰度色调。



1.1.6.位图切割

假设图像中每个像素的灰度级是256,这可以用8位来表示,假设图像是由8个位平面组成,范围从位平面0到位平面7。其中,位平面0包含图像中像素的最低位,位平面7包含像素的最高位。

 这种方法通过对特定位提高亮度,改善图像质量。

  较高位(如前4位)包含大多数视觉重要数据。

  较低位(如后4位)对图像中的微小细节有作用。

 分解为位平面,可以分析每一位在图像中的相对重要性。




1.2直方图处理

直方图是多种空间域处理的基础,我们把它提到与灰度级变换相同的高度,接下来一起学习。

1.2.1.直方图两种定义:

一个灰度级在范围[0,L-1]的数字图像的直方图是一个离散函数  h(rk)= nk

nk是图像中灰度级为rk的像素个数

rk 是第k个灰度级,k = 0,1,2,…,L-1

由于rk的增量是1,直方图可表示为:

p(k)= nk

即,图像中不同灰度级像素出现的次数


一个灰度级在范围[0,L-1]的数字图像的直方图是一个离散函数 p(rk)= nk /n

n 是图像的像素总数

nk是图像中灰度级为rk的像素个数

rk是第k个灰度级,k = 0,1,2,…,L-1


1.2.2.直方图分析

若一幅图像的像素占有全部可能的灰度级并且分布均匀,则这样的图像有高对比度和多变的灰度色调。低灰度级图像的直方图窄而集中于灰度级的中部。在偏暗图像中,直方图的组成成分集中在灰度级低(暗)的一侧,类似的,明亮图像的直方图则倾向于灰度级高的一侧。较基础,这里不给出图像显示。


1.2.3.直方图均衡化(待补充)

../../../../../_images/Histogram_Equalization_Theory_0.jpg

直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法.说得更清楚一些, 以上面的直方图为例, 你可以看到像素主要集中在中间的一些强度值上. 直方图均衡化要做的就是拉伸这个范围. 见下面左图: 绿圈圈出了 少有像素分布其上的 强度值. 对其应用均衡化后, 得到了中间图所示的直方图. 均衡化的图像见下面右图.

../../../../../_images/Histogram_Equalization_Theory_1.jpg均衡化指的是把一个分布 (给定的直方图) 映射 到另一个分布 (一个更宽更统一的强度值分布), 所以强度值分布会在整个范围内展开.

要想实现均衡化的效果, 映射函数应该是一个累积分布函数 (cdf) (更多细节, 参考*学习OpenCV*). 对于直方图 H(i), 它的 累积分布 H^{'}(i) 是:

H^{'}(i) = \sum_{0 \le j < i} H(j)

要使用其作为映射函数, 我们必须对最大值为255 (或者用图像的最大强度值) 的累积分布 H^{'}(i) 进行归一化. 同上例, 累积分布函数为:

  • ../../../../../_images/Histogram_Equalization_Theory_2.jpg
  • 最后, 我们使用一个简单的映射过程来获得均衡化后像素的强度值:
  • equalized( x, y ) = H^{'}( src(x,y) )

2.邻域去噪

邻域增强算法分为图像平滑和锐化两种。平滑一般用于消除图像噪声,但是也容易引起边缘的模糊。常用算法有均值滤波、中值滤波、最大值滤波等。锐化的目的在于突出物体的边缘轮廓,便于目标识别。常用算法有梯度算子、高通滤波、掩模匹配法、统计差值法。拉普拉斯算子等。
可以说,邻域处理工作是操作邻域的图像像素值以及相应的与邻域有关维数的子图像的值。这些子图像可称为滤波器,掩模,核,模板或窗口。在滤波器子图像中的值是系数值,而不是像素值。滤波的概念来源于在频域对信号进行处理的傅立叶变换,这在后文提到。空间滤波其实有别于传统的频域滤波处理。
空间滤波原理:
空间滤波的处理起始就是在待处理图像中逐点地移动掩模。 模板本身被称为 空间滤波器 空间模板 即M×N图像的m×n子图像)

在M×N的图像f上,使用m×n的滤波器掩模进行线性滤波由下式给出:

 

其中,m=2a+1,n=2b+1,w(s,t)是滤波器系数,f(x,y)是图像值,要完整图像的处理,必须取x=0,1,2。。。M-1,y=0,1,2......N-1

上式与频域中卷积处理很相似,故线性空间滤波处理经常称为“掩模与图像的卷积”。

空间滤波的简化形式:


其中,w是滤波器系数,z是与该系数对应的图像灰度值,mn为滤波器中包含的像素点总数。

非线性空间滤波处理也是基于邻域处理,且掩模滑过的机理一样。

我们需要考虑滤波中心靠近图像轮廓时发生的情况。需要将掩模中心点的移动范围限制在距离图像边缘不小于(n-1)/2个像素点处,这是最佳方法。还可以用全部包含于图像中的掩模部分滤波所有像素。


2.1.平滑滤波器

主要用于模糊处理(去除图像中一些不重要的细节)和 减小噪声。

2.1.1线性滤波器:均值滤波器

包含在滤波器邻域内像素的平均值,也称为均值滤波器

作用:减小图像灰度的“尖锐”变化,减小噪声

由于图像边缘是由图像灰度尖锐变化引起的,所以也存在边缘模糊的问题

 

图a是标准的像素平均值(滤波系数均为1)

图b是像素的加权平均,表明一些像素更为重要。(重要的像素系数大,系数之和为16)

加权均值滤波过程公式为:



2.1.2非线性滤波器:统计排序滤波器(中值滤波器最有代表性)

 统计排序滤波器基于滤波器所在图像区域中像素的排序,由排序结果决定的值代替中心像素的值

分类

 中值滤波器: 用像素领域内的中间值代替该像素

 最大值滤波器:用像素领域内的最大值代替该像素

 最小值滤波器:用像素领域内的最小值代替该像素


中值滤波器

 主要用途:去除噪声

 计算公式:R = mid {zk | k = 1,2,…,n}

 

 最大值滤波器

 主要用途:寻找最亮点

 计算公式:R = max {zk | k = 1,2,…,n}

 

 最小值滤波器

 主要用途:寻找最暗点

 计算公式:R = min {zk | k = 1,2,…,n}

 

由于中值滤波使用普遍,我们再次对中值滤波进行详解。它处理脉冲噪声(椒盐噪声)非常有效。

 中值滤波的原理

 像素由小到大排列,用模板区域内像素的中间值,作为结果值。

例如3×3的领域内有像素(10,20,20,20,15,20,20,25,100),排序后为(10,15,20,20,20,20,20,25,100),中值为20.

R = mid {zk | k = 1,2,…,n}

    强迫突出的亮点(暗点)更象它周围的值,以消除孤立的亮点(暗点)

 

中值滤波算法的特点

在去除噪音的同时,可以比较好地保留边的锐度和图像的细节(优于均值滤波器)

能够有效去除脉冲噪声:以黑白点叠加在图像上。



2.2.锐化滤波器

作用:突出图像中的细节,增强被模糊了的细节。印刷中的细微层次强调。弥补扫描对图像的钝化,超声探测成像,分辨率低,边缘模糊,通过锐化来改善。图像识别中,分割前的边缘提取。锐化处理恢复过度钝化、暴光不足的图像。

锐化处理可以用空间微分来完成。我们将讨论数字微分锐化的定义极其算子。微分算子的相应强度与图像在该点(应用了算子)的突变程度有关。这样,图像微分增强了边缘和其他突变(如噪声)并削弱了灰度变换缓慢的区域。

微分滤波器的原理:

均值产生钝化的效果,而均值与积分相似,由此而联想到,微分能不能产生相反的效果,即锐化的效果?结论是肯定的。 

在图像处理中应用微分最常用的方法是计算梯度。函数f(x,y)在(x,y)处的梯度为一个向量:


对于一元函数f(x)表达一阶微分的定义是一个差值:


类似用差分定义二阶微分:


锐化滤波器的分类

 二阶微分滤波器-拉普拉斯算子

 一阶微分滤波器-梯度算子

 

2.2.1拉普拉斯算子

图像函数的拉普拉斯变换定义为



拉普拉斯变换对图像增强的基本方法


(1)用于拉普拉斯模板中心系数为负

(1)用于拉普拉斯模板中心系数为正


拉普拉斯算子


2.2.2梯度算子

梯度通过一个二维列向量来定义

 

向量的模值


考虑一个3x3的图像区域,z代表灰度级,上式在点z5的∇f值可用 



 

向量模值的近似计算       

用绝对值替换平方和平方根有:


 微分过滤器的原理

∇f ≈ |z6 – z5| + |z8 – z5|

另外一种计算方法是使用交叉差:

∇f ≈ [(z9 – z5)2 + (z8 – z6)2]1/2

≈ |z9 – z5| + |z8 – z6|

微分滤波器模板系数设计

Roberts交叉梯度算子

Prewitt梯度算子

Sobel梯度算子


 



频域图像增强

1.频域傅立叶变换和拉普拉斯算子

2.平滑滤波器

2.1理想低通

2.2巴特沃思

2.3高斯滤波器

3.锐化滤波器

3.1理想高通

3.2巴特沃思

3.3高斯型







  • 6
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
图像的增强/////////////////////////////////直方图对话框构造函数; ZFT::ZFT(CWnd* pParent /*=NULL*/) : CDialog(ZFT::IDD, pParent)//ZFT为定义的用来显示直方图的对话框类; {  Width=Height=0;//对话框初始化阶段设置图像的宽和高为"0"; } ////////////////////////对话框重画函数; void ZFT::OnPaint() {  CRect rect;//矩形区域对象;  CWnd *pWnd;//得到图片框的窗口指针;  pWnd=GetDlgItem(IDC_Graphic);//得到ZFT对话框内的"Frame"控件的指针;  file://(IDC_Graphic为放置在对话框上的一个"Picture"控件,并讲类型设置为"Frame")。  pWnd->GetClientRect(&rect);//得到"Frame"控件窗口的"视"区域;  int i;  CPaintDC dc(pWnd);//得到"Frame"控件的设备上下文;  file://画直方图的x、y轴;  dc.MoveTo(0,rect.Height());  dc.LineTo(rect.Width(),rect.Height());  dc.MoveTo(0,rect.Height());  dc.LineTo(0,0);  file://画直方图,num[]是"ZFT"的内部数组变量,存放的是图像各个灰度级出现的概率;该数组的各个分量在  显示具体图像的直方图时设置;  for(i=0;i<256;i++)//根据图像上的各个灰度级出现的概率,在坐标上对应的画出一根直线,从而各个表示各灰度级出现概率的直线构成了图像的直方图;  {   dc.MoveTo(i+1,rect.Height());   dc.LineTo (i+1,(rect.Height()-rect.Height()*num[i]*30));   file://此处num分量乘以"30"是为了放大个灰度级上对应的出现概率直线,增强显示效果;  } } //////////////////////////////////////////////////////// void ZFT::OnMouseMove(UINT nFlags, CPoint point) {//OnMouseMove函数处理鼠标消息,显示当前鼠标所在直方图上的灰度值等信息;  CWnd *pWnd,*pWndText;//定义两个窗口对象;  CPoint point1;//定义个一个点对象;  point1=point;//存放当前鼠标的位置信息;  CRect rect;//矩形对象;  CString string ;//字符串对象;  pWnd=GetDlgItem(IDC_Graphic);//得到显示直方图的框架窗口对象指针;  pWndText=GetDlgItem(IDC_NUM);//得到指向文本框对象(IDC_NUM)窗口的指针;  pWnd->GetWindowRect(&rect);//获取pWnd窗口对象窗口区域位置;  file://屏幕坐标转换为客户区坐标;  ScreenToClient(&rect);  file://判断当前鼠标是否指在直方图内;  if(rect.PtInRect (point))  {   int x=point1.x-rect.left;   file://当前鼠标位置减去区域的起始位置恰好为当前鼠标所指位置所表示的灰度级;   string.Format("%d",x);   file://显示当前位置对应的图像的灰度级;   pWndText->SetWindowText((LPCTSTR)string);  }  CDialog::OnMouseMove(nFlags, point); } //////////////////////////////////////// void CDibView::OnImagehorgm() file://在程序的"视"类对象内处理显示图像直方图的函数; {  CDibDoc *pDoc=GetDocument();  HDIB hdib;  hdib=pDoc->GetHDIB();  BITMAPINFOHEADER *lpDIBHdr;//位图信息头结构指针;  BYTE *lpDIBBits;//指向位图像素灰度值的指针;  lpDIBHdr=( BITMAPINFOHEADER *)GlobalLock(hdib);//得到图像的位图头信息  lpDIBBits=(BYTE*)lpDIBHdr+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);  file://获取图像像素值  ZFT dialog;//直方图对话框模板对象;  int i,j;  int wImgWidth=lpDIBHdr->biWidth;  int wImgHeight=lpDIBHdr->biHeight;  file://a[]数组用来存放各个灰度级出现的概率;  float a[256];  for(i=0;i<256;i++)//初始化数组;  {     a[i]=0;  }  file://统计各个灰度级出现的次数;  for(i=0;i<wimgheight;i++)  {   for(j=0;j<wimgwidth;j++)   {    a[*(lpDIBBits+WIDTHBYTES(wImgWidth*8)*i+j)]++;   }   file://统计各个灰度级出现的概率;   for(i=0;i<256;i++)   {    a[i]=a[i]/(wImgHeight*wImgWidth);//得到每个灰度级的出现概率;    memcpy(dialog.num,a,256*sizeof(float));   }  }   dialog.DoModal();//显示直方图对话框;  }  return; } </wimgwidth;j++) </wimgheight;i++)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值