图像处理——图像的增强技术

图像增强的主要目的是提高图像的质量和可辨识度,使图像更有利于观察或进一步分析处理。图像增强技术一般通过对图像的某些特征,例如边缘信息、轮廓信息和对比度等进行突出或增强,从而更好的显示图像的有用信息,提高图像的使用价值。图像增强技术是在一定标准下,处理后的图像比原图像效果更好。
图像增强按作用域可分为空域内处理和频域内处理,空域内处理是直接对图像进行处理,频域内处理是在图像的某个变换域内,对图像的变换系数进行运算,然后通过逆变换获得图像增强效果。

1 空域内处理

空域内的图像增强就是调整灰度图像的明暗对比度,是对图像中各个像素的灰度值直接进行处理。常用的方法包括灰度变换增强和直方图增强。下面分别进行介绍。

1.1 灰度变换增强

灰度变换增强是在空间域内对图像进行增强的一种简单而有效的方法。灰度变换增强不改变原图像中像素的位置,只改变像素点的灰度值,并逐点进行,和周围的其他像素点无关。为了进行灰度变换,首先需要获取图像的直方图。在MATLAB中,可以通过编写程序获取灰度图像的直方图,也可以通过函数imhist( )获取灰度图像的直方图。

clear all; close all;
I=imread('pout.tif');
row=size(I,1); %返回矩阵I的行数
column=size(I,2);    %返回矩阵I的列数
N=zeros(1, 256);  %灰度图像大小范围是0-255,因此灰度级是256for i=1:row
    for j=1:column
        k=I(i, j);
        N(k+1)=N(k+1)+1;
    end
end
figure;
subplot(121);
imshow(I);
subplot(122);
bar(N);

或者直接用函数imhist( )也可以的。

clear all; close all;
I=imread('pout.tif');
N = imhist(I);
figure;
subplot(121);
imshow(I);
subplot(122);
bar(N);

在这里插入图片描述
对直方图进行处理。

clear all; close all;
I=imread('pout.tif');
I=double(I);
J=(I-80)*255/70; %图像不太清晰,对灰度图像的范围进行调整
row=size(I,1);
column=size(I,2);
for i=1:row
    for j=1:column
        if J(i, j)<0  %对灰度图中的小于0的像素设为0
            J(i, j)=0;
        end
        if J(i, j)>255;   %%对灰度图中的大于255的像素设为255
            J(i, j)=255;
        end
    end
end
figure;
subplot(121);
imshow(uint8(I));
subplot(122);
imshow(uint8(J));

在这里插入图片描述

1.2直方图增强

图像的灰度直方图表示灰度图像中具有每种灰度的像素的个数,反映了图像中每种灰度级出现的频率,是图像的基本统计特征之一。直方图均衡方法因为其有效性和简单性己成为图像对比度增强的最常用方法。其基本思想是根据输入图像的灰度概率分布来确定其对应的输出灰度值,通过扩展图像的动态范围达到提升图像对比度的目的。
直方图增强是以概率论为基础,常用的直方图调整方法包括直方图均衡化和直方图规定化两方面。
直接用函数imhist( )获得图像的直方图。

clear all; close all;
I=imread('pout.tif');
N = imhist(I);
figure;
subplot(121);
imshow(I);
subplot(122);
bar(N);

或者用这种方法获得RGB的灰度直方图。

clear all; close all;
I=imread('onion.png');
figure;
subplot(141);
imshow(uint8(I));
subplot(142);
imhist(I(:,:,1));
title('R');
subplot(143);
imhist(I(:,:,2));
title('G');
subplot(144);
imhist(I(:,:,3));
title('B');

在这里插入图片描述

1.2.1 直方图的均衡化

利用histeq()函数进行直方图的均衡化。

clear all; close all;
I=imread('tire.tif');
J=histeq(I);
figure;
subplot(121);
imshow(uint8(I));
subplot(122);
imshow(uint8(J));
figure;
subplot(121);
imhist(I, 64);
subplot(122);
imhist(J, 64);

在这里插入图片描述

1.2.2 直方图规定化

使得图像变成自己想要的样子。

clear all; close all;
I=imread('tire.tif');
hgram=ones(1, 256);
J=histeq(I, hgram);  %其中,f为输入图像,hispec为指定的直方图(一个由指定值构成的行向量),g为输出图像,其直方图近似于指定的直方图
figure;
subplot(121);
imshow(uint8(J));
subplot(122);
imhist(J);

在这里插入图片描述

2 图像标准差

2.1 mean2() 图像平均值

像素均值:
就是把所有通道(R、G、B)的像素求了均值。
去均值的作用:
把图片上每个位置的值减去均值,可以一定程度上移除它们共同的部分,凸显个性的部分,更有利于图片的处理。下图可以很明显看出去均值后的变化。
在这里插入图片描述

clear all; close all;
I=imread('onion.png');
J=rgb2gray(I);
gray=mean2(J)  %mean2() 即对整一个矩阵求像素平均值
rgb=mean2(I)
r=mean2(I(:, :, 1))  %获取三个颜色分量的平均值
g=mean2(I(:, :, 2))
b=mean2(I(:, :, 3))
figure;
subplot(121);
imshow(uint8(I));
subplot(122);
imshow(uint8(J));

2.2 std(2)求图像标准差

采用函数std( )计算向量的标准差,通过函数std2( )计算矩阵的标准差。

clear all; close all;
I=imread('pout.tif');
s1=std2(I)
J=histeq(I); %获取直方图
s2=std2(J)

在这里插入图片描述

2.3 medfilt2()中值滤波函数,corr2(I, J)求两个矩阵的相似程度,图像的相关系数

clear all; close all;
I=imread('pout.tif'); %获取灰度图
J=medfilt2(I);  %求图像I的中值滤波
r=corr2(I, J)  %求两个矩阵的相似程度
figure;
subplot(121);
imshow(I);
subplot(122);
imshow(J);

在这里插入图片描述
在这里插入图片描述

2.4 imcontour(J,3)函数,绘制图像等高线

通过函数imcontour( )可以绘制灰度图像的等高线。该函数的简单调用格式为:
imcontour(I):该函数中I为灰度图像的二维数据矩阵,绘制灰度图像的等高线。imcontour(I, n):该函数设置等高线的条数为n,如果不指定n,该函数会自动选取n。

clear all; close all;
I=imread('peppers.png');
J=rgb2gray(I);
figure;
subplot(121);
imshow(J);
subplot(122);
imcontour(J,3);

在这里插入图片描述

3 图像滤波

空域滤波是空域图像增强的常用方法。空域滤波是对图像中每个像素为中心的邻域进行一系列的运算,然后将得到的结果代替原来的像素值。空域滤波分为线性空域滤波和非线性空域滤波。下面分别进行介绍。
空域滤波是在图像空间中借助模板对图像进行领域操作,处理图像每一个像素的取值都是根据模板对输入像素相应领域内的像素值进行计算得到的。空域滤波基本上是让图像在频域空间内某个范围的分量受到抑制,同时保证其他分量不变,从而改变输出图像的频率分布,达到增强图像的目的。
imnoise() 给图像添加噪声
在这里插入图片描述

3.1线性平均滤波是一种最常用的线性空域滤波。

线性平均滤波实际是一种低通滤波,信号的低频部分通过,阻止高频部分通过。由于图像的边缘处于高频部分,因此线性平均滤波后,会造成图像边缘的模糊。
在进行线性平均滤波时,常用的模板大小为3×3,如下所示:
在这里插入图片描述
imfilter函数的用法
函数用法

clear all; close all;
I=imread('coins.png');
J=imnoise(I, 'salt & pepper', 0.02);  %用椒盐噪声污染图像I,噪声密度为0.02
h=ones(3,3)/5;    %带入常用模板
h(1,1)=0;   h(1,3)=0;
h(3,1)=0;   h(1,3)=0;
K=imfilter(J, h);  %J为输入图像,h为滤波掩模矩阵,k为滤波后图像。
figure;
subplot(131);
imshow(I);
subplot(132);
imshow(J);
subplot(133);
imshow(K);

如图
另外一种线性空域滤波处理方式

clear all; close all;
I=imread('rice.png');
I=im2double(I);
J=imnoise(I, 'gaussian', 0, 0.01);  %用椒盐噪声污染图像I,均值为0,方差为0.01
h=ones(3,3)/9;     %用另外一种模板
K=conv2(J, h);    %采用卷积的方式进行平滑处理
figure;
subplot(131);
imshow(I);
subplot(132);
imshow(J);
subplot(133);
imshow(K);

在这里插入图片描述

3.2 非线性空域滤波

非线性空域滤波主要包括中值滤波、顺序统计滤波和自适应滤波等。中值滤波是一种保护边缘的非线性图像平滑方法,在图像增强中应用非常广泛。

3.2.1 中值滤波 medfilt2

下面首先介绍一维中值滤波,对于一维数据,按照从大到小的顺序进行排列,则:在这里插入图片描述

medfilt2二维中值滤波用于图像的增强。中值滤波可以去除图像中的椒盐噪声,平滑效果优于均值滤波,在抑制噪声的同时还能够保持图像的边缘清晰。在MATLAB软件中,采用函数medfilt2( )进行图像的二维中值滤波。
中值滤波是图像处理中的一个常用步骤,它对于斑点噪声(en:speckle noise)和椒盐噪声(en:salt-and-pepper noise)来说尤其有用。保存边缘的特性使它在不希望出现边缘模糊的场合也很有用。当要求在降低噪声的同时要求保持边缘,中值滤波较卷积有更好的效果。  在matlab中,medfilt2函数用于执行二维中值滤波,使用方法如下:
B = medfilt2(A, [m n]) ,B = medfilt2(A),B = medfilt2(A, ’indexed’, …)
其中[m n]表示邻域块的大小,默认值为[3 3]。b=medfilt2(a,[m,n]);b是中值滤波后的图象矩阵,a是原图矩阵,m和n是处理模版大小,默认3×3。

clear all; close all;
I=imread('coins.png'); %读入灰度图像
I=im2double(I);  %转换数据类型
J=imnoise(I, 'salt & pepper', 0.03);  %给其添加椒盐噪声
K=medfilt2(J);  %对其进行中值滤波
figure;
subplot(131);
imshow(I);
subplot(132);
imshow(J);
subplot(133);
imshow(K);

如图

3.2.2 ordfilt2函数,顺序统计滤波

ordfilt2函数
在MATLAB图像处理工具箱中提供的二维顺序统计量滤波函数。它的滤波概念是中值滤波的推广,中值滤波是对于给定的n个数值{al ,a2,…,an},将它们按大小顺序排列,取中间的那个值作为滤波器的输出。而在ordfilt2函数中的二维顺序统计量滤波将n个非零数值按小到大排序后处于第k个位置的元素作为滤波器的输出。
ordfilt2函数语法格式为:
B=ordfilt2(A,order,domain)
B=ordfilt2(A,order,domain,S)
B=ordfilt2(…,padopt)
第一种格式的功能是:对图像A作顺序统计滤波。参数A为输入图像矩阵,order为序号,domain为滤波窗口。即对图像A中大小为domain矩阵大小内的非零像素值进行升序排序,取第order个值作为输出像素值。
第二种格式的功能是:对图像A作顺序统计滤波,前面3个参数与第一种格式相同。S是与domain大小相同的矩阵,它的每一个元素值对应domain中非零值位置的加性偏置输出。
第三种格式的功能是:对图像A作顺序统计滤波,前面省略号代表上面二种格式的一种参数形式。padopt是控制图像A矩阵边界填充的形式,padopt默认设置为’zeros’,边界被填充为0像素值,设置为’symmetric’时,A对称地扩展边界。
B=ordfilt2(A13,ones(5,5)),在模板内的像素值都为非零时,相当于模板为5×5的中值滤波
B=ordfilt2(A,1,ones(5,5)),在模板内的像素值都为非零时,相当于5×5的最小值滤波
B=ordfilt2(A,25,ones(5,5)),在模板内的像素值都为非零时,相当于5×5的最大值滤波

clear all; close all;
I=imread('coins.png');
I=im2double(I); 
J1=ordfilt2(I, 1, true(5));  %对矩阵I进行滤波
J2=ordfilt2(I, 25, true(5));
figure;
subplot(131);
imshow(I);
subplot(132);
imshow(J1);
subplot(133);
imshow(J2);

如图

3.2.3 自适应滤波

wiener2函数估计每个像素的局部均值与方差,该函数用法如下:J=wiener2(I,[M N],noise),使用M×N大小邻域局部图像均值与偏差,采用像素式自适应滤波器对图像I进行滤波,加性噪声(高斯白噪声)功率假定为 noise。。[J,noise]=wiener2(I,[M N]),滤波前还有估计附加噪声的能量。

clear all; close all;
I=imread('coins.png');
I=im2double(I);
J=imnoise(I, 'gaussian', 0, 0.01);
K=wiener2(J, [5 5]);
figure;
subplot(131);
imshow(I);
subplot(132);
imshow(J);
subplot(133);
imshow(K);

在这里插入图片描述

4 频域滤波

频率域图像增强首先通过傅立叶变换将图像从空间域转换为频率域,然后在频率域内对图像进行处理,最后通过傅立叶反变换转换到空间域。频率域内的图像增强通常包括低通滤波、高通滤波和同态滤波等。

4.1 低通滤波

低通滤波器的功能是让低频率通过而滤掉或衰减高频,其作用是过滤掉包含在高频中的噪声。所以低通滤波的效果是图像的去噪声平滑增强,但同时也抑制了图像的边界,造成图像不同程度上的模糊。

clear all; close all;
I=imread('coins.png');  
I=im2double(I);  		
M=2*size(I,1);
N=2*size(I,2);
u=-M/2:(M/2-1);
v=-N/2:(N/2-1);
[U,V]=meshgrid(u, v);
D=sqrt(U.^2+V.^2);
D0=80;
H=double(D<=D0);
J=fftshift(fft2(I, size(H, 1), size(H, 2))); 
K=J.*H;
L=ifft2(ifftshift(K));
L=L(1:size(I,1), 1:size(I, 2));
figure;
subplot(121);
imshow(I);
subplot(122);
imshow(L);

4.2 高通滤波

4.3 同态滤波

  • 10
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
图像增强/////////////////////////////////直方图对话框构造函数; 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++)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值